PK!}|abilian/__init__.py# coding=utf-8 from __future__ import absolute_import, division, print_function from pkgutil import extend_path __path__ = extend_path(__path__, __name__) PK!|]űabilian/app.py# coding=utf-8 """Base Flask application class, used by tests or to be extended in real applications.""" from __future__ import absolute_import, division, print_function, \ unicode_literals import errno import importlib import logging import logging.config import os import warnings from functools import partial from itertools import chain, count from pathlib import Path from typing import Any, Callable, Dict, Text import jinja2 import sqlalchemy as sa import sqlalchemy.exc import yaml from flask import Blueprint, Flask, _request_ctx_stack, abort, \ appcontext_pushed, current_app, g, render_template, request, \ request_started from flask.config import ConfigAttribute from flask.helpers import locked_cached_property from flask_assets import Bundle from flask_assets import Environment as AssetsEnv from flask_babel import get_locale as babel_get_locale from flask_migrate import Migrate from flask_script import Manager as ScriptManager from pkg_resources import resource_filename from six import string_types, text_type from sqlalchemy.orm.attributes import NEVER_SET, NO_VALUE from werkzeug.utils import import_string import abilian.core.util import abilian.i18n from abilian.config import default_config from abilian.core import extensions, redis, signals from abilian.core.celery import FlaskCelery from abilian.services import activity_service, antivirus, audit_service, \ auth_service, conversion_service, index_service, preferences_service, \ repository_service, security_service, session_repository_service, \ settings_service, vocabularies_service from abilian.services.security import Anonymous from abilian.web import csrf from abilian.web.action import actions from abilian.web.admin import Admin from abilian.web.assets.filters import ClosureJS from abilian.web.blueprints import allow_access_for_roles from abilian.web.filters import init_filters from abilian.web.nav import BreadcrumbItem from abilian.web.util import send_file_from_directory, url_for from abilian.web.views import Registry as ViewRegistry from abilian.web.views.images import user_photo_url logger = logging.getLogger(__name__) db = extensions.db __all__ = ["create_app", "Application", "ServiceManager"] # Silence those warnings for now. warnings.simplefilter("ignore", category=sa.exc.SAWarning) class ServiceManager(object): """Mixin that provides lifecycle (register/start/stop) support for services.""" def __init__(self): self.services = {} def start_services(self): for svc in self.services.values(): svc.start() def stop_services(self): for svc in self.services.values(): svc.stop() class PluginManager(object): """Mixin that provides support for loading plugins.""" def register_plugin(self, name): """Load and register a plugin given its package name.""" logger.info("Registering plugin: " + name) module = importlib.import_module(name) module.register_plugin(self) class AssetManagerMixin(Flask): def init_assets(self): js_filters = ("closure_js",) if self.config.get("PRODUCTION", False) else None # js_filters = None self._assets_bundles = { "css": { "options": { "filters": ("less", "cssmin"), "output": "style-%(version)s.min.css", } }, "js-top": { "options": {"output": "top-%(version)s.min.js", "filters": js_filters} }, "js": { "options": {"output": "app-%(version)s.min.js", "filters": js_filters} }, } # bundles for JS translations languages = self.config["BABEL_ACCEPT_LANGUAGES"] for lang in languages: code = "js-i18n-" + lang filename = "lang-" + lang + "-%(version)s.min.js" self._assets_bundles[code] = { "options": {"output": filename, "filters": js_filters} } def _setup_asset_extension(self): assets = self.extensions["webassets"] = AssetsEnv(self) assets.debug = not self.config.get("PRODUCTION", False) assets.requirejs_config = {"waitSeconds": 90, "shim": {}, "paths": {}} assets_base_dir = Path(self.instance_path, "webassets") assets_dir = assets_base_dir / "compiled" assets_cache_dir = assets_base_dir / "cache" for path in (assets_base_dir, assets_dir, assets_cache_dir): if not path.exists(): path.mkdir() assets.directory = str(assets_dir) assets.cache = str(assets_cache_dir) manifest_file = assets_base_dir / "manifest.json" assets.manifest = "json:{}".format(manifest_file) # set up load_path for application static dir. This is required # since we are setting Environment.load_path for other assets # (like core_bundle below), # in this case Flask-Assets uses webasssets resolvers instead of # Flask's one assets.append_path(self.static_folder, self.static_url_path) # filters options less_args = ["-ru"] assets.config["less_extra_args"] = less_args assets.config["less_as_output"] = True if assets.debug: assets.config["less_source_map_file"] = "style.map" # setup static url for our assets from abilian.web import assets as core_bundles core_bundles.init_app(self) # static minified are here assets.url = self.static_url_path + "/min" assets.append_path(str(assets_dir), assets.url) self.add_static_url( "min", str(assets_dir), endpoint="webassets_static", roles=Anonymous ) def _finalize_assets_setup(self): assets = self.extensions["webassets"] assets_dir = Path(assets.directory) closure_base_args = [ "--jscomp_warning", "internetExplorerChecks", "--source_map_format", "V3", "--create_source_map", ] for name, data in self._assets_bundles.items(): bundles = data.get("bundles", []) options = data.get("options", {}) # type: Dict[Text, Any] filters = options.get("filters") or [] options["filters"] = [] for f in filters: if f == "closure_js": js_map_file = str(assets_dir / "{}.map".format(name)) f = ClosureJS(extra_args=closure_base_args + [js_map_file]) options["filters"].append(f) if not options["filters"]: options["filters"] = None if bundles: assets.register(name, Bundle(*bundles, **options)) def register_asset(self, type_, *assets): """Register webassets bundle to be served on all pages. :param type_: `"css"`, `"js-top"` or `"js""`. :param assets: a path to file, a :ref:`webassets.Bundle ` instance or a callable that returns a :ref:`webassets.Bundle ` instance. :raises KeyError: if `type_` is not supported. """ supported = list(self._assets_bundles.keys()) if type_ not in supported: msg = "Invalid type: {}. Valid types: {}".format( repr(type_), ", ".join(sorted(supported)) ) raise KeyError(msg) for asset in assets: if not isinstance(asset, Bundle) and callable(asset): asset = asset() self._assets_bundles[type_].setdefault("bundles", []).append(asset) def register_i18n_js(self, *paths): """Register templates path translations files, like `select2/select2_locale_{lang}.js`. Only existing files are registered. """ languages = self.config["BABEL_ACCEPT_LANGUAGES"] assets = self.extensions["webassets"] for path in paths: for lang in languages: filename = path.format(lang=lang) try: assets.resolver.search_for_source(assets, filename) except IOError: pass # logger.debug('i18n JS not found, skipped: "%s"', filename) else: self.register_asset("js-i18n-" + lang, filename) def _register_base_assets(self): """Register assets needed by Abilian. This is done in a separate method in order to allow applications to redefine it at will. """ from abilian.web import assets as bundles self.register_asset("css", bundles.LESS) self.register_asset("js-top", bundles.TOP_JS) self.register_asset("js", bundles.JS) self.register_i18n_js(*bundles.JS_I18N) class ErrorManagerMixin(Flask): def setup_logging(self): # Force flask to create application logger before logging # configuration; else, flask will overwrite our settings self.logger # noqa log_level = self.config.get("LOG_LEVEL") if log_level: self.logger.setLevel(log_level) logging_file = self.config.get("LOGGING_CONFIG_FILE") if logging_file: logging_file = (Path(self.instance_path) / logging_file).resolve() else: logging_file = Path(resource_filename(__name__, "default_logging.yml")) if logging_file.suffix == ".ini": # old standard 'ini' file config logging.config.fileConfig( text_type(logging_file), disable_existing_loggers=False ) elif logging_file.suffix == ".yml": # yaml config file logging_cfg = yaml.safe_load(logging_file.open()) logging_cfg.setdefault("version", 1) logging_cfg.setdefault("disable_existing_loggers", False) logging.config.dictConfig(logging_cfg) def init_debug_toolbar(self): if ( not self.testing and self.config.get("DEBUG_TB_ENABLED") and "debugtoolbar" not in self.blueprints ): try: from flask_debugtoolbar import DebugToolbarExtension except ImportError: logger.warning( "DEBUG_TB_ENABLED is on but flask_debugtoolbar " "is not installed." ) else: dbt = DebugToolbarExtension() default_config = dbt._default_config(self) init_dbt = dbt.init_app if "DEBUG_TB_PANELS" not in self.config: # add our panels to default ones self.config["DEBUG_TB_PANELS"] = list( default_config["DEBUG_TB_PANELS"] ) init_dbt(self) for view_name in self.view_functions: if view_name.startswith("debugtoolbar."): extensions.csrf.exempt(self.view_functions[view_name]) def handle_user_exception(self, e): # If session.transaction._parent is None, then exception has occured in # after_commit(): doing a rollback() raises an error and would hide # actual error. session = db.session() if session.is_active and session.transaction._parent is not None: # Inconditionally forget all DB changes, and ensure clean session # during exception handling. session.rollback() else: self._remove_session_save_objects() return Flask.handle_user_exception(self, e) def handle_exception(self, e): session = db.session() if not session.is_active: # Something happened in error handlers and session is not usable # anymore. self._remove_session_save_objects() return Flask.handle_exception(self, e) def _remove_session_save_objects(self): """Used during exception handling in case we need to remove() session: keep instances and merge them in the new session. """ if self.testing: return # Before destroying the session, get all instances to be attached to the # new session. Without this, we get DetachedInstance errors, like when # tryin to get user's attribute in the error page... old_session = db.session() g_objs = [] for key in iter(g): obj = getattr(g, key) if isinstance(obj, db.Model) and sa.orm.object_session(obj) in ( None, old_session, ): g_objs.append((key, obj, obj in old_session.dirty)) db.session.remove() session = db.session() for key, obj, load in g_objs: # replace obj instance in bad session by new instance in fresh # session setattr(g, key, session.merge(obj, load=load)) # refresh `current_user` user = getattr(_request_ctx_stack.top, "user", None) if user is not None and isinstance(user, db.Model): _request_ctx_stack.top.user = session.merge(user, load=load) def log_exception(self, exc_info): """Log exception only if sentry is not installed (this avoids getting error twice in sentry).""" if "sentry" not in self.extensions: super(ErrorManagerMixin, self).log_exception(exc_info) def init_sentry(self): """Install Sentry handler if config defines 'SENTRY_DSN'.""" if self.config.get("SENTRY_DSN"): try: from abilian.core.sentry import Sentry except ImportError: logger.error( 'SENTRY_DSN is defined in config but package "raven" ' "is not installed." ) return ext = Sentry(self, logging=True, level=logging.ERROR) ext.client.tags["app_name"] = self.name ext.client.tags["process_type"] = "web" server_name = str(self.config.get("SERVER_NAME")) ext.client.tags["configured_server_name"] = server_name def install_default_handlers(self): for http_error_code in (403, 404, 500): self.install_default_handler(http_error_code) def install_default_handler(self, http_error_code): """Install a default error handler for `http_error_code`. The default error handler renders a template named error404.html for http_error_code 404. """ logger.debug( "Set Default HTTP error handler for status code %d", http_error_code ) handler = partial(self.handle_http_error, http_error_code) self.errorhandler(http_error_code)(handler) def handle_http_error(self, code, error): """Helper that renders `error{code}.html`. Convenient way to use it:: from functools import partial handler = partial(app.handle_http_error, code) app.errorhandler(code)(handler) """ # 5xx code: error on server side if (code // 100) == 5: # ensure rollback if needed, else error page may # have an error, too, resulting in raw 500 page :-( db.session.rollback() template = "error{:d}.html".format(code) return render_template(template, error=error), code class JinjaManagerMixin(Flask): def __init__(self): self._jinja_loaders = [] # # Templating and context injection setup # def create_jinja_environment(self): env = Flask.create_jinja_environment(self) env.globals.update( app=current_app, csrf=csrf, get_locale=babel_get_locale, local_dt=abilian.core.util.local_dt, _n=abilian.i18n._n, url_for=url_for, user_photo_url=user_photo_url, NO_VALUE=NO_VALUE, NEVER_SET=NEVER_SET, ) init_filters(env) return env @property def jinja_options(self): options = dict(Flask.jinja_options) extensions = options.setdefault("extensions", []) ext = "abilian.core.jinjaext.DeferredJSExtension" if ext not in extensions: extensions.append(ext) if "bytecode_cache" not in options: cache_dir = Path(self.instance_path, "cache", "jinja") if not cache_dir.exists(): cache_dir.mkdir(0o775, parents=True) options["bytecode_cache"] = jinja2.FileSystemBytecodeCache( str(cache_dir), "%s.cache" ) if self.config.get("DEBUG", False) and self.config.get("TEMPLATE_DEBUG", False): options["undefined"] = jinja2.StrictUndefined return options def register_jinja_loaders(self, *loaders): """Register one or many `jinja2.Loader` instances for templates lookup. During application initialization plugins can register a loader so that their templates are available to jinja2 renderer. Order of registration matters: last registered is first looked up (after standard Flask lookup in app template folder). This allows a plugin to override templates provided by others, or by base application. The application can override any template from any plugins from its template folder (See `Flask.Application.template_folder`). :raise: `ValueError` if a template has already been rendered """ if not hasattr(self, "_jinja_loaders"): raise ValueError( "Cannot register new jinja loaders after first template rendered" ) self._jinja_loaders.extend(loaders) @locked_cached_property def jinja_loader(self): """Search templates in custom app templates dir (default Flask behaviour), fallback on abilian templates.""" loaders = self._jinja_loaders del self._jinja_loaders loaders.append(Flask.jinja_loader.func(self)) loaders.reverse() return jinja2.ChoiceLoader(loaders) class Application( ServiceManager, PluginManager, AssetManagerMixin, ErrorManagerMixin, JinjaManagerMixin, Flask, ): """Base application class. Extend it in your own app. """ default_config = default_config #: Custom apps may want to always load some plugins: list them here. APP_PLUGINS = ( "abilian.web.search", "abilian.web.tags", "abilian.web.comments", "abilian.web.uploads", "abilian.web.attachments", ) #: Environment variable used to locate a config file to load last (after #: instance config file). Use this if you want to override some settings #: on a configured instance. CONFIG_ENVVAR = "ABILIAN_CONFIG" #: True if application has a config file and can be considered configured #: for site. configured = ConfigAttribute("CONFIGURED") #: If True all views will require by default an authenticated user, unless #: Anonymous role is authorized. Static assets are always public. private_site = ConfigAttribute("PRIVATE_SITE") #: instance of :class:`.web.views.registry.Registry`. default_view = None # type: abilian.web.views.registry.Registry #: json serializable dict to land in Javascript under Abilian.api js_api = None #: :class:`flask_script.Manager` instance for shell commands of this app. #: defaults to `.commands.manager`, relative to app name. script_manager = ".commands.manager" #: celery app class celery_app_cls = FlaskCelery def __init__(self, name=None, config=None, *args, **kwargs): name = name or __name__ instance_path = os.environ.get("FLASK_INSTANCE_PATH") if instance_path: kwargs["instance_path"] = instance_path else: kwargs.setdefault("instance_relative_config", True) # used by make_config to determine if we try to load config from # instance / environment variable /... self._ABILIAN_INIT_TESTING_FLAG = ( getattr(config, "TESTING", False) if config else False ) Flask.__init__(self, name, *args, **kwargs) del self._ABILIAN_INIT_TESTING_FLAG self._setup_script_manager() appcontext_pushed.connect(self._install_id_generator) ServiceManager.__init__(self) PluginManager.__init__(self) JinjaManagerMixin.__init__(self) self.default_view = ViewRegistry() self.js_api = {} self.configure(config) # At this point we have loaded all external config files: # SQLALCHEMY_DATABASE_URI is definitively fixed (it cannot be defined in # database AFAICT), and LOGGING_FILE cannot be set in DB settings. self.setup_logging() configured = bool(self.config.get("SQLALCHEMY_DATABASE_URI")) self.config["CONFIGURED"] = configured if not self.testing: self.init_sentry() if not configured: # set fixed secret_key so that any unconfigured worker will use, # so that session can be used during setup even if # multiple processes are processing requests. self.config["SECRET_KEY"] = "abilian_setup_key" # time to load config bits from database: 'settings' # First init required stuff: db to make queries, and settings service extensions.db.init_app(self) settings_service.init_app(self) if configured: with self.app_context(): try: settings = self.services["settings"] config = settings.namespace("config").as_dict() except sa.exc.DatabaseError as exc: # We may get here if DB is not initialized and "settings" # table is missing. Command "initdb" must be run to # initialize db, but first we must pass app init. if not self.testing: # durint tests this message will show up on every test, # since db is always recreated logging.error(exc) db.session.rollback() else: self.config.update(config) if not self.config.get("FAVICO_URL"): self.config["FAVICO_URL"] = self.config.get("LOGO_URL") self.register_jinja_loaders(jinja2.PackageLoader("abilian.web")) self.init_assets() self.install_default_handlers() with self.app_context(): self.init_extensions() self.register_plugins() self.add_access_controller( "static", allow_access_for_roles(Anonymous), endpoint=True ) # debugtoolbar: this is needed to have it when not authenticated # on a private site. We cannot do this in init_debug_toolbar, # since auth service is not yet installed. self.add_access_controller( "debugtoolbar", allow_access_for_roles(Anonymous) ) self.add_access_controller( "_debug_toolbar.static", allow_access_for_roles(Anonymous), endpoint=True, ) self.maybe_register_setup_wizard() self._finalize_assets_setup() # At this point all models should have been imported: time to configure # mappers. Normally Sqlalchemy does it when needed but mappers may be # configured inside sa.orm.class_mapper() which hides a # misconfiguration: if a mapper is misconfigured its exception is # swallowed by class_mapper(model) results in this laconic # (and misleading) message: "model is not mapped" sa.orm.configure_mappers() signals.components_registered.send(self) self.before_first_request(self._set_current_celery_app) self.before_first_request(lambda: signals.register_js_api.send(self)) request_started.connect(self._setup_nav_and_breadcrumbs) # Initialize Abilian core services. # Must come after all entity classes have been declared. # Inherited from ServiceManager. Will need some configuration love # later. if not self.config.get("TESTING", False): with self.app_context(): self.start_services() if os.environ.get("FLASK_VALIDATE_HTML"): # Workaround circular import from abilian.testing.validation import validate_response self.after_request(validate_response) def configure(self, config): if config: self.config.from_object(config) languages = self.config["BABEL_ACCEPT_LANGUAGES"] languages = tuple( lang for lang in languages if lang in abilian.i18n.VALID_LANGUAGES_CODE ) self.config["BABEL_ACCEPT_LANGUAGES"] = languages def _setup_script_manager(self): manager = self.script_manager if manager is None or isinstance(manager, ScriptManager): return if isinstance(manager, string_types): manager = str(manager) if manager.startswith("."): manager = self.import_name + manager manager_import_path = manager manager = import_string(manager, silent=True) if manager is None: # fallback on abilian-core's logger.warning( "\n" + ("*" * 79) + "\n" "Could not find command manager at %r, " "using a default one\n" "Some commands might not be available\n" + ("*" * 79) + "\n", manager_import_path, ) from abilian.core.commands import setup_abilian_commands manager = ScriptManager() setup_abilian_commands(manager) self.script_manager = manager def _install_id_generator(self, sender, **kwargs): g.id_generator = count(start=1) def _set_current_celery_app(self): """Listener for `before_first_request`. Set our celery app as current, so that task use the correct config. Without that tasks may use their default set app. """ celery = self.extensions.get("celery") if celery: celery.set_current() def _setup_nav_and_breadcrumbs(self, app=None): """Listener for `request_started` event. If you want to customize first items of breadcrumbs, override :meth:`init_breadcrumbs` """ g.nav = {"active": None} # active section g.breadcrumb = [] self.init_breadcrumbs() def init_breadcrumbs(self): """Insert the first element in breadcrumbs. This happens during `request_started` event, which is triggered before any url_value_preprocessor and `before_request` handlers. """ g.breadcrumb.append(BreadcrumbItem(icon="home", url="/" + request.script_root)) def check_instance_folder(self, create=False): """Verify instance folder exists, is a directory, and has necessary permissions. :param:create: if `True`, creates directory hierarchy :raises: OSError with relevant errno if something is wrong. """ path = Path(self.instance_path) err = None eno = 0 if not path.exists(): if create: logger.info("Create instance folder: %s", path) path.mkdir(0o775, parents=True) else: err = "Instance folder does not exists" eno = errno.ENOENT elif not path.is_dir(): err = "Instance folder is not a directory" eno = errno.ENOTDIR elif not os.access(str(path), os.R_OK | os.W_OK | os.X_OK): err = 'Require "rwx" access rights, please verify permissions' eno = errno.EPERM if err: raise OSError(eno, err, str(path)) if not self.DATA_DIR.exists(): self.DATA_DIR.mkdir(0o775, parents=True) def make_config(self, instance_relative=False): config = Flask.make_config(self, instance_relative) if not config.get("SESSION_COOKIE_NAME"): config["SESSION_COOKIE_NAME"] = self.name + "-session" # during testing DATA_DIR is not created by instance app, # but we still need this attribute to be set self.DATA_DIR = Path(self.instance_path, "data") if self._ABILIAN_INIT_TESTING_FLAG: # testing: don't load any config file! return config if instance_relative: self.check_instance_folder(create=True) cfg_path = text_type(Path(config.root_path) / "config.py") logger.info('Try to load config: "%s"', cfg_path) try: config.from_pyfile(cfg_path, silent=False) except IOError: return config # If the env var specifies a configuration file, it must exist # (and execute with no exceptions) - we don't want the application # to run with an unprecised or insecure configuration. if self.CONFIG_ENVVAR in os.environ: config.from_envvar(self.CONFIG_ENVVAR, silent=False) if "WTF_CSRF_ENABLED" not in config: config["WTF_CSRF_ENABLED"] = config.get("CSRF_ENABLED", True) return config def init_extensions(self): """Initialize flask extensions, helpers and services.""" self.init_debug_toolbar() redis.Extension(self) extensions.mail.init_app(self) extensions.upstream_info.extension.init_app(self) actions.init_app(self) from abilian.core.jinjaext import DeferredJS DeferredJS(self) # auth_service installs a `before_request` handler (actually it's # flask-login). We want to authenticate user ASAP, so that sentry and # logs can report which user encountered any error happening later, # in particular in a before_request handler (like csrf validator) auth_service.init_app(self) # webassets self._setup_asset_extension() self._register_base_assets() # Babel (for i18n) babel = abilian.i18n.babel # Temporary (?) workaround babel.locale_selector_func = None babel.timezone_selector_func = None babel.init_app(self) babel.add_translations("wtforms", translations_dir="locale", domain="wtforms") babel.add_translations("abilian") babel.localeselector(abilian.i18n.localeselector) babel.timezoneselector(abilian.i18n.timezoneselector) # Flask-Migrate Migrate(self, db) # CSRF by default if self.config.get("CSRF_ENABLED"): extensions.csrf.init_app(self) self.extensions["csrf"] = extensions.csrf extensions.abilian_csrf.init_app(self) self.register_blueprint(csrf.blueprint) # images blueprint from .web.views.images import blueprint as images_bp self.register_blueprint(images_bp) # Abilian Core services security_service.init_app(self) repository_service.init_app(self) session_repository_service.init_app(self) audit_service.init_app(self) index_service.init_app(self) activity_service.init_app(self) preferences_service.init_app(self) conversion_service.init_app(self) vocabularies_service.init_app(self) antivirus.init_app(self) from .web.preferences.user import UserPreferencesPanel preferences_service.register_panel(UserPreferencesPanel(), self) from .web.coreviews import users self.register_blueprint(users.blueprint) # Admin interface Admin().init_app(self) # Celery async service # this allows all shared tasks to use this celery app if getattr(self, "celery_app_cls", None): celery_app = self.extensions["celery"] = self.celery_app_cls() # force reading celery conf now - default celery app will # also update our config with default settings celery_app.conf # noqa celery_app.set_default() # dev helper if self.debug: # during dev, one can go to /http_error/403 to see rendering of 403 http_error_pages = Blueprint("http_error_pages", __name__) @http_error_pages.route("/") def error_page(code): """Helper for development to show 403, 404, 500...""" abort(code) self.register_blueprint(http_error_pages, url_prefix="/http_error") def register_plugins(self): """Load plugins listed in config variable 'PLUGINS'.""" registered = set() for plugin_fqdn in chain(self.APP_PLUGINS, self.config["PLUGINS"]): if plugin_fqdn not in registered: self.register_plugin(plugin_fqdn) registered.add(plugin_fqdn) def maybe_register_setup_wizard(self): if self.configured: return logger.info("Application is not configured, installing setup wizard") from abilian.web import setupwizard self.register_blueprint(setupwizard.setup, url_prefix="/setup") def add_url_rule(self, rule, endpoint=None, view_func=None, roles=None, **options): """See :meth:`Flask.add_url_rule`. If `roles` parameter is present, it must be a :class:`abilian.service.security.models.Role` instance, or a list of Role instances. """ super(Application, self).add_url_rule(rule, endpoint, view_func, **options) if roles: self.add_access_controller( endpoint, allow_access_for_roles(roles), endpoint=True ) def add_access_controller(self, name, func, endpoint=False): # type: (Text, Callable, bool) -> None """Add an access controller. If `name` is None it is added at application level, else if is considered as a blueprint name. If `endpoint` is True then it is considered as an endpoint. """ auth_state = self.extensions[auth_service.name] adder = auth_state.add_bp_access_controller if endpoint: adder = auth_state.add_endpoint_access_controller if not isinstance(name, string_types): msg = "{} is not a valid endpoint name".format(repr(name)) raise ValueError(msg) adder(name, func) def add_static_url(self, url_path, directory, endpoint=None, roles=None): """Add a new url rule for static files. :param url_path: subpath from application static url path. No heading or trailing slash. :param directory: directory to serve content from. :param endpoint: flask endpoint name for this url rule. Example:: app.add_static_url('myplugin', '/path/to/myplugin/resources', endpoint='myplugin_static') With default setup it will serve content from directory `/path/to/myplugin/resources` from url `http://.../static/myplugin` """ url_path = self.static_url_path + "/" + url_path + "/" self.add_url_rule( url_path, endpoint=endpoint, view_func=partial(send_file_from_directory, directory=directory), roles=roles, ) self.add_access_controller( endpoint, allow_access_for_roles(Anonymous), endpoint=True ) def create_db(self): # type: () -> None db.create_all() self.create_root_user() def create_root_user(self): from abilian.core.models.subjects import User user = User.query.get(0) if user is None: user = User( id=0, last_name="SYSTEM", email="system@example.com", can_login=False ) db.session.add(user) db.session.commit() return user def create_app(config=None): return Application(config=config) PK!, abilian/config.py# coding=utf-8 from __future__ import absolute_import, division, print_function, \ unicode_literals from typing import Any, Dict from babel.dates import LOCALTZ from flask import Flask from werkzeug.datastructures import ImmutableDict from abilian.web.action import Endpoint default_config = dict(Flask.default_config) # type: Dict[str, Any] default_config.update( PRIVATE_SITE=False, TEMPLATE_DEBUG=False, CSRF_ENABLED=True, BABEL_ACCEPT_LANGUAGES=["en"], DEFAULT_COUNTRY=None, PLUGINS=(), ADMIN_PANELS=( "abilian.web.admin.panels.dashboard.DashboardPanel", "abilian.web.admin.panels.audit.AuditPanel", "abilian.web.admin.panels.login_sessions.LoginSessionsPanel", "abilian.web.admin.panels.settings.SettingsPanel", "abilian.web.admin.panels.users.UsersPanel", "abilian.web.admin.panels.groups.GroupsPanel", "abilian.web.admin.panels.sysinfo.SysinfoPanel", "abilian.web.admin.panels.impersonate.ImpersonatePanel", "abilian.services.vocabularies.admin.VocabularyPanel", "abilian.web.tags.admin.TagPanel", ), CELERYD_MAX_TASKS_PER_CHILD=1000, CELERY_ACCEPT_CONTENT=["pickle", "json", "msgpack", "yaml"], CELERY_TIMEZONE=LOCALTZ, SENTRY_USER_ATTRS=("email", "first_name", "last_name"), SENTRY_INSTALL_CLIENT_JS=True, # also install client JS SENTRY_JS_VERSION="1.1.22", # TODO: remove, not needed for recent sentry-js SENTRY_JS_PLUGINS=("console", "jquery", "native", "require"), SESSION_COOKIE_NAME=None, SQLALCHEMY_POOL_RECYCLE=1800, # 30min. default value in flask_sa is None SQLALCHEMY_TRACK_MODIFICATIONS=False, LOGO_URL=Endpoint("abilian_static", filename="img/logo-abilian-32x32.png"), ABILIAN_UPSTREAM_INFO_ENABLED=False, # upstream info extension TRACKING_CODE_SNIPPET="", # tracking code to insert before MAIL_ADDRESS_TAG_CHAR=None, ) default_config = ImmutableDict(default_config) # def configure_redis(app): # redis.init_app(app) # # # def configure_queue(app): # queue.init_app(app, db, sentry) # # # def configure_sentry(app): # from flask import session # # sentry.init_app(app) # # @app.before_request # def capture_user(*args, **kwargs): # if 'uid' in session: # sentry.client.user_context({ # 'id': session['uid'], # 'email': session['email'], # }) # # # def configure_sqlalchemy(app): # db.init_app(app) PK!eabilian/core/__init__.py# coding=utf-8 PK!쎤abilian/core/celery.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from multiprocessing.util import register_after_fork from celery import Celery from celery import current_app as celery_current_app from celery import current_task, task from celery.app.task import Task from celery.loaders.base import BaseLoader from celery.task import PeriodicTask as CeleryPeriodicTask from celery.utils.imports import symbol_by_name from flask import current_app as flask_current_app from flask import has_app_context from flask.helpers import locked_cached_property from sqlalchemy.orm.session import Session from abilian.core.extensions import db from abilian.core.util import unwrap def default_app_factory(): from abilian.app import Application return Application() CELERY_CONF_KEY_PREFIXES = ( "CELERY_", "CELERYD_", "BROKER_", "CELERYBEAT_", "CELERYMON_", ) def is_celery_setting(key): return any(key.startswith(prefix) for prefix in CELERY_CONF_KEY_PREFIXES) def is_eager(): """True when tasks are run eagerly. As of celery 3.1.17 it seems that when CELERY_ALWAYS_EAGER is set in config, request.is_eager is *False*. """ return ( current_task and current_task.request.is_eager ) or celery_current_app.conf.CELERY_ALWAYS_EAGER def safe_session(): """Return a sqlalchemy session that can be safely used in a task. During standard async task processing, there is generally no problem. When developping with task run in eager mode, the session is not usable when task is called during an `after_commit` event. """ if not is_eager(): return db.session() return Session(bind=db.session.get_bind(None, None)) class FlaskLoader(BaseLoader): #: override this in your project #: this can be a function or a class flask_app_factory = "abilian.core.celery.default_app_factory" app_context = None @locked_cached_property def flask_app(self): if has_app_context(): return unwrap(flask_current_app) self.flask_app_factory = symbol_by_name(self.flask_app_factory) app = self.flask_app_factory() if "sentry" in app.extensions: from raven.contrib.celery import register_signal, register_logger_signal client = app.extensions["sentry"].client client.tags["process_type"] = "celery task" register_signal(client) register_logger_signal(client) register_after_fork(app, self._setup_after_fork) return app def _setup_after_fork(self, app): binds = [None] + list(app.config.get("SQLALCHEMY_BINDS") or ()) for bind in binds: engine = db.get_engine(app, bind) engine.dispose() def read_configuration(self, env=None): app = self.flask_app app.config.setdefault("CELERY_DEFAULT_EXCHANGE", app.name) app.config.setdefault("CELERY_DEFAULT_QUEUE", app.name) app.config.setdefault("CELERY_BROADCAST_EXCHANGE", app.name + "ctl") app.config.setdefault("CELERY_BROADCAST_QUEUE", app.name + "ctl") app.config.setdefault("CELERY_RESULT_EXCHANGE", app.name + "results") app.config.setdefault("CELERY_DEFAULT_ROUTING_KEY", app.name) cfg = {k: v for k, v in app.config.items() if is_celery_setting(k)} self.configured = True return cfg class FlaskTask(Task): """Base Task class for :FlaskCelery: based applications.""" abstract = True def __call__(self, *args, **kwargs): if is_eager(): # this is here mainly because flask_sqlalchemy (as of 2.0) will # remove session on app context teardown. # # Unfortunatly when using eager tasks (during dev and tests, # mostly), calling apply_async() during after_commit() will # remove session because app_context would be pushed and popped. # # The TB looks like: # # sqlalchemy/orm/session.py: in transaction.commit: # if self.session._enable_transaction_accounting: # AttributeError: 'NoneType' object has no attribute # '_enable_transaction_accounting' # # FIXME: also test has_app_context()? return super(FlaskTask, self).__call__(*args, **kwargs) with self.app.loader.flask_app.app_context(): return super(FlaskTask, self).__call__(*args, **kwargs) class PeriodicTask(FlaskTask, CeleryPeriodicTask): __doc__ = CeleryPeriodicTask.__doc__ abstract = True def periodic_task(*args, **options): """Deprecated decorator, please use :setting:`CELERYBEAT_SCHEDULE`.""" # FIXME: 'task' below is not callable. Fix or remove. return task(**dict({"base": PeriodicTask}, **options)) class FlaskCelery(Celery): # can be overriden on command line with --loader loader_cls = FlaskLoader task_cls = FlaskTask PK!6.!abilian/core/commands/__init__.py# coding=utf-8 """Abilian script commands to be used in a project. See `Flask-Script documentation. `_ for full documentation. Here is how a `manage.py` can include these commands:: from flask_script import Manager from abilian.commands import setup_abilian_commands my_manager = Manager(app) setup_abilian_commands(my_manager) You can also include abilian commands as sub commands:: from abilian.commands import manager as abilian_manager my_manager.add_command('abilian', abilian_manager) Extensions can add their own commands to :py:data:`~abilian.core.commands.manager`:: from flask_script import Manager from abilian.commands import manager @manager.command def hello(): print u"hello" # or install subcommands sub_manager = Manager(usage='Little extension') abilian_manager.add_command('special_commands', sub_manager) """ from __future__ import absolute_import, division, print_function from flask_assets import ManageAssets from flask_migrate import MigrateCommand # Additional commands from . import indexing # noqa from .base import manager from .config import manager as config_manager __all__ = ["manager", "setup_abilian_commands"] def setup_abilian_commands(manager): """Register abilian commands on ``manager``. :param manager: ``flask_script.Manager`` instance to add commands onto Usage exemple:: from flask_script import Manager from abilian.commands import setup_abilian_commands my_manager = Manager(app) setup_abilian_commands(my_manager) """ abilian_manager = globals()["manager"] manager._options.extend(abilian_manager._options) for name, command in abilian_manager._commands.items(): manager.add_command(name, command) manager.add_command("assets", ManageAssets()) # flask-assets manager.add_command("config", config_manager) manager.add_command("migrate", MigrateCommand) return manager PK!:3^^abilian/core/commands/base.py# coding=utf-8 from __future__ import absolute_import, division, print_function, \ unicode_literals import logging import runpy from pprint import pformat import sqlalchemy as sa import sqlalchemy.exc from flask import current_app from flask_script import Manager, prompt_pass from six import text_type from six.moves import input, urllib from abilian.core.extensions import db from abilian.core.logging import patch_logger from abilian.core.models.subjects import User from abilian.services import get_service from abilian.services.security import Role __all__ = ["manager", "logger"] # Setup basic logging capabilities in case logging is not yet set up. From doc: # This function does nothing if the root logger already has handlers configured # for it. # Allow "print" statements to be replaced by a logging statements logging.basicConfig() logger = logging.getLogger("") # PATCH flask_script.Manager.run to force creation of app before run() is # called. In default implementation, the arg parser is created before the Flask # application. So we can't use app.script_manager to add commands from # plugins. If app is created before the arg parser, plugin commands are properly # registered _flask_script_manager_run = Manager.run def _manager_run(self, *args, **kwargs): self() if "sentry" in self.app.extensions: client = self.app.extensions["sentry"].client client.tags["process_type"] = "shell" return _flask_script_manager_run(self, *args, **kwargs) patch_logger.info(Manager.run) Manager.run = _manager_run #: ``flask_script.Manager`` instance for abilian commands manager = Manager(usage="Abilian base commands") def _log_config(config): lines = ["Application configuration:"] if config.get("CONFIGURED"): settings = get_service("settings") try: db_settings = set(settings.namespace("config").keys()) except sa.exc.ProgrammingError: # there is config.py, db uri, but maybe "initdb" has yet to be run db_settings = {} else: db_settings = {} for k, v in sorted(config.items()): prefix = " " if k in db_settings: prefix = " * " indent = len(k) + 3 width = 80 - indent v = pformat(v, width=width).replace("\n", "\n" + " " * indent) lines.append("{}{}: {}".format(prefix, k, v)) logger.info("\n".join(lines)) def log_config(config): original_level = logger.level logger.setLevel(logging.INFO) try: return _log_config(config) finally: logger.setLevel(original_level) @manager.option("-p", "--port", dest="port", help="listening port", default=5000) @manager.option( "--show-config", dest="show_config", action="store_const", const=True, default=False, help="show application configuration on startup", ) @manager.option( "--ssl", dest="ssl", action="store_const", default=False, const=True, help="Enable werkzeug SSL", ) def run(port, show_config, ssl): """Like runserver. May also print application configuration if used with --show-config. """ app = current_app options = {} if show_config: log_config(app.config) # TODO: pass host and debug as params to host = "0.0.0.0" debug = app.config.get("DEBUG") port = int(port or app.config.get("PORT", 5000)) if ssl: options["ssl_context"] = "adhoc" app.run(host=host, debug=debug, port=port, **options) @manager.command def initdb(): """Create application DB.""" print("Creating DB using engine: {}".format(db)) current_app.create_db() @manager.command def dropdb(): """Drop the application DB.""" confirm = input("Are you sure you want to drop the database? (Y/N) ") print("Dropping DB using engine: {}".format(db)) if confirm.lower() == "y": # with current_app.app_context(): db.drop_all() @manager.command def routes(): """Show all the routes registered in Flask.""" output = [] for rule in current_app.url_map.iter_rules(): methods = ",".join(rule.methods) path = urllib.parse.unquote(rule.rule) output.append((rule.endpoint, methods, path)) for endpoint, methods, path in sorted(output): print("{:40s} {:25s} {}".format(endpoint, methods, path)) # user commands email_opt = manager.option("email", help="user's email") password_opt = manager.option( "-p", "--password", dest="password", default=None, help="If absent, a prompt will ask for password", ) role_opt = manager.option( "-r", "--role", dest="role", choices=[r.name for r in Role.assignable_roles()] ) name_opt = manager.option( "-n", "--name", dest="name", default=None, help='Last name (e.g "Smith")' ) firstname_opt = manager.option( "-f", "--firstname", dest="first_name", default=None, help='Fist name (e.g. "John")' ) @email_opt @password_opt @role_opt @name_opt @firstname_opt def createuser(email, password, role=None, name=None, first_name=None): """Create new user.""" email = text_type(email) if User.query.filter(User.email == email).count() > 0: print("A user with email '{}' already exists, aborting.".format(email)) return if password is None: password = prompt_pass("Password") user = User( email=email, password=password, last_name=name, first_name=first_name, can_login=True, ) db.session.add(user) if role in ("admin",): # FIXME: add other valid roles security = get_service("security") security.grant_role(user, role) db.session.commit() print("User {} added".format(email)) @email_opt @password_opt @name_opt @firstname_opt def createadmin(email, password, name=None, first_name=None): """Create new administrator. Same as `createuser --role='admin'`. """ createuser(email, password, role="admin", name=name, first_name=first_name) @email_opt @password_opt def passwd(email, password=None): """Change the password for the given user.""" user = User.query.filter(User.email == email).one() if password is None: password = prompt_pass("New password: ") user.set_password(password) db.session.commit() print("Password updated for user {}".format(email)) @manager.command def script(path): """Run given script in the app context.""" runpy.run_path(path, run_name="__main__") PK!ĉ]  abilian/core/commands/config.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals import logging import os from pathlib import Path from flask import current_app from flask_script import Manager from jinja2 import Environment, Markup, PackageLoader from .base import log_config, logger #: sub-manager for config commands manager = Manager( description="Show config / create default config", help="Show config / create default config", ) @manager.command def show(only_path=False): """Show the current config.""" logger.setLevel(logging.INFO) infos = [ "\n", 'Instance path: "{}"'.format(current_app.instance_path), 'CONFIG_ENVVAR: "{}"'.format(current_app.CONFIG_ENVVAR), ] logger.info("\n ".join(infos)) if not only_path: log_config(current_app.config) class DefaultConfig(object): SQLALCHEMY_DATABASE_URI = "" PRODUCTION = False LOGGING_CONFIG_FILE = "logging.yml" # SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:' SQLALCHEMY_ECHO = False REDIS_URI = "redis://localhost:6379/1" DEBUG = True ASSETS_DEBUG = True DEBUG_TB_ENABLED = True TEMPLATE_DEBUG = False DEBUG_TB_INTERCEPT_REDIRECTS = False DEBUG_TB_PROFILER_ENABLED = False BROKER_URL = "redis://localhost:6379/1" CELERY_RESULT_BACKEND = "redis://localhost:6379/1" CELERYD_PREFETCH_MULTIPLIER = 1 CELERY_ALWAYS_EAGER = True # run tasks locally, no async CELERY_EAGER_PROPAGATES_EXCEPTIONS = True WHOOSH_BASE = "whoosh" SITE_NAME = "" MAIL_SENDER = "" UNOCONV_LOCATION = "/usr/bin/unoconv" def __init__(self, logging_file=None): self.SESSION_COOKIE_NAME = "{}-session".format(current_app.name) self.SECRET_KEY = os.urandom(24) db_dir = Path(current_app.instance_path) / "data" if not db_dir.exists(): db_dir.mkdir() self.SQLALCHEMY_DATABASE_URI = "sqlite:///{}/data/db.sqlite".format( current_app.instance_path ) if logging_file: self.LOGGING_CONFIG_FILE = str(logging_file) class ReprProxy(object): """Proxy an object and apply repr() + Mark safe when accesing an attribute. Used in jinja templates. """ def __init__(self, obj): self.__obj = obj def __getattr__(self, name): return Markup(repr(self.__obj.__getattribute__(name))) def write_config(config_file, config): jinja_env = Environment(loader=PackageLoader(__name__)) template = jinja_env.get_template("config.py.jinja2") with Path(config_file).open("w") as f: f.write(template.render(cfg=ReprProxy(config))) logger.info('Generated "%s"', config_file) def maybe_write_logging(logging_file): if Path(logging_file).exists(): logger.info( 'Logging config file "%s" already exists, skipping creation.', logging_file ) return jinja_env = Environment(loader=PackageLoader(__name__)) template = jinja_env.get_template("logging.yml.jinja2") with Path(logging_file).open("w") as f: f.write(template.render()) logger.info('Generated "%s"', logging_file) @manager.command def init(filename="config.py", logging_config="logging.yml"): """Create default config files in instance folder. * [FILENAME] (default: "config.py") * [LOGGING_CONFIG] (default: logging.yml) Defaults are tailored for development. """ config_file = Path(current_app.instance_path) / filename logging_file = Path(current_app.instance_path) / logging_config if config_file.exists(): logger.info('Config file "%s" already exists! Abort.', config_file) return 1 config = DefaultConfig(logging_file=logging_config) write_config(config_file, config) maybe_write_logging(logging_file) PK! [Z66!abilian/core/commands/indexing.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals import time from collections import deque from typing import Set, Text import sqlalchemy as sa import whoosh import whoosh.index from flask import current_app from six import string_types from sqlalchemy.orm.session import Session from tqdm import tqdm from whoosh.writing import CLEAR, AsyncWriter from abilian.core.entities import Entity from abilian.core.extensions import db from abilian.services import get_service from .base import manager STOP = object() COMMIT = object() @manager.command def reindex(clear=False, progressive=False, batch_size=""): # type: (bool, bool, Text) -> None """Reindex all content; optionally clear index before. All is done in asingle transaction by default. :param clear: clear index content. :param progressive: don't run in a single transaction. :param batch_size: number of documents to process before writing to the index. Unused in single transaction mode. If `None` then all documents of same content type are written at once. """ reindexer = Reindexer(clear, progressive, int(batch_size or 0)) reindexer.reindex_all() class Reindexer: def __init__(self, clear, progressive, batch_size): # type: (bool, bool, int) -> None self.clear = clear self.progressive = progressive self.batch_size = int(batch_size or 0) self.index_service = get_service("indexing") self.index = self.index_service.app_state.indexes["default"] self.adapted = self.index_service.adapted self.session = Session(bind=db.session.get_bind(None, None), autocommit=True) self.indexed = set() # type: Set[Text] self.cleared = set() # type: Set[Text] strategy = progressive_mode if self.progressive else single_transaction self.strategy = strategy(self.index, clear=self.clear) def reindex_all(self): next(self.strategy) # starts generator indexed_classes = self.index_service.app_state.indexed_classes for cls in sorted(indexed_classes, key=lambda c: c.__name__): self.reindex_class(cls) try: self.strategy.send(STOP) except StopIteration: pass try: self.strategy.close() except StopIteration: pass def reindex_class(self, cls): # type: (Entity) -> None current_object_type = cls._object_type() if not self.clear and current_object_type not in self.cleared: self.strategy.send(current_object_type) self.cleared.add(current_object_type) adapter = self.adapted.get(current_object_type) if not adapter or not adapter.indexable: return name = cls.__name__ with self.session.begin(): query = self.session.query(cls).options(sa.orm.lazyload("*")) try: count = query.count() except Exception as e: current_app.logger.error( "Indexing error on class {}: {}".format(name, repr(e)) ) return print("*" * 79) print("{}".format(name)) if count == 0: print("*" * 79) print("{}".format(name)) return print("*" * 79) print("{}".format(name)) with tqdm(total=count) as bar: self.reindex_batch(query, current_object_type, adapter, bar) if not self.batch_size: self.strategy.send(COMMIT) self.strategy.send(COMMIT) def reindex_batch(self, query, current_object_type, adapter, bar): count = 0 for obj in query.yield_per(1000): count += 1 if obj.object_type != current_object_type: # may happen if obj is a subclass and its parent class # is also indexable bar.update() continue object_key = obj.object_key if object_key in self.indexed: bar.update() continue document = self.index_service.get_document(obj, adapter) self.strategy.send(document) self.indexed.add(object_key) if self.batch_size and (count % self.batch_size) == 0: bar.update() self.strategy.send(COMMIT) bar.update() # indexing strategies def single_transaction(index, clear): with AsyncWriter(index) as writer: if clear: print("*" * 80) print("WILL CLEAR INDEX BEFORE REINDEXING") print("*" * 80) writer.writer.mergetype = CLEAR doc = yield True while doc is not STOP: if doc is COMMIT: doc = yield True continue if isinstance(doc, string_types): writer.delete_by_term("object_type", doc) else: writer.add_document(**doc) doc = yield True print("Writing Index...", end=" ") print("Done.") def progressive_mode(index, clear): if clear: writer = _get_writer(index) print("*" * 80) print("CLEAR INDEX BEFORE REINDEXING") print("*" * 80) writer.mergetype = CLEAR writer.commit() del writer queue = deque() doc = yield True while doc is not STOP: if doc is COMMIT: writer = _get_writer(index) while queue: doc = queue.pop() if isinstance(doc, string_types): writer.delete_by_term("object_type", doc) else: writer.add_document(**doc) writer.commit() del writer else: queue.append(doc) doc = yield True def _get_writer(index): writer = None while writer is None: try: writer = index.writer() except whoosh.index.LockError: time.sleep(0.25) return writer PK! ݡ0abilian/core/commands/templates/config.py.jinja2# coding=utf-8 """ Documentation for flask config variables is here: http://flask.pocoo.org/docs/config/#builtin-configuration-values """ PRODUCTION = {{ cfg.PRODUCTION }} # SERVER_NAME = 'my.server.name' SITE_NAME = {{ cfg.SITE_NAME }} MAIL_SENDER = {{ cfg.MAIL_SENDER }} SESSION_COOKIE_NAME = {{ cfg.SESSION_COOKIE_NAME }} LOGGING_CONFIG_FILE = {{ cfg.LOGGING_CONFIG_FILE }} SQLALCHEMY_DATABASE_URI = {{ cfg.SQLALCHEMY_DATABASE_URI }} REDIS_URI = {{ cfg.REDIS_URI }} # SQLALCHEMY_ECHO = {{ cfg.SQLALCHEMY_ECHO }} # celery settings BROKER_URL = {{ cfg.BROKER_URL }} CELERY_RESULT_BACKEND = {{ cfg.CELERY_RESULT_BACKEND }} CELERYD_PREFETCH_MULTIPLIER = {{ cfg.CELERYD_PREFETCH_MULTIPLIER }} CELERY_ALWAYS_EAGER = {{ cfg.CELERY_ALWAYS_EAGER }} # True: run tasks locally, no async CELERY_EAGER_PROPAGATES_EXCEPTIONS = {{ cfg.CELERY_EAGER_PROPAGATES_EXCEPTIONS }} # uncomment if you don't want to use system timezone # CELERY_TIMEZONE = 'Europe/Paris' # SENTRY_DSN = 'http://...' # private key for sessions SECRET_KEY = {{ cfg.SECRET_KEY }} WHOOSH_BASE = {{ cfg.WHOOSH_BASE }} UNOCONV_LOCATION = {{ cfg.UNOCONV_LOCATION }} # develop settings DEBUG = {{ cfg.DEBUG }} ASSETS_DEBUG = {{ cfg.ASSETS_DEBUG }} DEBUG_TB_ENABLED = {{ cfg.DEBUG_TB_ENABLED }} TEMPLATE_DEBUG = {{ cfg.TEMPLATE_DEBUG }} DEBUG_TB_INTERCEPT_REDIRECTS = {{ cfg.DEBUG_TB_INTERCEPT_REDIRECTS }} DEBUG_TB_PROFILER_ENABLED = {{ cfg.DEBUG_TB_PROFILER_ENABLED }} # DEBUG_TB_PANELS = [ # 'flask_debugtoolbar.panels.versions.VersionDebugPanel', # 'flask_debugtoolbar.panels.timer.TimerDebugPanel', # 'flask_debugtoolbar.panels.headers.HeaderDebugPanel', # 'flask_debugtoolbar.panels.request_vars.RequestVarsDebugPanel', # 'flask_debugtoolbar.panels.template.TemplateDebugPanel', # 'flask_debugtoolbar.panels.sqlalchemy.SQLAlchemyDebugPanel', # 'flask_debugtoolbar.panels.logger.LoggingPanel', # 'flask_debugtoolbar.panels.profiler.ProfilerDebugPanel', # 'flask_debugtoolbar_lineprofilerpanel.panels.LineProfilerPanel', # ] PK!'@CC2abilian/core/commands/templates/logging.yml.jinja2disable_existing_loggers: false root: level: WARNING handlers: [console] formatters: simpleFormater: format: '%(asctime)s - %(levelname)s [%(name)s]: %(message)s' datefmt: '%Y/%m/%d %H:%M:%S' with_origin: format: '%(asctime)s - %(levelname)s: %(pathname)s:%(lineno)d [%(funcName)s()]: %(message)s' datefmt: '%Y/%m/%d %H:%M:%S' msg_only: format: '%(message)s' datefmt: '' handlers: console: class: logging.StreamHandler formatter: simpleFormater level: DEBUG stream: ext://sys.stdout console_trace: class: logging.StreamHandler formatter: with_origin level: DEBUG stream: ext://sys.stdout console_msg_only: class: logging.StreamHandler formatter: msg_only level: DEBUG stream: ext://sys.stdout loggers: abilian: level: INFO raven: level: INFO sentry.errors: handlers: [console] propagate: false webassets: level: ERROR celery: level: INFO sqlalchemy: level: WARNING # INFO level will show queries sqlalchemy.engine: level: WARNING # sqlalchemy.pool: # level: DEBUG # propagate: false # handlers: [console_trace] # werkeug use console_msg_only so that HTTP requests are printed as standard # HTTP access log werkzeug: propagate: false handlers: [console_msg_only] PK!kQCQCabilian/core/entities.py# coding=utf-8 """Base class for entities, objects that are managed by the Abilian framwework (unlike SQLAlchemy models which are considered lower-level).""" from __future__ import absolute_import, division, print_function, \ unicode_literals import collections import re from datetime import datetime from inspect import isclass import sqlalchemy as sa from flask import current_app from six import text_type, with_metaclass from sqlalchemy import event from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.orm import Session, mapper from sqlalchemy.schema import Column, ForeignKey from sqlalchemy.types import Integer, String, UnicodeText from .extensions import db from .models import BaseMixin from .models.base import EDITABLE, SEARCHABLE, SYSTEM, Indexable from .sqlalchemy import JSONDict from .util import friendly_fqcn, memoized, slugify __all__ = [ "Entity", "EntityQuery", "Indexable", "all_entity_classes", "db", "ValidationError", ] # # Manual validation # class ValidationError(Exception): pass def validation_listener(mapper, connection, target): if hasattr(target, "_validate"): target._validate() event.listen(mapper, "before_insert", validation_listener) event.listen(mapper, "before_update", validation_listener) # # CRUD events. TODO: connect to signals instead? # def before_insert_listener(mapper, connection, target): if hasattr(target, "_before_insert"): target._before_insert() def before_update_listener(mapper, connection, target): if hasattr(target, "_before_update"): target._before_update() def before_delete_listener(mapper, connection, target): if hasattr(target, "_before_delete"): target._before_delete() event.listen(mapper, "before_insert", before_insert_listener) event.listen(mapper, "before_update", before_update_listener) event.listen(mapper, "before_delete", before_delete_listener) def auto_slug_on_insert(mapper, connection, target): """Generate a slug from :prop:`Entity.auto_slug` for new entities, unless slug is already set.""" if target.slug is None and target.name: target.slug = target.auto_slug def auto_slug_after_insert(mapper, connection, target): """Generate a slug from entity_type and id, unless slug is already set.""" if target.slug is None: target.slug = "{name}{sep}{id}".format( name=target.entity_class.lower(), sep=target.SLUG_SEPARATOR, id=target.id ) @event.listens_for(Session, "after_attach") def setup_default_permissions(session, instance): """Setup default permissions on newly created entities according to. :attr:`Entity.__default_permissions__`. """ if instance not in session.new or not isinstance(instance, Entity): return if not current_app: # working outside app_context. Raw object manipulation return _setup_default_permissions(instance) def _setup_default_permissions(instance): """Separate method to conveniently call it from scripts for example.""" from abilian.services import get_service security = get_service("security") for permission, roles in instance.__default_permissions__: if permission == "create": # use str for comparison instead of `abilian.services.security.CREATE` # symbol to avoid imports that quickly become circular. # # FIXME: put roles and permissions in a separate, isolated module. continue for role in roles: security.add_permission(permission, role, obj=instance) class _EntityInherit(object): """Mixin for Entity subclasses. Entity meta-class takes care of inserting it in base classes. """ __indexable__ = True @declared_attr def id(cls): return Column( Integer, ForeignKey("entity.id", use_alter=True, name="fk_inherited_entity_id"), primary_key=True, info=SYSTEM | SEARCHABLE, ) @declared_attr def __mapper_args__(cls): return { "polymorphic_identity": cls.entity_type, "inherit_condition": cls.id == Entity.id, } BaseMeta = db.Model.__class__ class EntityQuery(db.Model.query_class): def with_permission(self, permission, user=None): from abilian.services import get_service security = get_service("security") if hasattr(self, "_query_entity_zero"): # SQLAlchemy 1.1+ model = self._query_entity_zero().entity_zero.entity else: # SQLAlchemy 1.0 model = self._entity_zero().entity_zero.entity expr = security.query_entity_with_permission(permission, user, Model=model) return self.filter(expr) class EntityMeta(BaseMeta): """Metaclass for Entities. It properly sets up subclasses by adding _EntityInherit to `__bases__`. `_EntityInherit` provides `id` attibute and `__mapper_args__` """ def __new__(mcs, classname, bases, d): if d["__module__"] != EntityMeta.__module__ or classname != "Entity": if not any(issubclass(b, _EntityInherit) for b in bases): bases = (_EntityInherit,) + bases d["id"] = _EntityInherit.id if d.get("entity_type") is None: entity_type_base = d.get("ENTITY_TYPE_BASE") if not entity_type_base: for base in bases: entity_type_base = getattr(base, "ENTITY_TYPE_BASE", None) if entity_type_base: break else: # no break happened during loop: use default type base entity_type_base = d["__module__"] d["entity_type"] = entity_type_base + "." + classname default_permissions = d.get("__default_permissions__") if default_permissions is not None: if isinstance(default_permissions, collections.Mapping): default_permissions = default_permissions.items() elif not isinstance(default_permissions, collections.Set): raise TypeError( "__default_permissions__ is neither a dict or set, " "cannot create class {}".format(classname) ) # also ensure that `roles` set is immutable, too default_permissions = frozenset( (permission, frozenset(roles)) for permission, roles in default_permissions ) d["__default_permissions__"] = default_permissions d["SLUG_SEPARATOR"] = text_type( d.get("SLUG_SEPARATOR", Entity.SLUG_SEPARATOR) ) cls = BaseMeta.__new__(mcs, classname, bases, d) if not issubclass(cls.query_class, EntityQuery): raise TypeError( "query_class is not a subclass of EntityQuery: {!r}" "".format(cls.query_class) ) event.listen(cls, "before_insert", auto_slug_on_insert) event.listen(cls, "after_insert", auto_slug_after_insert) return cls def __init__(cls, classname, bases, d): bases = cls.__bases__ BaseMeta.__init__(cls, classname, bases, d) class Entity(with_metaclass(EntityMeta, Indexable, BaseMixin, db.Model)): """Base class for Abilian entities. From Sqlalchemy POV, Entities use `Joined-Table inheritance `_, thus entities subclasses cannot use inheritance themselves (as of 2013 Sqlalchemy does not support multi-level inheritance) The metaclass automatically sets up polymorphic inheritance parameters by inserting a mixin class in parent classes. If you need to pass additional parameters to `__mapper_args__`, do it as follow: .. code-block:: python class MyContent(Entity): @sqlalchemy.ext.declarative.declared_attr def __mapper_args__(cls): # super(Mycontent, cls).__mapper_args__ would be prettier, but # `MyContent` is not defined at this stage. args = Entity.__dict__['__mapper_args__'].fget(cls) args['order_by'] = cls.created_at # for example return args """ __indexable__ = False __index_to__ = ( ("_indexable_roles_and_users", ("allowed_roles_and_users",)), ("_indexable_tag_ids", ("tag_ids",)), ("_indexable_tag_text", ("tag_text", "text")), ) __default_permissions__ = frozenset() """ Permission to roles mapping to set at object creation time. Default permissions can be declared as a :py:class:`dict` on classes, the final datastructure will changed by metaclass to a :py:class:`frozenset` of :py:meth:`dict.items`. This is made to garantee the immutability of definition on parent classes. Exemple definition: .. code-block:: python __default_permissions__ = { READ: {Owner, Authenticated}, WRITE: {Owner}, } To alter inherited default permissions: .. code-block:: python class Child(Parent): __default_permissions__ = dp = dict(ParentClass.__default_permissions__) dp[READ] = dp[READ] - {Authenticated} + {Anonymous} del dp """ SLUG_SEPARATOR = "-" # \x2d \u002d HYPHEN-MINUS query_class = EntityQuery @declared_attr def __mapper_args__(cls): if cls.__module__ == __name__ and cls.__name__ == "Entity": return {"polymorphic_on": "_entity_type"} else: return { "polymorphic_identity": cls.entity_type, "inherit_condition": cls.id == Entity.id, } #: The name is a string that is shown to the user; it could be a title #: for document, a folder name, etc. name = Column("name", UnicodeText()) name.info = EDITABLE | SEARCHABLE | {"index_to": ("name", "name_prefix", "text")} slug = Column("slug", UnicodeText(), info=SEARCHABLE) """ The slug attribute may be used in URLs to reference the entity, but uniqueness is not enforced, even within same entity type. For example if an entity class represent folders, one could want uniqueness only within same parent folder. If slug is empty at first creation, its is derived from the name. When name changes the slug is not updated. If name is also empty, the slug will be the friendly entity_type with concatenated with entity's id. """ _entity_type = Column("entity_type", String(1000), nullable=False) entity_type = None meta = Column(JSONDict(), nullable=False, default=dict, server_default="{}") """ A dictionnary of simple values (JSON-serializable) to conveniently annotate the entity. It is recommanded to keep it lighwight and not store large objects in it. """ @property def object_type(self): return text_type(self.entity_type) @classmethod def _object_type(cls): # overriden from Indexable return cls.entity_type @property def entity_class(self): return self.entity_type and friendly_fqcn(self.entity_type) # Default magic metadata, should not be necessary # TODO: remove __editable__ = frozenset() __searchable__ = frozenset() __auditable__ = frozenset() def __init__(self, *args, **kwargs): db.Model.__init__(self, *args, **kwargs) BaseMixin.__init__(self) if self.meta is None: self.meta = {} @property def auto_slug(self): """This property is used to auto-generate a slug from the name attribute. It can be customized by subclasses. """ slug = self.name if slug is not None: slug = slugify(slug, separator=self.SLUG_SEPARATOR) session = sa.orm.object_session(self) if not session: return None query = session.query(Entity.slug).filter( Entity._entity_type == self.object_type ) if self.id is not None: query = query.filter(Entity.id != self.id) slug_re = re.compile(re.escape(slug) + r"-?(-\d+)?") results = [ int(m.group(1) or 0) # 0: for the unnumbered slug for m in (slug_re.match(s.slug) for s in query.all() if s.slug) if m ] max_id = max(-1, -1, *results) + 1 if max_id: slug = "{}-{}".format(slug, max_id) return slug @property def _indexable_roles_and_users(self): """Return a string made for indexing roles having :any:`READ` permission on this object.""" from abilian.services.indexing import indexable_role from abilian.services.security import READ, Admin, Anonymous, Creator, Owner from abilian.services import get_service result = [] security = get_service("security") # roles - required to match when user has a global role assignments = security.get_permissions_assignments(permission=READ, obj=self) allowed_roles = assignments.get(READ, set()) allowed_roles.add(Admin) for r in allowed_roles: result.append(indexable_role(r)) for role, attr in ((Creator, "creator"), (Owner, "owner")): if role in allowed_roles: user = getattr(self, attr) if user: result.append(indexable_role(user)) # users and groups principals = set() for user, role in security.get_role_assignements(self): if role in allowed_roles: principals.add(user) if Anonymous in principals: # it's a role listed in role assignments - legacy when there wasn't # permission-role assignments principals.remove(Anonymous) for p in principals: result.append(indexable_role(p)) return " ".join(result) @property def _indexable_tags(self): """Index tag ids for tags defined in this Entity's default tags namespace.""" tags = current_app.extensions["tags"] if not tags.supports_taggings(self): return "" default_ns = tags.entity_default_ns(self) return [t for t in tags.entity_tags(self) if t.ns == default_ns] @property def _indexable_tag_ids(self): return " ".join(text_type(t.id) for t in self._indexable_tags) @property def _indexable_tag_text(self): return " ".join(text_type(t.label) for t in self._indexable_tags) def clone(self): """Copy an entity: copy every field, except the id and sqlalchemy internals, without forgetting about the n-n relationships. - return: the newly created entity Example:: def clone(self): old_attrs = self.__dict__.copy() del old_attrs['_sa_instance_state'] if 'id' in old_attrs: del old_attrs['id'] new = AnEntity(**old_attrs) # Needs special treatment for n-n relationship new.related_projects = self.related_projects new.ancestor = self return new """ raise NotImplementedError # TODO: make this unecessary @event.listens_for(Entity, "class_instrument", propagate=True) def register_metadata(cls): cls.__editable__ = set() # TODO: use SQLAlchemy 0.8 introspection if hasattr(cls, "__table__"): columns = cls.__table__.columns else: columns = [v for k, v in vars(cls).items() if isinstance(v, Column)] for column in columns: name = column.name info = column.info if info.get("editable", True): cls.__editable__.add(name) @event.listens_for(Session, "before_flush") def polymorphic_update_timestamp(session, flush_context, instances): """This listener ensures an update statement is emited for "entity" table to update 'updated_at'. With joined-table inheritance if the only modified attributes are subclass's ones, then no update statement will be emitted. """ for obj in session.dirty: if not isinstance(obj, Entity): continue state = sa.inspect(obj) history = state.attrs["updated_at"].history if not any((history.added, history.deleted)): obj.updated_at = datetime.utcnow() @memoized def all_entity_classes(): """Return the list of all concrete persistent classes that are subclasses of Entity.""" persistent_classes = Entity._decl_class_registry.values() # with sqlalchemy 0.8 _decl_class_registry holds object that are not # classes return [ cls for cls in persistent_classes if isclass(cls) and issubclass(cls, Entity) ] def register_all_entity_classes(): for cls in all_entity_classes(): register_metadata(cls) PK!1rċcc#abilian/core/extensions/__init__.py# coding=utf-8 """Create all standard extensions.""" # Note: Because of issues with circular dependencies, Abilian-specific # extensions are created later. from __future__ import absolute_import, division, print_function import flask_mail import sqlalchemy as sa import sqlalchemy.event import sqlalchemy.orm from flask import current_app from sqlalchemy.engine import Engine from abilian.core.logging import patch_logger from . import upstream_info from ..sqlalchemy import SQLAlchemy from .csrf import abilian_csrf from .csrf import wtf_csrf as csrf from .login import login_manager __all__ = ["get_extension", "db", "mail", "login_manager", "csrf", "upstream_info"] # patch flask.ext.mail.Message.send to always set enveloppe_from default mail # sender # FIXME: we'ld rather subclass Message and update all imports def _message_send(self, connection): """Send a single message instance. If TESTING is True the message will not actually be sent. :param self: a Message instance. """ sender = current_app.config["MAIL_SENDER"] if not self.extra_headers: self.extra_headers = {} self.extra_headers["Sender"] = sender connection.send(self, sender) patch_logger.info(flask_mail.Message.send) flask_mail.Message.send = _message_send mail = flask_mail.Mail() db = SQLAlchemy() @sa.event.listens_for(db.metadata, "before_create") @sa.event.listens_for(db.metadata, "before_drop") def _filter_metadata_for_connection(target, connection, **kw): """Listener to control what indexes get created. Useful for skipping postgres-specific indexes on a sqlite for example. It's looking for info entry `engines` on an index (`Index(info=dict(engines=['postgresql']))`), an iterable of engine names. """ engine = connection.engine.name default_engines = (engine,) tables = target if isinstance(target, sa.Table) else kw.get("tables", []) for table in tables: indexes = list(table.indexes) for idx in indexes: if engine not in idx.info.get("engines", default_engines): table.indexes.remove(idx) # # CSRF # def get_extension(name): """Get the named extension from the current app, returning None if not found.""" return current_app.extensions.get(name) def _install_get_display_value(cls): _MARK = object() def display_value(self, field_name, value=_MARK): """Return display value for fields having 'choices' mapping (stored value. -> human readable value). For other fields it will simply return field value. `display_value` should be used instead of directly getting field value. If `value` is provided, it is "translated" to a human-readable value. This is useful for obtaining a human readable label from a raw value. """ val = getattr(self, field_name, "ERROR") if value is _MARK else value mapper = sa.orm.object_mapper(self) try: field = getattr(mapper.c, field_name) except AttributeError: pass else: if "choices" in field.info: def get(v): return field.info["choices"].get(v, v) if isinstance(val, list): val = [get(v) for v in val] else: val = get(val) return val if not hasattr(cls, "display_value"): cls.display_value = display_value sa.event.listen(db.Model, "class_instrument", _install_get_display_value) # # Make Sqlite a bit more well-behaved. # @sa.event.listens_for(Engine, "connect") def _set_sqlite_pragma(dbapi_connection, connection_record): from sqlite3 import Connection as SQLite3Connection if isinstance(dbapi_connection, SQLite3Connection): # pragma: no cover cursor = dbapi_connection.cursor() cursor.execute("PRAGMA foreign_keys=ON;") cursor.close() PK!1jabilian/core/extensions/csrf.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from flask import current_app, flash, request from flask.signals import request_started from flask_wtf.csrf import CsrfProtect from markupsafe import Markup from werkzeug.exceptions import BadRequest from abilian.core.util import unwrap from abilian.i18n import _l wtf_csrf = CsrfProtect() class AbilianCsrf(object): """CSRF error handler, that allows supporting views to gracefully report error instead of a plain 400 error. views supporting this must """ #: for views that gracefully support csrf errors, this message can be #: displayed to user. It can be changed if you have a better one for your #: users. csrf_failed_message = _l( "Security informations are missing or expired. " "This may happen if you have opened the form for a long time. " "

" "Please try to resubmit the form." ) def init_app(self, app): if "csrf" not in app.extensions: raise RuntimeError( 'Please install flask_wtf.csrf.CsrfProtect() as "csrf" in ' "extensions before AbilianCsrf()" ) app.extensions["csrf"].error_handler(self.csrf_error_handler) app.extensions["csrf-handler"] = self request_started.connect(self.request_started, sender=app) app.before_request(self.before_request) def flash_csrf_failed_message(self): flash(Markup(self.csrf_failed_message), "error") def request_started(self, app): request.csrf_failed = False def csrf_error_handler(self, reason): request.csrf_failed = reason def before_request(self): req = unwrap(request) failed = req.csrf_failed if not failed: return rule = req.url_rule view = current_app.view_functions[rule.endpoint] if getattr(view, "csrf_support_graceful_failure", False): # view can handle it nicely for the user return None if hasattr(view, "view_class") and getattr( view.view_class, "csrf_support_graceful_failure", False ): return None raise BadRequest(failed) abilian_csrf = AbilianCsrf() PK!' abilian/core/extensions/login.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from flask_login import AnonymousUserMixin, LoginManager class AnonymousUser(AnonymousUserMixin): def has_role(self, role): from abilian.services import get_service security = get_service("security") return security.has_role(self, role) @property def groups(self): return set() login_manager = LoginManager() login_manager.anonymous_user = AnonymousUser PK!G(abilian/core/extensions/upstream_info.py# coding=utf-8 """Extension for sending informations to upstream server.""" from __future__ import absolute_import, division, print_function, \ unicode_literals from flask import _request_ctx_stack from flask.signals import request_finished, request_started from abilian.core.signals import user_loaded class UpstreamInfo(object): """Extension for sending informations to upstream server.""" def __init__(self, app=None): if app is not None: self.init_app(app) def init_app(self, app): app.extensions["upstream"] = self request_started.connect(self.request_started, sender=app) request_finished.connect(self.request_finished, sender=app) user_loaded.connect(self.user_loaded, sender=app) config = app.config config.setdefault("ABILIAN_UPSTREAM_INFO_ENABLED", False) for key in ("ABILIAN_UPSTREAM_INFO_DISCARD", "ABILIAN_UPSTREAM_INFO_INCLUDE"): val = config.get(key, ()) if val is not None: val = frozenset(val) config[key] = val def request_started(self, app): _request_ctx_stack.top.upstream_info = {"Username": "Anonymous"} def request_finished(self, app, response): info = _request_ctx_stack.top.upstream_info config = app.config default_enabled = bool(config["ABILIAN_UPSTREAM_INFO_ENABLED"]) disabled = config["ABILIAN_UPSTREAM_INFO_DISCARD"] enabled = config["ABILIAN_UPSTREAM_INFO_INCLUDE"] for key, val in info.items(): if ( default_enabled and key in disabled or not default_enabled and key not in enabled ): continue header = "X-" + key response.headers[header] = val def user_loaded(self, app, user, *args, **kwargs): _request_ctx_stack.top.upstream_info["Username"] = user.email extension = UpstreamInfo() PK!1 abilian/core/jinjaext.py# coding=utf-8 """Jinja2 extensions.""" from __future__ import absolute_import, division, print_function, \ unicode_literals import lxml.html from flask import current_app from flask.globals import g from flask.signals import got_request_exception, request_started from jinja2 import nodes from jinja2.ext import Extension as JinjaExtension class DeferredJS(object): """Flask extension for use with DeferredJSExtension for jinja.""" name = "deferred_js" def __init__(self, app=None): if app is not None: self.init_app(app) def init_app(self, app): if self.name in app.extensions: return app.extensions[self.name] = self request_started.connect(self.reset_request, app) got_request_exception.connect(self.reset_request, app) def reset_request(self, sender, **extra): self.reset_deferred() @staticmethod def reset_deferred(): g.deferred_js = [] class DeferredJSExtension(JinjaExtension): """Put JS fragment at the end of the document in a script tag. The JS fragment can contains {%- enddeferJS %} {% endblock %} PK!w0abilian/web/admin/templates/admin/dashboard.html{% extends "admin/_base.html" %} {% from "macros/box.html" import m_box %} {% from "admin/_macros.html" import m_stats %} {% block css %} {% endblock %} {% block content %} {% call m_box(title="Connections Stats") %}
{% endcall %} {% call m_box(title="Dashboard") %}

Today

{{ m_stats(stats.today) }}

This week

{{ m_stats(stats.this_week) }}

This month

{{ m_stats(stats.this_month) }}
{% endcall %} {%- deferJS %} {%- enddeferJS %} {% endblock %} PK!63pLCC1abilian/web/admin/templates/admin/group_view.html{% extends base_template %} {% block content %}

{{ form['name'].render_view() }} {{ _('Edit') }}

{{ form['description'].render_view() }}

{{ _('Roles') }}

{%- for role in roles %} {{ role }} {%- endfor %}

{{ _('Members') }}

(: {{ _('account disabled') }})

{% set table_id = uuid() %} {% for user in members %} {% endfor %}
Last Name First Name Nom
{{ user.last_name }} {{ user.first_name }} {%- if not user.can_login %} {%- endif %} {{ user.name }}
({{ user.email }}) {%- if not user.can_login %}
{%- endif %}
{{ csrf.field() }} {{ REMOVE_USER_BUTTON.render() }}
{%- deferJS %} {%- enddeferJS %} {% endblock %} PK!_X-abilian/web/admin/templates/admin/groups.html{% extends "admin/_base.html" %} {% import "macros/buttons.html" as buttons %} {% from "macros/box.html" import m_box %} {% block content %} {% call m_box(title=_("Groups")) %} {{ buttons.create_a(url_for('.groups_new'), _('New Group...')) }} {% set table_id = next(g.id_generator) %}
{{ _("Name") }} {{ _("Roles") }} {{ _('Public') }}
{%- deferJS %} {%- enddeferJS %} {% endcall %} {% endblock %} PK!H 115abilian/web/admin/templates/admin/login_sessions.html{% extends "admin/_base.html" %} {% from "macros/box.html" import m_box %} {% block content %} {%- call m_box(title="Security audit") %}

Recent user sessions

{% for session in sessions %} {% endfor %}
User name Started at Ended at Duration IP Address
{{ session.user.name }} {{ local_dt(session.started_at) | datetimeformat(format='short') }} {%- if session.ended_at %} {{ local_dt(session.ended_at) | datetimeformat(format='short') }}{%- else %} still active{%- endif %} {%- if session.ended_at %}{{ (session.ended_at - session.started_at)|timedeltaformat }}{%- endif %} {{ session.ip_address }} ({{ session.country }})
{% endcall %} {% endblock %} PK!C/abilian/web/admin/templates/admin/settings.html{% extends "admin/_base.html" %} {% from "macros/box.html" import m_box %} {% block content %} {%- call m_box(title=_("Settings")) %}
{{ csrf.field() }} {%- for k in keys %}
{%-if k.description %}

{{ k.description }}

{%- endif %} {{ k }}
{%- endfor %}
{%- endcall %} {% endblock %} PK!Z@abilian/web/admin/templates/admin/settings_session_lifetime.html
PK!+.abilian/web/admin/templates/admin/sysinfo.html{% extends "admin/_base.html" %} {% from "macros/box.html" import m_box %} {% block content %} {%- call m_box("System information") %}

OS information

{{ uname }}

Python version

{{ python_version }}

Installed Python packages

{%- for package in packages -%} {% endfor -%}
{{ package.name }} {{ package.version }} {%- if package.vcs %} {{ package.vcs.name }} {{ package.vcs.revision }} {%- endif %}

Application config

{%- for k, v in config_values -%} {% endfor -%}
{{ k }} {{ v }}
{% endcall %} {% endblock %} PK!£jii,abilian/web/admin/templates/admin/users.html{% extends "admin/_base.html" %} {% import "macros/buttons.html" as buttons %} {% from "macros/box.html" import m_box %} {% block content %} {% call m_box(title=_("Users")) %} {{ buttons.create_a(url_for('.users_new'), _('New user...')) }} {% set table_id = next(g.id_generator) %}
{{ _("Name") }} {{ _('Email') }} {{ _('Login enabled') }} {{ _("Groups") }} {{ _("Roles") }} {{ _('Last connection') }}
{%- deferJS %} {%- enddeferJS %} {% endcall %} {% endblock %} PK! 7##abilian/web/admin/test_views.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from flask import url_for def test_home(client, db_session): response = client.get(url_for("admin.dashboard")) assert response.status_code == 200 def test_sysinfo(client, db_session): response = client.get(url_for("admin.sysinfo")) assert response.status_code == 200 def test_login_session(client, db_session): response = client.get(url_for("admin.login_sessions")) assert response.status_code == 200 def test_audit(client, db_session): response = client.get(url_for("admin.audit")) assert response.status_code == 200 def test_settings(client, db_session): response = client.get(url_for("admin.settings")) assert response.status_code == 200 PK!labilian/web/assets/__init__.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function import pkg_resources from flask import current_app, url_for from flask_assets import Bundle from webassets.filter import get_filter from abilian.services.security import Anonymous # register custom filters for webassets from . import filters # noqa def init_app(app): assets = app.extensions["webassets"] assets.append_path(RESOURCES_DIR, "/static/abilian") app.add_static_url( "abilian", RESOURCES_DIR, endpoint="abilian_static", roles=Anonymous ) app.before_first_request(requirejs_config) def requirejs_config(): assets = current_app.extensions["webassets"] config = assets.requirejs_config # setup ckeditor ckeditor_lib = "ckeditor/ckeditor" config["shim"]["ckeditor"] = {"exports": "CKEDITOR"} config["paths"]["ckeditor"] = url_for("abilian_static", filename=ckeditor_lib) d3_lib = "nvd3/d3.min" config["shim"]["d3"] = {"exports": "d3"} config["paths"]["d3"] = url_for("abilian_static", filename=d3_lib) nvd3_lib = "nvd3/nv.d3" config["shim"]["nvd3"] = {"exports": "nv", "deps": ["d3"]} config["paths"]["nvd3"] = url_for("abilian_static", filename=nvd3_lib) RESOURCES_DIR = pkg_resources.resource_filename("abilian.web", "resources") JQUERY = Bundle("jquery/js/jquery-1.11.3.js") BOOTBOX_JS = Bundle("bootbox/bootbox.js") BOOTSTRAP_LESS = Bundle("bootstrap/less/bootstrap.less") BOOTSTRAP_JS = Bundle("bootstrap/js/bootstrap.js") BOOTSTRAP_DATEPICKER_LESS = "bootstrap-datepicker/less/datepicker.less" BOOTSTRAP_DATEPICKER_JS = Bundle("bootstrap-datepicker/js/bootstrap-datepicker.js") BOOTSTRAP_SWITCH_LESS = Bundle("bootstrap-switch/less/bootstrap3/bootstrap-switch.less") BOOTSTRAP_SWITCH_JS = Bundle("bootstrap-switch/bootstrap-switch.js") BOOTSTRAP_TIMEPICKER_LESS = Bundle("bootstrap-timepicker/less/timepicker.less") BOOTSTRAP_TIMEPICKER_JS = Bundle("bootstrap-timepicker/js/bootstrap-timepicker.js") DATATABLE_LESS = Bundle( "datatables/css/jquery.dataTables.css", "datatables/css/jquery.dataTables_themeroller.css", ) DATATABLE_JS = Bundle("datatables/js/jquery.dataTables.js") FILEAPI_JS = Bundle("fileapi/FileAPI.js") FONTAWESOME_LESS = Bundle("font-awesome/less/font-awesome.less") REQUIRE_JS = Bundle("requirejs/require.js", "requirejs/domReady.js") SELECT2_LESS = Bundle("select2/select2.css", "select2/select2-bootstrap.css") SELECT2_JS = Bundle("select2/select2.js") TYPEAHEAD_LESS = Bundle("typeahead/typeahead.js-bootstrap.less") TYPEAHEAD_JS = Bundle("typeahead/typeahead.js", "typeahead/hogan-2.0.0.js") ABILIAN_LESS = Bundle("less/abilian.less", "less/print.less") es2015 = get_filter("babel", presets="es2015") ABILIAN_JS_NS = Bundle("js/abilian-namespace.js") ABILIAN_JS = Bundle( "js/abilian.js", "js/datatables-setup.js", "js/datatables-advanced-search.js", "js/widgets/base.js", "js/widgets/select2.js", "js/widgets/richtext.js", "js/widgets/delete.js", "js/widgets/file.js", "js/widgets/image.js", "js/widgets/tags.js", "js/widgets/dynamic-row.js", ) LESS = Bundle( BOOTSTRAP_LESS, FONTAWESOME_LESS, SELECT2_LESS, TYPEAHEAD_LESS, BOOTSTRAP_DATEPICKER_LESS, BOOTSTRAP_SWITCH_LESS, BOOTSTRAP_TIMEPICKER_LESS, DATATABLE_LESS, ABILIAN_LESS, ) TOP_JS = Bundle(REQUIRE_JS, JQUERY, ABILIAN_JS_NS) JS = Bundle( BOOTSTRAP_JS, TYPEAHEAD_JS, BOOTBOX_JS, SELECT2_JS, BOOTSTRAP_DATEPICKER_JS, BOOTSTRAP_SWITCH_JS, BOOTSTRAP_TIMEPICKER_JS, DATATABLE_JS, FILEAPI_JS, ABILIAN_JS, ) JS_I18N = ( "select2/select2_locale_{lang}.js", "bootstrap-datepicker/js/locales/bootstrap-datepicker.{lang}.js", ) PK!>͏44abilian/web/assets/filters.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals import json import logging import os import re from functools import partial from io import StringIO from os.path import isabs from pathlib import Path from webassets.filter import ExternalTool, Filter, get_filter, register_filter from webassets.filter.closure import ClosureJS as BaseClosureJS from webassets.utils import working_directory class ImportCSSFilter(Filter): """This filter searches (recursively) '@import' rules and replaces them by content of target file.""" name = "cssimporter" max_debug_level = None logger = logging.getLogger(__name__ + ".ImportCssFilter") _IMPORT_RE = re.compile( r"""@import ("|')(?P(/?[-a-zA-Z0-9_\.]+)+\.css)("|');""" ) def input(self, _in, out, **kwargs): filepath = kwargs["source_path"] source = kwargs.get("source") if not source: # this happens when this filters is not used as a "source" filter, i.e _in # is a webasset hunk instance source = filepath # output = kwargs['output'] base_dir = Path(filepath).parent rel_dir = Path(source).parent self.logger.debug('process "%s"', filepath) for line in _in.readlines(): import_match = self._IMPORT_RE.search(line) if import_match is None: out.write(line) continue filename = import_match.group("filename") abs_filename = os.path.abspath(base_dir / filename) rel_filename = os.path.normpath(rel_dir / filename) start, end = import_match.span() if start > 0: out.write(line[:start]) out.write("\n") with open(abs_filename, "r") as included: # rewrite url() statements buf = StringIO() url_rewriter = get_filter("cssrewrite") url_rewriter.set_context(self.ctx) url_rewriter.setup() url_rewriter.input( included, buf, source=rel_filename, source_path=abs_filename, output=source, output_path=filepath, ) buf.seek(0) # now process '@includes' directives in included file self.input( buf, out, source=rel_filename, source_path=abs_filename, output=source, output_path=filepath, ) if end < len(line): out.write(line[end:]) else: out.write("\n") class LessImportFilter(Filter): """This filter outputs `@import` statements for listed files. This allows to generate a single less file for application, where abilian properties can be overridden by application. """ name = "less_import" options = {"run_in_debug": "LESS_RUN_IN_DEBUG"} # use same option as less filter max_debug_level = None logger = logging.getLogger(__name__ + ".LessImportFilter") def setup(self): super(LessImportFilter, self).setup() if self.run_in_debug is False: # Disable running in debug mode for this instance. self.max_debug_level = False def input(self, _in, out, source_path, output_path, **kwargs): if not Path(source_path).is_file(): # we are not processing files but webassets intermediate hunks out.write(_in.read()) return out_dir = os.path.dirname(output_path) rel_path = os.path.relpath(source_path, out_dir) # note: when import as CSS, import statement is put at the top of the # generated file (order of import is not preserved, less content will be # after pure css one). If we use "inline" the lessc will not rewrite # url(). So we better have all our css imported as less content. import_mode = "less" # if not rel_path.endswith('css') else 'css' out.write('@import ({}) "{}";'.format(import_mode, rel_path)) class Less(ExternalTool): """Converts `less `_ markup to real CSS. This depends on the NodeJS implementation of less, installable via npm. To use the old Ruby-based version (implemented in the 1.x Ruby gem), see :class:`~.less_ruby.Less`. *Supported configuration options*: LESS_BIN (binary) Path to the less executable used to compile source files. By default, the filter will attempt to run ``lessc`` via the system path. LESS_LINE_NUMBERS (line_numbers) Outputs filename and line numbers. Can be either 'comments', which will output the debug info within comments, 'mediaquery' that will output the information within a fake media query which is compatible with the SASSPath to the less executable used to compile source files. LESS_RUN_IN_DEBUG (run_in_debug) By default, the filter will compile in debug mode. Since the less compiler is written in Javascript and capable of running in the browser, you can set this to ``False`` to have your original less source files served (see below). LESS_PATHS (paths) Add include paths for less command line. It should be a list of paths relatives to Environment.directory or absolute paths. Order matters as less will pick the first file found in path order. .. admonition:: Compiling less in the browser less is an interesting case because it is written in Javascript and capable of running in the browser. While for performance reason you should prebuild your stylesheets in production, while developing you may be interested in serving the original less files to the client, and have less compile them in the browser. To do so, you first need to make sure the less filter is not applied when :attr:`Environment.debug` is ``True``. You can do so via an option:: env.config['less_run_in_debug'] = False Second, in order for the less to identify the less source files as needing to be compiled, they have to be referenced with a ``rel="stylesheet/less"`` attribute. One way to do this is to use the :attr:`Bundle.extra` dictionary, which works well with the template tags that webassets provides for some template languages:: less_bundle = Bundle( '**/*.less', filters='less', extra={'rel': 'stylesheet/less' if env.debug else 'stylesheet'} ) Then, for example in a Jinja2 template, you would write:: {% assets less_bundle %} {% endassets %} With this, the ```` tag will sport the correct ``rel`` value both in development and in production. Finally, you need to include the less compiler:: if env.debug: js_bundle.contents += \ 'http://lesscss.googlecode.com/files/less-1.3.0.min.js' """ name = "less" options = { "less": ("binary", "LESS_BIN"), "run_in_debug": "LESS_RUN_IN_DEBUG", "line_numbers": "LESS_LINE_NUMBERS", "extra_args": "less_extra_args", "paths": "LESS_PATHS", "as_output": "less_as_output", "source_map_file": "less_source_map_file", } max_debug_level = None logger = logging.getLogger(__name__ + ".LessFilter") def setup(self): super(Less, self).setup() if self.run_in_debug is False: # Disable running in debug mode for this instance. self.max_debug_level = False def input(self, in_, out, **kw): if self.as_output: importer = get_filter("less_import") importer.input(in_, out, **kw) else: self._apply_less(in_, out, **kw) def output(self, in_, out, **kw): if not self.as_output: out.write(in_.read()) else: self._apply_less(in_, out, **kw) def _apply_less(self, in_, out, output_path, output, **kw): # Set working directory to the source file so that includes are found args = [self.less or "lessc"] if self.line_numbers: args.append("--line-numbers=%s" % self.line_numbers) if self.paths: paths = [ path if isabs(path) else self.ctx.resolver.resolve_source(path) for path in self.pathsep ] args.append("--include-path={}".format(os.pathsep.join(paths))) # # Commented out since this doesn't work with the current lessc compiler. # (See also just below) # # source_map = self.source_map_file and self.ctx.debug # if source_map: # source_map_dest = os.path.join(self.ctx.directory, # self.source_map_file) # self.logger.debug('Generate source map to "%s"', source_map_dest) # args.append('--source-map={}'.format(source_map_dest)) # args.append('--source-map-url={}'.format(self.source_map_file)) if self.extra_args: args.extend(self.extra_args) args.append("-") buf = StringIO() with working_directory(filename=output_path): self.subprocess(args, buf, in_) # if source_map: # self.fix_source_map_urls(source_map_dest) # rewrite css url() replace_url = partial(self.fix_url, os.path.dirname(output_path)) buf.seek(0) url_rewriter = get_filter("cssrewrite", replace=replace_url) url_rewriter.set_context(self.ctx) url_rewriter.setup() url_rewriter.input( buf, out, source=output, source_path=output_path, output=output, output_path=output_path, ) def fix_url(self, cur_path, url): if url.startswith("data:"): # base64 embeded return url src_path = os.path.normpath(os.path.abspath(os.path.join(cur_path, url))) possible_paths = [ p for p in self.ctx.url_mapping.keys() if src_path.startswith(p) ] if not possible_paths: return url if len(possible_paths) > 1: raise RuntimeError("Should not happen") # possible_paths.sort(lambda p: -len(p)) path = possible_paths[0] return self.ctx.url_mapping[path] + src_path[len(path) :] def fix_source_map_urls(self, filename): with open(filename, "r") as f: data = json.load(f) for idx, path in enumerate(data["sources"]): if path == "-": data["sources"][idx] = "-" continue # apparently less is stripping first part path = os.path.join("..", path) data["sources"][idx] = self.fix_url(self.ctx.directory, path) with open(filename, "w") as f: json.dump(data, f) class ClosureJS(BaseClosureJS): def setup(self): super(ClosureJS, self).setup() self.source_files = [] def input(self, _in, out, source_path, output_path, **kwargs): if not Path(source_path).is_file(): # we are not processing files but webassets intermediate hunks return self.source_files.append(source_path) def output(self, _in, out, **kw): for source_file in self.source_files: self.extra_args.append("--js") self.extra_args.append(source_file) super(ClosureJS, self).output(_in, out, **kw) try: smap_idx = self.extra_args.index("--create_source_map") smap_path = Path(self.extra_args[smap_idx + 1]) except (ValueError, IndexError): return if not smap_path.exists(): return name = smap_path.name out.write("//# sourceMappingURL={}".format(str(name))) self.fix_source_map_urls(str(smap_path)) def fix_url(self, cur_path, src_path): possible_paths = [ p for p in self.ctx.url_mapping.keys() if src_path.startswith(p) ] if not possible_paths: raise RuntimeError("Should not happen") # # FIXME: url is not defined at this point, this can't work. # return url if len(possible_paths) > 1: raise RuntimeError("Should not happen") # possible_paths.sort(lambda p: -len(p)) path = possible_paths[0] return self.ctx.url_mapping[path] + src_path[len(path) :] def fix_source_map_urls(self, filename): with open(filename, "r") as f: data = json.load(f) for idx, path in enumerate(data["sources"]): if path == "-": data["sources"][idx] = "-" continue data["sources"][idx] = self.fix_url(self.ctx.directory, path) with open(filename, "w") as f: json.dump(data, f) def register_filters(): register_filter(Less) register_filter(LessImportFilter) register_filter(ImportCSSFilter) register_filter(ClosureJS) register_filters() PK!#abilian/web/attachments/__init__.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function from .extension import AttachmentExtension, AttachmentsManager from .forms import AttachmentForm # noqa def register_plugin(app): AttachmentExtension(app=app) PK!ۇ[[$abilian/web/attachments/extension.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from flask import current_app from flask_login import current_user from abilian.core.models import attachment as attachments from abilian.services.security import READ, WRITE, security from abilian.web import url_for from .forms import AttachmentForm from .views import UPLOAD_BUTTON from .views import bp as blueprint _MANAGER_ATTR = "__attachments_manager__" class AttachmentExtension(object): """API for comments, installed as an application extension. It is also available in templates as `attachments`. """ def __init__(self, app): app.extensions["attachments"] = self app.add_template_global(self, "attachments") app.register_blueprint(blueprint) def manager(self, obj): """Returns the :class:`AttachmentsManager` instance for this object.""" manager = getattr(obj, _MANAGER_ATTR, None) if manager is None: manager = AttachmentsManager() setattr(obj.__class__, _MANAGER_ATTR, manager) return manager def supports_attachments(self, obj): return self.manager(obj).supports_attachments(obj) def for_entity(self, obj, check_support_attachments=False): return self.manager(obj).for_entity( obj, check_support_attachments=check_support_attachments ) def has_attachments(self, obj): return self.manager(obj).has_attachments(obj) def count(self, obj): return self.manager(obj).count(obj) def get_form_context(self, obj): """Return a dict: form instance, action button, submit url... Used by macro m_attachment_form(entity) """ return self.manager(obj).get_form_context(obj) _DEFAULT_TEMPLATE = "macros/attachment_default.html" class AttachmentsManager(object): """Allow customization of attachments form, display macros, etc. can be used as class decorator """ Form = AttachmentForm macros_template = "macros/attachment.html" def __init__( self, Form=AttachmentForm, macros_template="macros/attachment_default.html" ): self.Form = Form self.macros_template = macros_template def __call__(self, Model): setattr(Model, _MANAGER_ATTR, self) return Model @property def macros(self): default_template = current_app.jinja_env.get_template(_DEFAULT_TEMPLATE) template = current_app.jinja_env.get_template(self.macros_template) default = default_template.module m = template.module return { "m_attachments": getattr(m, "m_attachments", default.m_attachments), "m_attachment": getattr(m, "m_attachment", default.m_attachment), "m_attachment_form": getattr( m, "m_attachment_form", default.m_attachment_form ), } def supports_attachments(self, obj): return attachments.supports_attachments(obj) def for_entity(self, obj, check_support_attachments=False): return attachments.for_entity( obj, check_support_attachments=check_support_attachments ) def has_attachments(self, obj): return bool(self.for_entity(obj, check_support_attachments=True)) def count(self, obj): return len(self.for_entity(obj, check_support_attachments=True)) def get_form_context(self, obj): """Return a dict: form instance, action button, submit url... Used by macro m_attachment_form(entity) """ return { "url": url_for("attachments.create", entity_id=obj.id), "form": self.Form(), "buttons": [UPLOAD_BUTTON], } # # current user capabilities # def can_view(self, entity): """True if user can view attachments on entity.""" return security.has_permission(current_user, READ, obj=entity) def can_edit(self, entity): """True if user can edit attachments on entity.""" return security.has_permission(current_user, WRITE, obj=entity) def can_create(self, entity): """True if user can add attachments.""" return security.has_permission(current_user, WRITE, obj=entity) def can_delete(self, entity): """True if user can delete attachments.""" return security.has_permission(current_user, WRITE, obj=entity) PK!k\^   abilian/web/attachments/forms.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from wtforms.fields import StringField from abilian.core.models.attachment import Attachment from abilian.i18n import _l from abilian.web.forms import Form from abilian.web.forms.fields import FileField from abilian.web.forms.filters import strip from abilian.web.forms.validators import required class AttachmentForm(Form): blob = FileField( _l("file"), validators=[required()], filters=[strip], multiple=False ) description = StringField(_l("description (optional)"), filters=[strip]) class Meta: model = Attachment include_primary_keys = True assign_required = False # for 'id': allow None, for new records PK!oђ abilian/web/attachments/views.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from typing import Optional import sqlalchemy as sa import sqlalchemy.orm from flask import current_app, send_file from werkzeug.exceptions import BadRequest from werkzeug.utils import redirect from abilian.core.entities import Entity from abilian.core.models.attachment import Attachment, supports_attachments from abilian.i18n import _, _l from abilian.web import nav, url_for from abilian.web.action import ButtonAction, actions from abilian.web.blueprints import Blueprint from abilian.web.views import BaseObjectView, ObjectCreate, ObjectDelete, \ ObjectEdit from .forms import AttachmentForm bp = Blueprint("attachments", __name__, url_prefix="/attachments") def _default_attachment_view(obj, obj_type, obj_id, **kwargs): if not hasattr(obj, "entity"): return url_for("attachments.entity", object_id=obj_id) entity = obj.entity return url_for(entity, _anchor="attachment-{}".format(obj.id)) @bp.record_once def register_default_view(state): state.app.default_view.register(Attachment, _default_attachment_view) UPLOAD_BUTTON = ButtonAction("form", "edit", btn_class="primary", title=_l("Send")) class BaseAttachmentView(object): """Mixin for attachment views.""" Model = Attachment Form = AttachmentForm #: owning entity entity = None # type: Optional[Entity] def init_object(self, args, kwargs): args, kwargs = super(BaseAttachmentView, self).init_object(args, kwargs) entity_id = kwargs.pop("entity_id", None) if entity_id is not None: self.entity = Entity.query.get(entity_id) if self.entity is None: raise BadRequest("No entity provided") if not supports_attachments(self.entity): raise BadRequest("This entity is doesn't support attachments") extension = current_app.extensions["attachments"] self.Form = extension.manager(self.entity).Form actions.context["object"] = self.entity return args, kwargs def view_url(self): kw = {} if self.obj and self.obj.id: kw["_anchor"] = "attachment-{}".format(self.obj.id) return url_for(self.entity, **kw) def index_url(self): return self.view_url() @property def activity_target(self): return self.entity class AttachmentDownload(BaseAttachmentView, BaseObjectView): def get(self): blob = self.obj.blob metadata = blob.meta filename = metadata.get("filename", self.obj.name) content_type = metadata.get("mimetype") stream = blob.file.open("rb") return send_file( stream, as_attachment=True, attachment_filename=filename, mimetype=content_type, cache_timeout=0, add_etags=False, ) download_view = AttachmentDownload.as_view("download") bp.route("///download")(download_view) class AttachmentEdit(BaseAttachmentView, ObjectEdit): _message_success = _l("Attachment edited") edit_view = AttachmentEdit.as_view("edit") bp.route("///edit")(edit_view) class AttachmentCreateView(BaseAttachmentView, ObjectCreate): _message_success = _l("Attachment added") def init_object(self, args, kwargs): args, kwargs = super(AttachmentCreateView, self).init_object(args, kwargs) self.obj.entity = self.entity session = sa.orm.object_session(self.entity) if session: sa.orm.session.make_transient(self.obj) return args, kwargs def breadcrumb(self): label = _('New attachment on "{title}"').format(title=self.entity.name) return nav.BreadcrumbItem(label=label) def get_form_buttons(self, *args, **kwargs): return [UPLOAD_BUTTON] create_view = AttachmentCreateView.as_view("create") bp.route("//create")(create_view) class AttachmentDelete(BaseAttachmentView, ObjectDelete): pass delete_view = AttachmentDelete.as_view("delete") bp.route("///delete")(delete_view) class AttachmentEntity(BaseObjectView): """Redirects to an attachment's entity view.""" Model = Attachment def get(self): return redirect(url_for(self.obj)) entity_view = AttachmentEntity.as_view("entity") bp.route("//entity")(entity_view) PK!*K&abilian/web/blueprints.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from flask import Blueprint as BaseBlueprint from six import string_types from abilian.services.security import Anonymous, Role def allow_anonymous(user, roles, **kwargs): return True def allow_access_for_roles(roles): """Access control helper to check user's roles against a list of valid roles.""" if isinstance(roles, Role): roles = (roles,) valid_roles = frozenset(roles) if Anonymous in valid_roles: return allow_anonymous def check_role(user, roles, **kwargs): from abilian.services import get_service security = get_service("security") return security.has_role(user, valid_roles) return check_role class Blueprint(BaseBlueprint): """An enhanced :class:`flask.blueprints.Blueprint` with access control helpers.""" def __init__(self, name, import_name, allowed_roles=None, **kwargs): """ :param allowed_roles: role or list of roles required to access any view in this blueprint. """ BaseBlueprint.__init__(self, name, import_name, **kwargs) if allowed_roles is not None: if isinstance(allowed_roles, string_types): allowed_roles = Role(allowed_roles) if isinstance(allowed_roles, Role): allowed_roles = (allowed_roles,) else: allowed_roles = () if allowed_roles: self.record_once( lambda s: s.app.add_access_controller( self.name, allow_access_for_roles(allowed_roles) ) ) def allow_any(self, func): pass PK!3* abilian/web/comments/__init__.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function from .extension import CommentExtension def register_plugin(app): CommentExtension(app=app) PK!sYY!abilian/web/comments/extension.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from abilian.core.models import comment as comments from abilian.web import url_for from .forms import CommentForm from .views import COMMENT_BUTTON from .views import bp as blueprint class CommentExtension(object): """API for comments, installed as an application extension. It is also available in templates as `comments`. """ def __init__(self, app): app.extensions["comments"] = self app.add_template_global(self, "comments") app.register_blueprint(blueprint) def is_commentable(self, obj): return comments.is_commentable(obj) def for_entity(self, obj, check_commentable=False): return comments.for_entity(obj, check_commentable=check_commentable) def has_comments(self, obj): return bool(comments.for_entity(obj, check_commentable=True)) def count(self, obj): return len(comments.for_entity(obj, check_commentable=True)) def get_form_context(self, obj): """Return a dict: form instance, action button, submit url... Used by macro m_comment_form(entity) """ return { "url": url_for("comments.create", entity_id=obj.id), "form": CommentForm(), "buttons": [COMMENT_BUTTON], } PK!abilian/web/comments/forms.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from wtforms.fields import TextAreaField from abilian.core.models.comment import Comment from abilian.i18n import _l from abilian.web.forms import Form from abilian.web.forms.filters import strip from abilian.web.forms.validators import required from abilian.web.forms.widgets import TextArea class CommentForm(Form): body = TextAreaField( label=_l("Comment"), validators=[required()], filters=(strip,), widget=TextArea(rows=5, resizeable="vertical"), ) class Meta: model = Comment include_primary_keys = True assign_required = False # for 'id': allow None, for new records PK!A..abilian/web/comments/views.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from datetime import datetime from typing import Optional import sqlalchemy as sa import sqlalchemy.orm from flask_login import current_user from six import text_type from werkzeug.exceptions import BadRequest from abilian.core.entities import Entity from abilian.core.models.comment import Comment, is_commentable from abilian.core.util import utc_dt from abilian.i18n import _, _l from abilian.web import nav, url_for from abilian.web.action import ButtonAction, actions from abilian.web.blueprints import Blueprint from abilian.web.views.object import CANCEL_BUTTON, ObjectCreate, \ ObjectDelete, ObjectEdit from .forms import CommentForm bp = Blueprint("comments", __name__, url_prefix="/comments") def _default_comment_view(obj, obj_type, obj_id, **kwargs): entity = obj.entity return url_for(entity, _anchor="comment-{}".format(obj.id)) @bp.record_once def register_default_view(state): state.app.default_view.register(Comment, _default_comment_view) COMMENT_BUTTON = ButtonAction("form", "edit", btn_class="primary", title=_l("Post")) class BaseCommentView(object): Model = Comment Form = CommentForm #: commented entity entity = None # type: Optional[Entity] def init_object(self, args, kwargs): args, kwargs = super(BaseCommentView, self).init_object(args, kwargs) entity_id = kwargs.pop("entity_id", None) if entity_id is not None: self.entity = Entity.query.get(entity_id) if self.entity is None: raise BadRequest("No entity to comment") if not is_commentable(self.entity): raise BadRequest("This entity is not commentable") actions.context["object"] = self.entity return args, kwargs def view_url(self): kw = {} if self.obj and self.obj.id: kw["_anchor"] = "comment-{}".format(self.obj.id) return url_for(self.entity, **kw) def index_url(self): return self.view_url() @property def activity_target(self): return self.entity class CommentEditView(BaseCommentView, ObjectEdit): _message_success = _l("Comment edited") def breadcrumb(self): label = _('Edit comment on "{title}"').format(title=self.entity.name) return nav.BreadcrumbItem(label=label) def get_form_buttons(self, *args, **kwargs): return [COMMENT_BUTTON, CANCEL_BUTTON] def after_populate_obj(self): obj_meta = self.obj.meta.setdefault("abilian.core.models.comment", {}) history = obj_meta.setdefault("history", []) history.append( { "user_id": current_user.id, "user": text_type(current_user), "date": utc_dt(datetime.utcnow()).isoformat(), } ) self.obj.meta.changed() edit_view = CommentEditView.as_view("edit") bp.route("///edit")(edit_view) class CommentCreateView(BaseCommentView, ObjectCreate): """""" _message_success = _l("Comment added") def __init__(self, *args, **kwargs): super(CommentCreateView, self).__init__(*args, **kwargs) def init_object(self, args, kwargs): args, kwargs = super(CommentCreateView, self).init_object(args, kwargs) self.obj.entity = self.entity session = sa.orm.object_session(self.entity) if session: sa.orm.session.make_transient(self.obj) return args, kwargs def breadcrumb(self): label = _('New comment on "{title}"').format(title=self.entity.name) return nav.BreadcrumbItem(label=label) def get_form_buttons(self, *args, **kwargs): return [COMMENT_BUTTON, CANCEL_BUTTON] create_view = CommentCreateView.as_view("create") bp.route("//create")(create_view) class CommentDeleteView(BaseCommentView, ObjectDelete): _message_success = _l("Comment deleted") delete_view = CommentDeleteView.as_view("delete") bp.route("///delete")(delete_view) PK! >WW!abilian/web/coreviews/__init__.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function PK!s s abilian/web/coreviews/users.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals import hashlib from flask import Blueprint, Response, g, make_response, request from sqlalchemy.sql.expression import func, or_ from werkzeug.exceptions import NotFound from abilian.core.models.subjects import User from abilian.web import url_for from abilian.web.views import JSONModelSearch blueprint = Blueprint("users", __name__, url_prefix="/users") @blueprint.url_value_preprocessor def get_user(endpoint, values): try: user_id = values.pop("user_id") user = User.query.get(user_id) if user: values["user"] = user else: raise NotFound() except KeyError: # this endpoint is not looking for a specific user pass @blueprint.route("//photo") def photo(user): if not user.photo: raise NotFound() data = user.photo self_photo = user.id == g.user.id if self_photo: # special case: for their own photo user has an etag, so that on change, # photo is immediatly reloaded from server. # # FIXME: there should be a photo_digest field on user object acc = hashlib.md5(data) etag = acc.hexdigest() if request.if_none_match and etag in request.if_none_match: return Response(status=304) response = make_response(data) # type: Response response.content_type = "image/jpeg" if not self_photo: response.headers.add("Cache-Control", "public, max-age=600") else: # user always checks its own mugshot is up-to-date, in order to avoid # seeing old one immediatly after having uploaded of a new picture. response.headers.add("Cache-Control", "private, must-revalidate") response.set_etag(etag) return response # JSON search class UserJsonListing(JSONModelSearch): Model = User minimum_input_length = 0 def filter(self, query, q, **kwargs): if q: query = query.filter( or_( func.lower(User.first_name).like(q + "%"), func.lower(User.last_name).like(q + "%"), ) ) return query def order_by(self, query): return query.order_by(func.lower(User.last_name), func.lower(User.first_name)) def get_item(self, obj): d = super(UserJsonListing, self).get_item(obj) d["email"] = obj.email d["can_login"] = obj.can_login d["photo"] = url_for("users.photo", user_id=obj.id) return d blueprint.route("/json/")(UserJsonListing.as_view("json_list")) PK!Maabilian/web/csrf.py# coding=utf-8 from __future__ import absolute_import, division, print_function, \ unicode_literals from functools import wraps from flask import Blueprint, current_app, jsonify, request from flask_wtf import Form as FlaskForm from werkzeug.exceptions import Forbidden blueprint = Blueprint("csrf", __name__, url_prefix="/csrf") @blueprint.route("/token", endpoint="json_token") def json_token_view(): return jsonify(token=token()) def field(): """Return an instance of `wtforms.ext.csrf.fields.CSRFTokenField`, suitable for rendering. Renders an empty string if `config.CSRF_ENABLED` is not set. """ return FlaskForm().csrf_token def time_limit(): """Return current time limit for CSRF token.""" return current_app.config.get("WTF_CSRF_TIME_LIMIT", 3600) def name(): """Field name expected to have CSRF token. Useful for passing it to JavaScript for instance. """ return "csrf_token" def token(): """Value of current csrf token. Useful for passing it to JavaScript for instance. """ return field().current_token or "" def support_graceful_failure(view): """Decorator to indicate that the view will handle itself the csrf failure. View can be a view function or a class based view """ view.csrf_support_graceful_failure = True return view def has_failed(): return getattr(request, "csrf_failed", False) def protect(view): """Protects a view agains CSRF attacks by checking `csrf_token` value in submitted values. Do nothing if `config.CSRF_ENABLED` is not set. Raises `werkzeug.exceptions.Forbidden` if validation fails. """ @wraps(view) def csrf_check(*args, **kwargs): # an empty form is used to validate current csrf token and only that! if not FlaskForm().validate(): raise Forbidden("CSRF validation failed.") return view(*args, **kwargs) return csrf_check PK!P9abilian/web/filters.py# coding: utf-8 """Add a few specific filters to Jinja2.""" from __future__ import absolute_import, division, print_function, \ unicode_literals import datetime import re from calendar import timegm from functools import wraps import bleach import dateutil.parser import flask_babel as babel from babel.dates import DateTimePattern, format_timedelta, parse_pattern from deprecated import deprecated from flask import Flask from jinja2 import Markup, escape, evalcontextfilter from pytz import utc from six import text_type from werkzeug.routing import BuildError from ..core.util import local_dt, slugify, utc_dt from .util import url_for def autoescape(filter_func): """Decorator to autoescape result from filters.""" @evalcontextfilter @wraps(filter_func) def _autoescape(eval_ctx, *args, **kwargs): result = filter_func(*args, **kwargs) if eval_ctx.autoescape: result = Markup(result) return result return _autoescape @autoescape def nl2br(value): """Replace newlines with
.""" result = escape(value).replace("\n", Markup("
\n")) return result _PARAGRAPH_RE = re.compile(r"(?:\r\n|\r|\n){2,}") @autoescape def paragraphs(value): """Blank lines delimitates paragraphs.""" result = "\n\n".join( ( "

{}

".format(p.strip().replace("\n", Markup("
\n"))) for p in _PARAGRAPH_RE.split(escape(value)) ) ) return result def labelize(s): return " ".join([w.capitalize() for w in s.split("_")]) def filesize(d): if not isinstance(d, int): d = int(d) if d < 1000: s = "%d B" % d elif d < int(1e4): s = "%.1f kB" % (d / 1e3) elif d < int(1e6): s = "%.0f kB" % (d / 1e3) elif d < int(1e7): s = "%.1f MB" % (d / 1e6) elif d < int(1e9): s = "%.0f MB" % (d / 1e6) elif d < int(1e10): s = "%.1f GB" % (d / 1e9) else: s = "%.0f GB" % (d / 1e9) return Markup(s) def roughsize(size, above=20, mod=10): """6 -> '6' 15 -> '15' 134 -> '130+'.""" if size < above: return text_type(size) return "{:d}+".format(size - size % mod) def datetimeparse(s): """Parse a string date time to a datetime object. Suitable for dates serialized with .isoformat() :return: None, or an aware datetime instance, tz=UTC. """ try: dt = dateutil.parser.parse(s) except ValueError: return None return utc_dt(dt) def age(dt, now=None, add_direction=True, date_threshold=None): """ :param dt: :class:`datetime` instance to format :param now: :class:`datetime` instance to compare to `dt` :param add_direction: if `True`, will add "in" or "ago" (example for `en` locale) to time difference `dt - now`, i.e "in 9 min." or " 9min. ago" :param date_threshold: above threshold, will use a formated date instead of elapsed time indication. Supported values: "day". """ # Fail silently for now XXX if not dt: return "" if not now: now = datetime.datetime.utcnow() locale = babel.get_locale() dt = utc_dt(dt) now = utc_dt(now) delta = dt - now if date_threshold is not None: dy, dw, dd = dt_cal = dt.isocalendar() ny, nw, nd = now_cal = now.isocalendar() if dt_cal != now_cal: # not same day remove_year = dy == ny date_fmt = locale.date_formats["long"].pattern time_fmt = locale.time_formats["short"].pattern fmt = locale.datetime_formats["medium"] if remove_year: date_fmt = date_fmt.replace("y", "").strip() # remove leading or trailing spaces, comma, etc... date_fmt = re.sub("^[^A-Za-z]*|[^A-Za-z]*$", "", date_fmt) fmt = fmt.format(time_fmt, date_fmt) return babel.format_datetime(dt, format=fmt) # don't use (flask.ext.)babel.format_timedelta: as of Flask-Babel 0.9 it # doesn't support "threshold" arg. return format_timedelta( delta, locale=locale, granularity="minute", threshold=0.9, add_direction=add_direction, ) def date_age(dt, now=None): # Fail silently for now XXX if not dt: return "" formatted_date = babel.format_datetime(dt, format="yyyy-MM-dd HH:mm") return "{} ({})".format(formatted_date, age(dt, now)) @deprecated def date(value, format="EE, d MMMM y"): """ @deprecated: use flask_babel's dateformat filter instead. """ if isinstance(value, datetime.date): return babel.format_date(value, format) else: return babel.format_date(local_dt(value), format) def babel2datepicker(pattern): """Convert date format from babel (http://babel.pocoo.org/docs/dates/#date- fields)) to a format understood by bootstrap-datepicker.""" if not isinstance(pattern, DateTimePattern): pattern = parse_pattern(pattern) map_fmt = { # days "d": "dd", "dd": "dd", "EEE": "D", "EEEE": "DD", "EEEEE": "D", # narrow name => short name # months "M": "mm", "MM": "mm", "MMM": "M", "MMMM": "MM", # years "y": "yyyy", "yy": "yyyy", "yyy": "yyyy", "yyyy": "yyyy", # time picker format # hours "h": "%I", "hh": "%I", "H": "%H", "HH": "%H", # minutes, "m": "%M", "mm": "%M", # seconds "s": "%S", "ss": "%S", # am/pm "a": "%p", } return pattern.format % map_fmt # Doesn't work yet. TZ issues. def to_timestamp(dt): utc_datetime = dt.astimezone(utc) return timegm(utc_datetime.timetuple()) + utc_datetime.microsecond / 1e6 def abbrev(s, max_size): if len(s) <= max_size: return s else: h = max_size // 2 - 1 return s[0:h] + "..." + s[-h:] def bool2check(val, true="\u2713", false=""): """Filter value as boolean and show check mark (✓) or nothing.""" return true if val else false @autoescape def linkify(s): return Markup(bleach.linkify(s)) def obj_to_url(obj): """Find url for obj using :func:`url_for`, return empty string is not found. :func:`url_for` is also provided in jinja context, the filtering version is forgiving when `obj` has no default view set. """ try: return url_for(obj) except BuildError: return "" def init_filters(env): if isinstance(env, Flask): # old api for init_filters: we used to pass flask application env = env.jinja_env env.filters["nl2br"] = nl2br env.filters["paragraphs"] = paragraphs env.filters["date_age"] = date_age env.filters["datetimeparse"] = datetimeparse env.filters["age"] = age env.filters["date"] = date env.filters["babel2datepicker"] = babel2datepicker env.filters["to_timestamp"] = to_timestamp env.filters["url_for"] = obj_to_url env.filters["abbrev"] = abbrev env.filters["filesize"] = filesize env.filters["roughsize"] = roughsize env.filters["labelize"] = labelize env.filters["linkify"] = linkify env.filters["toslug"] = slugify env.filters["bool2check"] = bool2check PK!m*z00abilian/web/forms/__init__.py# coding=utf-8 """Extensions to WTForms fields, widgets and validators.""" from __future__ import absolute_import, division, print_function import logging from collections import OrderedDict from functools import partial from flask import g, has_app_context from flask_login import current_user from flask_wtf import Form as BaseForm from six import string_types from wtforms.fields import Field, HiddenField from wtforms_alchemy import model_form_factory from abilian.core.entities import Entity from abilian.core.logging import patch_logger from abilian.i18n import _, _n from abilian.services import get_service from abilian.services.security import CREATE, READ, WRITE, Anonymous, Role from abilian.web.forms.widgets import DefaultViewWidget from .fields import * # noqa from .filters import * # noqa from .validators import * # noqa from .widgets import * # noqa logger = logging.getLogger(__name__) # setup Form class with babel support class _BabelTranslation(object): def gettext(self, string): return _(string) def ngettext(self, singular, plural, n): return _n(singular, plural, n) BabelTranslation = _BabelTranslation() class FormPermissions(object): """Form role/permission manager.""" def __init__( self, default=Anonymous, read=None, write=None, fields_read=None, fields_write=None, existing=None, ): """ :param default: default roles when not specified for field. Can be: * a :class:`Role` or an iterable of :class:`Role` * a callable that returns a :class:`Role` or an iterable of :class:`Role` * a `dict` with :class:`Permission` instances for keys and one of other acceptable role spec.; a default entry `"default"` is required. :param read: global roles required for `READ` permission for whole form. :param write: global roles required for `WRITE` permission for whole form. """ if isinstance(default, Role): default = {"default": (default,)} elif isinstance(default, dict): if "default" not in default: raise ValueError('`default` parameter must have a "default" key') elif callable(default): default = {"default": default} else: raise ValueError( "No valid value for `default`. Use a Role, an iterable " "of Roles, a callable, or a dict." ) self.default = default self.form = {} self.fields = {} if existing is not None: # copy existing formpermissions instance # maybe overwrite later with our definitions assert isinstance(existing, FormPermissions) for permission in (READ, WRITE): if permission in existing.form: self.form[permission] = existing.form[permission] for field, mapping in existing.fields.items(): f_map = self.fields[field] = {} for permission, roles in mapping.items(): f_map[permission] = roles for permission, roles in ((READ, read), (WRITE, write)): if roles is None: continue if isinstance(roles, Role): roles = (roles,) self.form[permission] = roles fields_defs = ( (fields_read, READ), (fields_write, WRITE), (fields_write, CREATE), ) # checking against CREATE permission # at field level is the same as # WRITE permisssion for fields, permission in fields_defs: if fields: for field_name, allowed_roles in fields.items(): if isinstance(allowed_roles, Role): allowed_roles = (allowed_roles,) self.fields.setdefault(field_name, {})[permission] = allowed_roles def has_permission(self, permission, field=None, obj=None, user=current_user): if obj is not None and not isinstance(obj, Entity): # permission/role can be set only on entities return True allowed_roles = ( self.default[permission] if permission in self.default else self.default["default"] ) definition = None def eval_roles(fun): return fun(permission=permission, field=field, obj=obj) if field is None: definition = self.form else: if isinstance(field, Field): field = field.name if field in self.fields: definition = self.fields[field] if definition and permission in definition: allowed_roles = definition[permission] if callable(allowed_roles): allowed_roles = eval_roles(allowed_roles) roles = [] for r in allowed_roles: if callable(r): r = eval_roles(r) if isinstance(r, (Role,) + string_types): roles.append(r) else: roles.extend(r) # TODO: replace w/: security = get_service('security') # (Doing it now breaks a test) # security = current_app.services['security'] security = get_service("security") # security = get_service('security') return security.has_role(user, role=roles, object=obj) class FormContext(object): """Allows :class:`forms
` to set a context during instanciation, so that subforms used in formfields / listformfields / etc can perform proper field filtering according to original permission and user passed to top form `__init__` method.""" permission = None user = None def __init__(self, permission=None, user=None, obj=None): self.permission = permission self.user = user self.obj = obj def __enter__(self): if not has_app_context(): return self self.__existing = getattr(g, "__form_ctx__", None) if self.__existing: if self.permission is None: self.permission = self.__existing.permission if self.user is None: self.user = self.__existing.user if self.obj is None: self.obj = self.__existing.obj elif not isinstance(self.obj, Entity): self.obj = self.__existing.obj if self.user is None: self.user = current_user setattr(g, "__form_ctx__", self) return self def __exit__(self, exc_type, exc_val, exc_tb): if not has_app_context(): return setattr(g, "__form_ctx__", self.__existing) class Form(BaseForm): _groups = OrderedDict() #: :class:`FormPermissions` instance _permissions = None def __init__(self, *args, **kwargs): permission = kwargs.pop("permission", None) user = kwargs.pop("user", None) obj = kwargs.get("obj") form_ctx = FormContext(permission=permission, user=user, obj=obj) if kwargs.get("csrf_enabled") is None and not has_app_context(): # form instanciated without app context and without explicit csrf # parameter: disable csrf since it requires current_app. # # If there is a prefix, it's probably a subform (in a fieldform of # fieldformlist): csrf is not required. If there is no prefix: let error # happen. if kwargs.get("prefix"): kwargs["csrf_enabled"] = False with form_ctx as ctx: super(Form, self).__init__(*args, **kwargs) self._field_groups = {} # map field -> group if not isinstance(self.__class__._groups, OrderedDict): self.__class__._groups = OrderedDict(self.__class__._groups) for label, fields in self._groups.items(): self._groups[label] = list(fields) self._field_groups.update(dict.fromkeys(fields, label)) if ctx.permission and self._permissions is not None: # we are going to alter groups: copy dict on instance to preserve class # definition self._groups = OrderedDict() for label, fields in self.__class__._groups.items(): self._groups[label] = list(fields) has_permission = partial( self._permissions.has_permission, ctx.permission, obj=ctx.obj, user=ctx.user, ) empty_form = not has_permission() for field_name in list(self._fields): if empty_form or not has_permission(field=field_name): logger.debug( "{}(permission={!r}): field {!r}: removed" "".format( self.__class__.__name__, ctx.permission, field_name ) ) del self[field_name] group = self._field_groups.get(field_name) if group: self._groups[group].remove(field_name) def _get_translations(self): return BabelTranslation def _fields_for_group(self, group): for group_name, field_names in self._groups: if group == group_name: fields = field_names break else: raise ValueError("Group %s not found", repr(group)) return fields def _has_required(self, group=None, fields=()): if group is not None: fields = self._fields_for_group(group) return any(self[f].flags.required for f in fields) def _count_errors(self, group=None, fields=()): if group is not None: fields = self._fields_for_group(group) return len([1 for f in fields if self[f].errors]) ModelForm = model_form_factory(Form) # PATCH wtforms.field.core.Field #################### _PATCHED = False if not _PATCHED: Field.view_template = None _wtforms_Field_init = Field.__init__ def _core_field_init(self, *args, **kwargs): view_widget = None if "view_widget" in kwargs: view_widget = kwargs.pop("view_widget") _wtforms_Field_init(self, *args, **kwargs) if view_widget is None: view_widget = self.widget self.view_widget = view_widget patch_logger.info(Field.__init__) Field.__init__ = _core_field_init del _core_field_init def _core_field_repr(self): """`__repr__` that shows the name of the field instance. Useful for tracing field errors (like in Sentry). """ return "<{}.{} at 0x{:x} name={!r}>".format( self.__class__.__module__, self.__class__.__name__, id(self), self.name ) patch_logger.info(Field.__module__ + ".Field.__repr__") Field.__repr__ = _core_field_repr del _core_field_repr # support 'widget_options' for some custom widgets _wtforms_Field_render = Field.__call__ def _core_field_render(self, **kwargs): if "widget_options" in kwargs and not kwargs["widget_options"]: kwargs.pop("widget_options") return _wtforms_Field_render(self, **kwargs) patch_logger.info(Field.__call__) Field.__call__ = _core_field_render del _core_field_render def render_view(self, **kwargs): """Render data.""" if "widget_options" in kwargs and not kwargs["widget_options"]: kwargs.pop("widget_options") if hasattr(self.view_widget, "render_view"): return self.view_widget.render_view(self, **kwargs) return DefaultViewWidget().render_view(self, **kwargs) patch_logger.info("Add method %s.Field.render_view" % Field.__module__) Field.render_view = render_view del render_view def is_hidden(self): """WTForms is not consistent with hidden fields, since `flags.hidden` is not set on `HiddenField` :-(""" return self.flags.hidden or isinstance(self, HiddenField) patch_logger.info("Add method %s.Field.is_hidden" % Field.__module__) Field.is_hidden = property(is_hidden) del is_hidden _PATCHED = True # END PATCH wtforms.field.core.Field ################# PK!FQ iiabilian/web/forms/fields.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals import datetime import logging import operator from functools import partial import babel import babel.dates import sqlalchemy as sa import sqlalchemy.exc from flask import current_app from flask.helpers import locked_cached_property from flask_babel import format_date, format_datetime, get_locale, get_timezone from flask_login import current_user from flask_wtf.file import FileField as BaseFileField from six import PY2, string_types from wtforms import Field from wtforms import FieldList as BaseFieldList from wtforms import FormField as BaseFormField from wtforms import SelectField, SelectFieldBase, SelectMultipleField, \ ValidationError from wtforms.compat import text_type from wtforms.ext.csrf import SecureForm from wtforms.validators import DataRequired, Optional from wtforms_alchemy import ModelFieldList as BaseModelFieldList from wtforms_alchemy import ModelFormField as BaseModelFormField from wtforms_sqlalchemy.fields import has_identity_key from abilian import i18n from abilian.core.extensions import db from abilian.core.util import utc_dt from .util import babel2datetime from .widgets import DateInput, DateTimeInput, FileInput, Select2, Select2Ajax __all__ = [ "ModelFieldList", "FileField", "DateField", "DateTimeField", "Select2Field", "Select2MultipleField", "QuerySelect2Field", "JsonSelect2Field", "JsonSelect2MultipleField", "FormField", ] class FormField(BaseFormField): """Discard csrf_token on subform.""" def process(self, *args, **kwargs): super(FormField, self).process(*args, **kwargs) if isinstance(self.form, SecureForm): # don't create errors because of subtoken self._subform_csrf = self.form["csrf_token"] del self.form["csrf_token"] @property def data(self): if not isinstance(self.form, SecureForm): return self.form.data # SecureForm will try to pop 'csrf_token', but we removed it during # process self.form._fields["csrf_token"] = self._subform_csrf data = self.form.data del self.form["csrf_token"] return data class ModelFormField(FormField, BaseModelFormField): """Discard csrf_token on subform.""" class FilterFieldListMixin(object): def validate(self, form, extra_validators=()): to_remove = [] for field in self.entries: is_subform = isinstance(field, BaseFormField) data = field.data.values() if is_subform else [field.data] if not any(data): # all inputs empty: discard row to_remove.append(field) for field in to_remove: self.entries.remove(field) if self.entries: # setting raw_data enables validator to function properly # 1) we have entries so a subfield is not empty # 2) FieldList by default has an optional() validator # 3) by setting raw_data optional() does not reset the errors dict # -> subfields errors are propagated self.raw_data = [True] return super(FilterFieldListMixin, self).validate(form, extra_validators) class FieldList(FilterFieldListMixin, BaseFieldList): pass class ModelFieldList(FilterFieldListMixin, BaseModelFieldList): """Filter empty entries before saving and refills before displaying.""" def __init__(self, *args, **kwargs): super(ModelFieldList, self).__init__(*args, **kwargs) # build visible field list for widget. We must do it during form # instanciation so as to have permission filtering field_names = [] labels = [] fieldsubform = self.unbound_field.bind(form=None, name="dummy", _meta=self.meta) subform = fieldsubform.form_class(csrf_enabled=False) for f in subform: if f.is_hidden: continue name = f.short_name field_names.append(name) labels.append(f.label.text if f.label else f.name) self._field_names = field_names self._field_labels = labels self._field_nameTolabel = dict(zip(self._field_names, self._field_labels)) def __call__(self, **kwargs): """Refill with default min_entry, which were possibly removed by FilterFieldListMixin. Mandatory for proper function of DynamicRowWidget which clones an existing field """ while len(self) < self.min_entries: self.append_entry() return super(ModelFieldList, self).__call__(**kwargs) class FileField(BaseFileField): """Support 'multiple' attribute, enabling html5 multiple file input in widget. Can store file using a related model. :param blob_attr: attribute name to store / retrieve value on related model. Used if `name` is a relationship on model. Defauts to `'value'` """ multiple = False widget = FileInput() blob = None blob_attr = "value" def __init__(self, *args, **kwargs): try: self.multiple = kwargs.pop("multiple") except KeyError: self.multiple = False self.blob_attr = kwargs.pop("blob_attr", self.__class__.blob_attr) allow_delete = kwargs.pop("allow_delete", None) validators = list(kwargs.get("validators", [])) self.upload_handles = [] self.delete_files_index = [] self._has_uploads = False if allow_delete is not None: if any( isinstance(v, DataRequired if allow_delete else Optional) for v in validators ): raise ValueError( "Field validators are conflicting with `allow_delete`," "validators={!r}, allow_delete={!r}".format( validators, allow_delete ) ) if not allow_delete: validators.append(DataRequired()) kwargs["validators"] = validators BaseFileField.__init__(self, *args, **kwargs) @property def allow_delete(self): """Property for legacy code. Test `field.flags.required` instead. """ return not self.flags.required def __call__(self, **kwargs): if "multiple" not in kwargs and self.multiple: kwargs["multiple"] = "multiple" return BaseFileField.__call__(self, **kwargs) def has_file(self): return self._has_uploads def process(self, formdata, *args, **kwargs): delete_arg = "__{name}_delete__".format(name=self.name) self.delete_files_index = ( formdata.getlist(delete_arg) if formdata and delete_arg in formdata else [] ) return super(FileField, self).process(formdata, *args, **kwargs) def process_data(self, value): if isinstance(value, db.Model): self.blob = value value = getattr(value, self.blob_attr) self.object_data = value return super(FileField, self).process_data(value) def process_formdata(self, valuelist): uploads = current_app.extensions["uploads"] if self.delete_files_index: self.data = None return if valuelist: self.upload_handles = valuelist handle = valuelist[0] fileobj = uploads.get_file(current_user, handle) if fileobj is None: # FIXME: this is a validation task raise ValueError("File with handle {!r} not found".format(handle)) meta = uploads.get_metadata(current_user, handle) filename = meta.get("filename", handle) mimetype = meta.get("mimetype") stream = fileobj.open("rb") stream.filename = filename if mimetype: stream.content_type = mimetype stream.mimetype = mimetype self.data = stream self._has_uploads = True def populate_obj(self, obj, name): """Store file.""" from abilian.core.models.blob import Blob delete_value = self.allow_delete and self.delete_files_index if not self.has_file() and not delete_value: # nothing uploaded, and nothing to delete return state = sa.inspect(obj) mapper = state.mapper if name not in mapper.relationships: # directly store in database return super(FileField, self).populate_obj(obj, name) rel = getattr(mapper.relationships, name) if rel.uselist: raise ValueError("Only single target supported; else use ModelFieldList") if delete_value: setattr(obj, name, None) return # FIXME: propose option to always create a new blob cls = rel.mapper.class_ val = getattr(obj, name) if val is None: val = cls() setattr(obj, name, val) data = "" if self.has_file(): data = self.data if not issubclass(cls, Blob): data = data.read() setattr(val, self.blob_attr, data) class DateTimeField(Field): widget = DateTimeInput() def __init__(self, label=None, validators=None, use_naive=True, **kwargs): """ :param use_naive: if `False`, dates are considered entered using user's timezone; different users with different timezones will see corrected date/time. For storage dates are always stored using UTC. """ self.raw_data = kwargs.pop("raw_data", None) super(DateTimeField, self).__init__(label, validators, **kwargs) self.use_naive = use_naive def _value(self): if self.raw_data: return " ".join(self.raw_data) else: locale = get_locale() date_fmt = locale.date_formats["short"].pattern # force numerical months and 4 digit years date_fmt = ( date_fmt.replace("MMMM", "MM") .replace("MMM", "MM") .replace("yyyy", "y") .replace("yy", "y") .replace("y", "yyyy") ) time_fmt = locale.time_formats["short"] # Workaround bug in Babel (at least <= 2.4) under Python 3 if not PY2: time_fmt = time_fmt.pattern dt_fmt = locale.datetime_formats["short"].format(time_fmt, date_fmt) return format_datetime(self.data, dt_fmt) if self.data else "" def process_data(self, value): if value is not None: if not value.tzinfo: if self.use_naive: value = get_timezone().localize(value) else: value = utc_dt(value) if not self.use_naive: value = value.astimezone(get_timezone()) super(DateTimeField, self).process_data(value) def process_formdata(self, valuelist): if valuelist: date_str = " ".join(valuelist) locale = get_locale() date_fmt = locale.date_formats["short"] date_fmt = babel2datetime(date_fmt) date_fmt = date_fmt.replace("%B", "%m").replace( "%b", "%m" ) # force numerical months time_fmt = locale.time_formats["short"] time_fmt = babel2datetime(time_fmt) datetime_fmt = "{} | {}".format(date_fmt, time_fmt) try: self.data = datetime.datetime.strptime(date_str, datetime_fmt) if not self.use_naive: tz = get_timezone() if self.data.tzinfo: self.data = self.data.astimezone(tz) else: self.data = tz.localize(self.data) # convert to UTC self.data = utc_dt(self.data) except ValueError: self.data = None raise ValueError(self.gettext("Not a valid datetime value")) def populate_obj(self, obj, name): dt = self.data if dt and self.use_naive: dt = dt.replace(tzinfo=None) setattr(obj, name, dt) class DateField(Field): """A text field which stores a `datetime.date` matching a format.""" widget = DateInput() def __init__(self, label=None, validators=None, **kwargs): super(DateField, self).__init__(label, validators, **kwargs) def _value(self): if self.raw_data: return " ".join(self.raw_data) else: date_fmt = get_locale().date_formats["short"].pattern # force numerical months and 4 digit years date_fmt = ( date_fmt.replace("MMMM", "MM") .replace("MMM", "MM") .replace("yyyy", "y") .replace("yy", "y") .replace("y", "yyyy") ) return format_date(self.data, date_fmt) if self.data else "" def process_formdata(self, valuelist): valuelist = [i for i in valuelist if i.strip()] if valuelist: date_str = " ".join(valuelist) date_fmt = get_locale().date_formats["short"] date_fmt = babel2datetime(date_fmt) date_fmt = date_fmt.replace("%B", "%m").replace("%b", "%m") try: strptime = datetime.datetime.strptime self.data = strptime(date_str, date_fmt).date() except (ValueError, TypeError): self.data = None raise ValueError(self.gettext("Not a valid datetime value")) else: self.data = None class Select2Field(SelectField): """Allows choices to be a function instead of an iterable.""" widget = Select2() @property def choices(self): choices = self._choices return choices() if callable(choices) else choices @choices.setter def choices(self, choices): self._choices = choices class Select2MultipleField(SelectMultipleField): widget = Select2(multiple=True) multiple = True @property def choices(self): choices = self._choices return choices() if callable(choices) else choices @choices.setter def choices(self, choices): self._choices = choices class QuerySelect2Field(SelectFieldBase): """COPY/PASTED (and patched) from WTForms! Will display a select drop-down field to choose between ORM results in a sqlalchemy `Query`. The `data` property actually will store/keep an ORM model instance, not the ID. Submitting a choice which is not in the query will result in a validation error. This field only works for queries on models whose primary key column(s) have a consistent string representation. This means it mostly only works for those composed of string and integer types. For the most part, the primary keys will be auto-detected from the model, alternately pass a one-argument callable to `get_pk` which can return a unique comparable key. The `query` property on the field can be set from within a view to assign a query per-instance to the field. If the property is not set, the `query_factory` callable passed to the field constructor will be called to obtain a query. Specify `get_label` to customize the label associated with each option. If a string, this is the name of an attribute on the model object to use as the label text. If a one-argument callable, this callable will be passed model instance and expected to return the label text. Otherwise, the model object's `__str__` or `__unicode__` will be used. :param allow_blank: DEPRECATED. Use optional()/required() validators instead. """ def __init__( self, label=None, validators=None, query_factory=None, get_pk=None, get_label=None, allow_blank=False, blank_text="", widget=None, multiple=False, collection_class=list, **kwargs ): if widget is None: widget = Select2(multiple=multiple) kwargs["widget"] = widget self.multiple = multiple self.collection_class = collection_class if validators is None: validators = [] if not any(isinstance(v, (Optional, DataRequired)) for v in validators): logger = logging.getLogger(__name__ + "." + self.__class__.__name__) logger.warning( 'Use deprecated parameter `allow_blank` for field "{}".'.format(label) ) if not allow_blank: validators.append(DataRequired()) super(QuerySelect2Field, self).__init__(label, validators, **kwargs) # PATCHED! if query_factory: self.query_factory = query_factory if get_pk is None: if not has_identity_key: raise Exception( "The sqlalchemy identity_key function could not be imported." ) self.get_pk = self._get_pk_from_identity else: self.get_pk = get_pk if get_label is None: self.get_label = lambda x: x elif isinstance(get_label, string_types): self.get_label = operator.attrgetter(get_label) else: self.get_label = get_label self.allow_blank = allow_blank self.blank_text = blank_text self.query = None self._object_list = None @staticmethod def _get_pk_from_identity(obj): """Copied / pasted, and fixed, from WTForms_sqlalchemy due to issue w/ SQLAlchemy >= 1.2.""" from sqlalchemy.orm.util import identity_key cls, key = identity_key(instance=obj)[0:2] return ":".join(text_type(x) for x in key) def _get_data(self): formdata = self._formdata if formdata is not None: if not self.multiple: formdata = [formdata] formdata = set(formdata) data = [obj for pk, obj in self._get_object_list() if pk in formdata] if all(hasattr(x, "name") for x in data): data = sorted(data, key=lambda x: x.name) else: data = sorted(data, key=lambda x: str(x)) if data: if not self.multiple: data = data[0] self._set_data(data) return self._data def _set_data(self, data): if self.multiple and not isinstance(data, self.collection_class): data = self.collection_class(data) if data else self.collection_class() self._data = data self._formdata = None data = property(_get_data, _set_data) def _get_object_list(self): if self._object_list is None: query = self.query or self.query_factory() get_pk = self.get_pk self._object_list = [(text_type(get_pk(obj)), obj) for obj in query] return self._object_list def iter_choices(self): if not self.flags.required: yield (None, None, self.data == [] if self.multiple else self.data is None) predicate = ( operator.contains if (self.multiple and self.data is not None) else operator.eq ) # remember: operator.contains(b, a) ==> a in b # so: obj in data ==> contains(data, obj) predicate = partial(predicate, self.data) for pk, obj in self._get_object_list(): yield (pk, self.get_label(obj), predicate(obj)) def process_formdata(self, valuelist): if not valuelist: self.data = [] if self.multiple else None else: self._data = None if not self.multiple: valuelist = valuelist[0] self._formdata = valuelist def pre_validate(self, form): if not self.allow_blank or self.data is not None: data = self.data if not self.multiple: data = [data] if data is not None else [] elif not data: # multiple values: ensure empty list (data may be None) data = [] data = set(data) valid = {obj for pk, obj in self._get_object_list()} if data - valid: raise ValidationError(self.gettext("Not a valid choice")) class JsonSelect2Field(SelectFieldBase): """TODO: rewrite this docstring. This is copy-pasted from QuerySelectField. Will display a select drop-down field to choose between ORM results in a sqlalchemy `Query`. The `data` property actually will store/keep an ORM model instance, not the ID. Submitting a choice which is not in the query will result in a validation error. This field only works for queries on models whose primary key column(s) have a consistent string representation. This means it mostly only works for those composed of string and integer types. For the most part, the primary keys will be auto-detected from the model, alternately pass a one-argument callable to `get_pk` which can return a unique comparable key. The `query` property on the field can be set from within a view to assign a query per-instance to the field. If the property is not set, the `query_factory` callable passed to the field constructor will be called to obtain a query. Specify `get_label` to customize the label associated with each option. If a string, this is the name of an attribute on the model object to use as the label text. If a one-argument callable, this callable will be passed model instance and expected to return the label text. Otherwise, the model object's `__str__` or `__unicode__` will be used. If `allow_blank` is set to `True`, then a blank choice will be added to the top of the list. Selecting this choice will result in the `data` property being `None`. The label for this blank choice can be set by specifying the `blank_text` parameter. :param model_class: can be an sqlalchemy model, or a string with model name. The model will be looked up in sqlalchemy class registry on first access. This allows to use a model when it cannot be imported during field declaration. """ def __init__( self, label=None, validators=None, ajax_source=None, widget=None, blank_text="", model_class=None, multiple=False, **kwargs ): self.multiple = multiple if widget is None: widget = Select2Ajax(multiple=self.multiple) kwargs["widget"] = widget super(JsonSelect2Field, self).__init__(label, validators, **kwargs) self.ajax_source = ajax_source self._model_class = model_class self.allow_blank = not self.flags.required self.blank_text = blank_text @locked_cached_property def model_class(self): cls = self._model_class if isinstance(cls, type) and issubclass(cls, db.Model): return cls reg = db.Model._decl_class_registry return reg[cls] def iter_choices(self): if not self.flags.required: yield (None, None, self.data is None) data = self.data if not self.multiple: if data is None: raise StopIteration data = [data] elif not data: raise StopIteration for obj in data: yield (obj.id, obj.name, True) def _get_data(self): formdata = self._formdata if formdata: if not self.multiple: formdata = [formdata] data = [ self.model_class.query.get(int(pk)) for pk in formdata if pk not in ("", None) ] if not self.multiple: data = data[0] if data else None self._set_data(data) return self._data def _set_data(self, data): self._data = data self._formdata = None data = property(_get_data, _set_data) def process_formdata(self, valuelist): if not valuelist: self.data = [] if self.multiple else None else: self._data = None if hasattr(self.widget, "process_formdata"): # might need custom deserialization, i.e Select2 3.x with multiple + # ajax valuelist = self.widget.process_formdata(valuelist) if not self.multiple: valuelist = valuelist[0] self._formdata = valuelist def populate_obj(self, obj, name): data = self.data try: state = sa.inspect(obj) except sa.exc.NoInspectionAvailable: return super(JsonSelect2Field, self).populate_obj(obj, name) relations = state.mapper.relationships if self.multiple and name in relations: prop = relations[name] if prop.collection_class: # data is a list, try to convert to actual type; generally # `set()` data = prop.collection_class(data) setattr(obj, name, data) class JsonSelect2MultipleField(JsonSelect2Field): # legacy class, now use JsonSelect2Field(multiple=True) pass class LocaleSelectField(SelectField): widget = Select2() def __init__(self, *args, **kwargs): kwargs["coerce"] = LocaleSelectField.coerce kwargs["choices"] = [ locale_info for locale_info in i18n.supported_app_locales() ] super(LocaleSelectField, self).__init__(*args, **kwargs) @staticmethod def coerce(value): if isinstance(value, babel.Locale): return value elif isinstance(value, string_types): return babel.Locale.parse(value) elif value is None: return None raise ValueError( "Value cannot be converted to Locale(), or is not None, {!r}".format(value) ) def iter_choices(self): if not self.flags.required: yield (None, None, self.data is None) for locale, label in i18n.supported_app_locales(): yield (locale.language, label.capitalize(), locale == self.data) class TimezoneField(SelectField): widget = Select2() def __init__(self, *args, **kwargs): kwargs["coerce"] = babel.dates.get_timezone kwargs["choices"] = [tz_info for tz_info in i18n.timezones_choices()] super(TimezoneField, self).__init__(*args, **kwargs) def iter_choices(self): if not self.flags.required: yield (None, None, self.data is None) for tz, label in i18n.timezones_choices(): yield (tz.zone, label, tz == self.data) PK!і*llabilian/web/forms/filters.py# coding=utf-8 """Field filters for WTForm.""" from __future__ import absolute_import, division, print_function, \ unicode_literals from six import string_types __all__ = ["strip", "uppercase", "lowercase"] def strip(data): """Strip data if data is a string.""" if data is None: return "" if not isinstance(data, string_types): return data return data.strip() def uppercase(data): if not isinstance(data, string_types): return data return data.upper() def lowercase(data): if not isinstance(data, string_types): return data return data.lower() PK!8Pwmmabilian/web/forms/tests.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals import datetime import mock import pytz from wtforms.form import Form from abilian.core.entities import Entity from abilian.services.security import READ, WRITE, Anonymous, Owner, Role from . import FormPermissions, fields, filters def user_tz(): # This one is GMT+8 and has no DST (tests should pass any time in year) return "Asia/Hong_Kong" USER_TZ = pytz.timezone(user_tz()) # test filters def test_strip(): assert filters.strip(None) == "" assert filters.strip(4) == 4 assert filters.strip(" a string ") == "a string" assert filters.strip(" voilà ") == "voilà" def test_uppercase(): assert filters.uppercase(None) is None assert filters.uppercase(4) == 4 assert filters.uppercase(" a string ") == " A STRING " assert filters.uppercase(" Voilà ") == " VOILÀ " def test_lowercase(): assert filters.lowercase(None) is None assert filters.lowercase(4) == 4 assert filters.lowercase(" A STRING ") == " a string " assert filters.lowercase(" VOILÀ ") == " voilà " # FormPermissions def test_form_permissions_controller(): security_mock = mock.Mock() has_role = security_mock.has_role = mock.Mock() has_role.return_value = True current_app_mock = mock.Mock() current_app_mock.services = {"security": security_mock} MarkRole = Role("tests:mark-role") _MARK = object() _ENTITY_MARK = Entity() with mock.patch("abilian.services.current_app", current_app_mock): # default role fp = FormPermissions() assert fp.has_permission(READ) assert has_role.called assert has_role.call_args[-1]["role"] == [Anonymous] has_role.reset_mock() assert fp.has_permission(READ, obj=_MARK) assert not has_role.called has_role.reset_mock() assert fp.has_permission(READ, obj=_ENTITY_MARK) assert has_role.called assert has_role.call_args[-1]["object"] is _ENTITY_MARK # change default has_role.reset_mock() fp = FormPermissions(default=MarkRole) fp.has_permission(READ) assert has_role.call_args[-1]["role"] == [MarkRole] has_role.reset_mock() fp.has_permission(READ, field="test") assert has_role.call_args[-1]["role"] == [MarkRole] has_role.reset_mock() fp = FormPermissions(default=MarkRole, read=Anonymous) fp.has_permission(READ) assert has_role.call_args[-1]["role"] == [Anonymous] has_role.reset_mock() fp.has_permission(READ, field="test") assert has_role.call_args[-1]["role"] == [MarkRole] has_role.reset_mock() fp.has_permission(WRITE) assert has_role.call_args[-1]["role"] == [MarkRole] # field roles has_role.reset_mock() fp = FormPermissions( default=MarkRole, read=Anonymous, fields_read={"test": Owner} ) fp.has_permission(READ) assert has_role.call_args[-1]["role"] == [Anonymous] has_role.reset_mock() fp.has_permission(READ, field="test") assert has_role.call_args[-1]["role"] == [Owner] has_role.reset_mock() fp.has_permission(READ, field="test") assert has_role.call_args[-1]["role"] == [Owner] # dynamic roles has_role.reset_mock() dyn_roles = mock.Mock() dyn_roles.return_value = [MarkRole] fp = FormPermissions(read=dyn_roles) fp.has_permission(READ) assert dyn_roles.call_args == [{"permission": READ, "field": None, "obj": None}] assert has_role.call_args[-1]["role"] == [MarkRole] has_role.reset_mock() dyn_roles.reset_mock() fp = FormPermissions(read=[Owner, dyn_roles]) fp.has_permission(READ) assert dyn_roles.call_args == [{"permission": READ, "field": None, "obj": None}] assert has_role.call_args[-1]["role"] == [Owner, MarkRole] def patch_babel(app): app.extensions["babel"].timezone_selector_func = None app.extensions["babel"].timezoneselector(user_tz) def test_datetime_field(app): """Test fields supports date with year < 1900.""" assert "fr" in app.config["BABEL_ACCEPT_LANGUAGES"] patch_babel(app) obj = mock.Mock() headers = {"Accept-Language": "fr-FR,fr;q=0.8"} with app.test_request_context(headers=headers): field = fields.DateTimeField(use_naive=False).bind(Form(), "dt") field.process_formdata(["17/06/1789 | 10:42"]) # 1789: applied offset for HongKong is equal to LMT+7:37:00, # thus we compare with tzinfo=user_tz expected_datetime = datetime.datetime(1789, 6, 17, 10, 42, tzinfo=USER_TZ) assert field.data == expected_datetime # UTC stored assert field.data.tzinfo is pytz.UTC # displayed in user current timezone assert field._value() == "17/06/1789 10:42" # non-naive mode: test process_data change TZ to user's TZ field.process_data(field.data) assert field.data.tzinfo is USER_TZ assert field.data == expected_datetime field.populate_obj(obj, "dt") assert obj.dt == expected_datetime # test more recent date: offset is GMT+8 field.process_formdata(["23/01/2011 | 10:42"]) expected_datetime = datetime.datetime(2011, 1, 23, 2, 42, tzinfo=pytz.utc) assert field.data == expected_datetime def test_datetime_field_naive(app): """Test fields supports date with year < 1900.""" patch_babel(app) obj = mock.Mock() headers = {"Accept-Language": "fr-FR,fr;q=0.8"} with app.test_request_context(headers=headers): # NAIVE mode: dates without timezone. Those are the problematic ones # when year < 1900: strptime will raise an Exception use naive dates; by # default field = fields.DateTimeField().bind(Form(), "dt") field.process_formdata(["17/06/1789 | 10:42"]) # UTC stored assert field.data.tzinfo is pytz.UTC expected_datetime = datetime.datetime(1789, 6, 17, 10, 42, tzinfo=pytz.UTC) assert field.data == expected_datetime # naive stored field.populate_obj(obj, "dt") assert obj.dt == datetime.datetime(1789, 6, 17, 10, 42) def test_datetime_field_force_4digit_year(app): # use 'en': short date pattern is 'M/d/yy' patch_babel(app) headers = {"Accept-Language": "en"} with app.test_request_context(headers=headers): field = fields.DateTimeField().bind(Form(), "dt") field.data = datetime.datetime(2011, 1, 23, 10, 42, tzinfo=pytz.utc) assert field._value() == "1/23/2011, 6:42 PM" def test_date_field(app): """Test fields supports date with year < 1900.""" patch_babel(app) headers = {"Accept-Language": "fr-FR,fr;q=0.8"} with app.test_request_context(headers=headers): field = fields.DateField().bind(Form(), "dt") field.process_formdata(["17/06/1789"]) assert field.data == datetime.date(1789, 6, 17) assert field._value() == "17/06/1789" def test_datefield_force_4digit_year(app): patch_babel(app) # use 'en': short date pattern is 'M/d/yy' headers = {"Accept-Language": "en"} with app.test_request_context(headers=headers): field = fields.DateField().bind(Form(), "dt") field.data = datetime.date(2011, 1, 23) assert field._value() == "1/23/2011" PK![X`""abilian/web/forms/util.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals from babel.dates import DateTimePattern, parse_pattern def babel2datetime(pattern): """Convert date format from babel (http://babel.pocoo.org/docs/dates/#date- fields)) to a format understood by datetime.strptime.""" if not isinstance(pattern, DateTimePattern): pattern = parse_pattern(pattern) map_fmt = { # days "d": "%d", "dd": "%d", "EEE": "%a", "EEEE": "%A", "EEEEE": "%a", # narrow name => short name # months "M": "%m", "MM": "%m", "MMM": "%b", "MMMM": "%B", # years "y": "%Y", "yy": "%Y", "yyyy": "%Y", # hours "h": "%I", "hh": "%I", "H": "%H", "HH": "%H", # minutes, "m": "%M", "mm": "%M", # seconds "s": "%S", "ss": "%S", # am/pm "a": "%p", } return pattern.format % map_fmt PK!t@wwabilian/web/forms/validators.py# coding=utf-8 """Validators. TODO: most of this is currently only stubs and needs to be implemented. NOTE: the `rule` property is supposed to be useful for generating client-side validation code. """ from __future__ import absolute_import, division, print_function, \ unicode_literals from wtforms import validators from wtforms.compat import string_types from abilian.i18n import _, _n from abilian.services import get_service __all__ = ( "equalto", "length", "numberrange", "optional", "required", "regexp", "email", "ipaddress", "macaddress", "url", "siret", "uuid", "anyof", "noneof", "flaghidden", "renderempty", "VALIDATORS", "siret_validator", ) class Rule(object): @property def rule(self): return None class Email(validators.Email): def __call__(self, form, field): if self.message is None: self.message = field.gettext("Invalid email address.") if field.data: super(Email, self).__call__(form, field) @property def rule(self): return {"email": True} class CorrectInputRequired(validators.DataRequired): def __call__(self, form, field): if ( field.data is None or (isinstance(field.data, string_types) and not field.data.strip()) or (isinstance(field.data, (list, dict)) and not field.data) ): if self.message is None: message = field.gettext("This field is required.") else: message = self.message field.errors[:] = [] raise validators.StopValidation(message) class Required(CorrectInputRequired): field_flags = ("required",) @property def rule(self): return {"required": True} class EqualTo(validators.EqualTo, Rule): pass class Length(Rule): """Validates the length of a string. :param min: The minimum required length of the string. If not provided, minimum length will not be checked. :param max: The maximum length of the string. If not provided, maximum length will not be checked. :param message: Error message to raise in case of a validation error. Can be interpolated using `%(min)d` and `%(max)d` if desired. Useful defaults are provided depending on the existence of min and max. """ def __init__(self, min=-1, max=-1, message=None): assert ( min != -1 or max != -1 ), "At least one of `min` or `max` must be specified." assert max == -1 or min <= max, "`min` cannot be more than `max`." self.min = min self.max = max self.message = message def __call__(self, form, field): field_data_length = field.data and len(field.data) or 0 if ( field_data_length < self.min or self.max != -1 and field_data_length > self.max ): message = self.message if message is None: if self.max == -1: message = _n( "Field must be at least %(min)d character long.", "Field must be at least %(min)d characters long.", self.min, min=self.min, ) elif self.min == -1: message = _n( "Field cannot be longer than %(max)d character.", "Field cannot be longer than %(max)d characters.", self.max, max=self.max, ) else: message = _( "Field must be between %(min)d and %(max)d characters long.", min=self.min, max=self.max, ) raise validators.ValidationError( message % {"min": self.min, "max": self.max, "length": field_data_length} ) class NumberRange(validators.NumberRange, Rule): pass class Optional(validators.Optional, Rule): pass class Regexp(validators.Regexp, Rule): pass class IPAddress(validators.IPAddress, Rule): pass class MacAddress(validators.MacAddress, Rule): pass class URL(validators.URL): @property def rule(self): return {"url": True} class UUID(validators.UUID, Rule): pass class AnyOf(validators.AnyOf, Rule): pass class NoneOf(validators.NoneOf, Rule): pass class FlagHidden(Rule): """Flag the field as hidden.""" field_flags = ("hidden",) def __call__(self, form, field): pass class AntiVirus(Rule): """Check content for viruses.""" field_flags = ("antivirus",) def __call__(self, form, field): svc = get_service("antivirus") if not svc: return res = svc.scan(field.data) if res is False: raise validators.ValidationError(_("Virus detected!")) class RenderEmpty(object): """Force display.""" field_flags = ("render_empty",) def __call__(self, form, field): pass class SIRET(RenderEmpty): pass def luhn(n): """Validate that a string made of numeric characters verify Luhn test. Used by siret validator. from http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers#Python https://en.wikipedia.org/wiki/Luhn_algorithm """ r = [int(ch) for ch in str(n)][::-1] return (sum(r[0::2]) + sum(sum(divmod(d * 2, 10)) for d in r[1::2])) % 10 == 0 # specific SIRET like for MONACO, i.e MONACOCONFO001 # - Principauté de Monaco "001" # - la Guadeloupe "458" # - la Martinique "462" # - la Guyane "496" # - la Réunion "372 SIRET_CODES = ("001", "458", "462", "496", "372") def siret_validator(): """Validate a SIRET: check its length (14), its final code, and pass it through the Luhn algorithm.""" def _validate_siret(form, field, siret=""): """SIRET validator. A WTForm validator wants a form and a field as parameters. We also want to give directly a siret, for a scripting use. """ if field is not None: siret = (field.data or "").strip() if len(siret) != 14: msg = _("SIRET must have exactly 14 characters ({count})").format( count=len(siret) ) raise validators.ValidationError(msg) if not all(("0" <= c <= "9") for c in siret): if not siret[-3:] in SIRET_CODES: msg = _( "SIRET looks like special SIRET but geographical " "code seems invalid (%(code)s)", code=siret[-3:], ) raise validators.ValidationError(msg) elif not luhn(siret): msg = _("SIRET number is invalid (length is ok: verify numbers)") raise validators.ValidationError(msg) return _validate_siret # These are the canonical names that should be used. equalto = EqualTo length = Length numberrange = NumberRange optional = Optional required = Required regexp = Regexp email = Email ipaddress = IPAddress macaddress = MacAddress url = URL siret = SIRET uuid = UUID anyof = AnyOf noneof = NoneOf flaghidden = FlagHidden renderempty = RenderEmpty VALIDATORS = { "email": email, "url": url, "uuid": uuid, "renderempty": renderempty, "siret": siret, "required": required, "optional": optional, } PK!ssabilian/web/forms/widgets.py# coding=utf-8 """Reusable widgets to be included in views. NOTE: code is currently quite messy. Needs to be refactored. """ from __future__ import absolute_import, division, print_function, \ unicode_literals import base64 import cgi import logging import re from collections import namedtuple from datetime import datetime from typing import Any, Dict, Optional, Text import bleach import sqlalchemy as sa import sqlalchemy.orm import wtforms from flask import Markup, current_app, g, json, render_template, \ render_template_string from flask_babel import format_date, format_datetime, format_number, get_locale from flask_login import current_user from flask_wtf.file import FileField from six import string_types, text_type from six.moves.urllib import parse from wtforms.widgets import HTMLString, Input from wtforms.widgets import PasswordInput as BasePasswordInput from wtforms.widgets import Select from wtforms.widgets import TextArea as BaseTextArea from wtforms.widgets import html_params from wtforms_alchemy import ModelFieldList from abilian.core.entities import Entity from abilian.core.models.blob import Blob from abilian.i18n import _, _l from abilian.services import image from abilian.services.image import get_format from abilian.web import url_for from abilian.web.filters import babel2datepicker, labelize from .util import babel2datetime logger = logging.getLogger(__name__) __all__ = [ "linkify_url", "text2html", "Column", "BaseTableView", "MainTableView", "RelatedTableView", "AjaxMainTableView", "SingleView", "Panel", "Row", "Chosen", "TagInput", "DateInput", "DefaultViewWidget", "BooleanWidget", "FloatWidget", "DateTimeWidget", "DateWidget", "MoneyWidget", "EmailWidget", "URLWidget", "ListWidget", "TabularFieldListWidget", "ModelListWidget", "Select2", "Select2Ajax", "RichTextWidget", "FileInput", "EntityWidget", "ImageInput", "TextArea", ] def linkify_url(value): """Tranform an URL pulled from the database to a safe HTML fragment.""" value = value.strip() rjs = r"[\s]*(&#x.{1,7})?".join(list("javascript:")) rvb = r"[\s]*(&#x.{1,7})?".join(list("vbscript:")) re_scripts = re.compile("({})|({})".format(rjs, rvb), re.IGNORECASE) value = re_scripts.sub("", value) url = value if not url.startswith("http://") and not url.startswith("https://"): url = "http://" + url url = parse.urlsplit(url).geturl() if '"' in url: url = url.split('"')[0] if "<" in url: url = url.split("<")[0] if value.startswith("http://"): value = value[len("http://") :] elif value.startswith("https://"): value = value[len("https://") :] if value.count("/") == 1 and value.endswith("/"): value = value[0:-1] return '{} '.format( url, value ) def text2html(text): text = text.strip() if re.search("<(p|br)>", text.lower()): return text if "\n" not in text: return text lines = text.split("\n") lines = [line for line in lines if line] paragraphs = ["

{}

".format(line) for line in lines] return Markup(bleach.clean("\n".join(paragraphs), tags=["p"])) class Column(object): def __init__(self, **kw): for k, w in kw.items(): setattr(self, k, w) class View(object): options = {} # type: Dict[Text, Any] def get_templates(self, specific_template_name, default_template): specific_template = self.options.get(specific_template_name) if specific_template: return [specific_template, default_template] else: return [default_template] # TODO: rewrite class BaseTableView(View): show_controls = False show_search = None paginate = False def __init__(self, columns, options=None): if self.show_search is None: self.show_search = self.show_controls self.init_columns(columns) self.name = "{}-{:d}".format( self.__class__.__name__.lower(), next(g.id_generator) ) if options is not None: self.options = options self.show_controls = self.options.get("show_controls", self.show_controls) self.show_search = self.options.get("show_search", self.show_controls) self.paginate = self.options.get("paginate", self.paginate) def init_columns(self, columns): # TODO self.columns = [] default_width = "{:2.0f}%".format(0.99 / len(columns) * 100) for col in columns: if isinstance(col, string_types): col = {"name": col, "width": default_width} assert isinstance(col, dict) col.setdefault("width", default_width) col.setdefault("sorting", ("asc", "desc")) if "label" not in col: col["label"] = labelize(col["name"]) self.columns.append(col) def render(self, entities, **kwargs): aoColumns = [] aaSorting = [] offset = 0 if self.show_controls: aoColumns.append({"asSorting": []}) offset = 1 for idx, c in enumerate(self.columns, offset): aoColumns.append({"asSorting": c["sorting"], "sWidth": str(c["width"])}) aaSorting.append([idx, c["sorting"][0]]) datatable_options = { "aaSorting": aaSorting, "aoColumns": aoColumns, "bFilter": self.show_search, "oLanguage": { "sSearch": self.options.get("search_label", _("Filter records:")) }, "bStateSave": False, "bPaginate": self.paginate, "sPaginationType": "bootstrap", "bLengthChange": False, "iDisplayLength": self.options.get("paginate_length", 50), } js = render_template_string( """ require( ['jquery', 'jquery.dataTables'], function($) { $('#{{ table_id }}').dataTable({{ options|tojson|safe }}); }); """, table_id=self.name, options=datatable_options, ) table = [] for entity in entities: table.append(self.render_line(entity)) templates = self.get_templates("template", "widgets/render_table.html") return Markup( render_template(templates, table=table, js=Markup(js), view=self, **kwargs) ) def render_line(self, entity): line = [] make_link_on = self.options.get("make_link_on") for col in self.columns: if isinstance(col, str): column_name = col build_url = url_for else: column_name = col["name"] build_url = col.get("url", url_for) value = entity attr = column_name.rsplit(".", 1) if len(attr) > 1: try: value = getattr(value, attr[0], "") value = value.display_value(attr[1]) except AttributeError: value = "" else: value = value.display_value(attr[0]) format = col.get("format") if format: cell = format(value) elif column_name in (make_link_on, "name") or col.get("linkable"): cell = Markup( '{}'.format( build_url(entity), cgi.escape(text_type(value)) ) ) elif isinstance(value, Entity): cell = Markup( '{}'.format( build_url(value), cgi.escape(value.name) ) ) elif isinstance(value, string_types) and ( value.startswith("http://") or value.startswith("www.") ): cell = Markup(linkify_url(value)) elif value in (True, False): cell = "\u2713" if value else "" # Unicode "Check mark" elif isinstance(value, list): cell = "; ".join(value) else: if not isinstance(value, (Markup,) + string_types): if value is None: value = "" else: value = text_type(value) cell = value line.append(cell) return line class MainTableView(BaseTableView): """Table view for main objects list.""" show_controls = True paginate = True class RelatedTableView(BaseTableView): """Table view for related objects list.""" show_controls = False paginate = False class AjaxMainTableView(View): """Variant of the MainTableView that gets content from AJAX requests. TODO: refactor all of this (currently code is copy/pasted!). """ show_controls = False paginate = True def __init__( self, columns, ajax_source, search_criterions=(), name=None, options=None ): self.init_columns(columns) self.ajax_source = ajax_source self.search_criterions = search_criterions self.name = name if name is not None else id(self) self.save_state = name is not None if options is not None: self.options = options def init_columns(self, columns): # TODO: compute the correct width for each column. self.columns = [] default_width = 0.99 / len(columns) for col in columns: if isinstance(col, str): col = {"name": col, "width": default_width} assert isinstance(col, dict) if "label" not in col: col["label"] = labelize(col["name"]) col.setdefault("sorting", ["asc", "desc"]) if not col["sorting"]: col.setdefault("sortable", False) else: col.setdefault("sortable", True) self.columns.append(col) def render(self): aoColumns = [{"asSorting": []}] if self.show_controls else [] aoColumns += [ {"asSorting": col["sorting"], "bSortable": col["sortable"]} for col in self.columns ] datatable_options = { "sDom": "fFriltip", "aoColumns": aoColumns, "bFilter": True, "oLanguage": { "sSearch": self.options.get("search_label", _("Filter records:")), "oPaginate": {"sPrevious": _("Previous"), "sNext": _("Next")}, "sLengthMenu": _("Entries per page: _MENU_"), "sInfo": _("Showing _START_ to _END_ of _TOTAL_ entries"), "sInfoEmpty": _("Showing _START_ to _END_ of _TOTAL_ entries"), "sInfoFiltered": _("(filtered from _MAX_ total entries)"), "sAddAdvancedFilter": _("Add a filter"), "sZeroRecords": _("No matching records found"), "sEmptyTable": _("No matching records found"), }, "bPaginate": self.paginate, "sPaginationType": "bootstrap", "bLengthChange": True, "iDisplayLength": 25, "bStateSave": self.save_state, "bProcessing": True, "bServerSide": True, "sAjaxSource": self.ajax_source, } if self.options.get("aaSorting", None): datatable_options["aaSorting"] = self.options.get("aaSorting") advanced_search_filters = [] for criterion in self.search_criterions: if not criterion.has_form_filter: continue d = { "name": criterion.name, "label": text_type(criterion.label), "type": criterion.form_filter_type, "args": criterion.form_filter_args, "unset": criterion.form_unset_value, } if criterion.has_form_default_value: d["defaultValue"] = criterion.form_default_value advanced_search_filters.append(d) if advanced_search_filters: datatable_options["aoAdvancedSearchFilters"] = advanced_search_filters return Markup( render_template( "widgets/render_ajax_table.html", datatable_options=datatable_options, view=self, ) ) def render_line(self, entity): line = [] for col in self.columns: if isinstance(col, str): column_name = col else: column_name = col["name"] value = entity.display_value(column_name) has_custom_display = False # Manual massage. # 'display_fun' gets value *and* entity: useful to perform # specific markup based on other entity values. # 'display_fmt' is for simple value formatting (format_date from # babel for example) if value is None: value = "" elif "display_fun" in col: has_custom_display = True value = col["display_fun"](entity, value) elif "display_fmt" in col: value = col["display_fmt"](value) if has_custom_display: cell = value elif column_name == "name": cell = Markup( '{}'.format(url_for(entity), cgi.escape(value)) ) elif isinstance(value, Entity): cell = Markup( '{}'.format(url_for(value), cgi.escape(value.name)) ) elif isinstance(value, string_types) and ( value.startswith("http://") or value.startswith("www.") ): cell = Markup(linkify_url(value)) elif col.get("linkable"): cell = Markup( '{}'.format( url_for(entity), cgi.escape(text_type(value)) ) ) else: cell = text_type(value) line.append(cell) return line # # Single object view # class SingleView(View): """View on a single object.""" def __init__(self, form, *panels, **options): self.form = form self.panels = panels self.options = options def render(self, item, form, related_views=()): mapper = sa.orm.class_mapper(item.__class__) panels = [] _to_skip = (None, False, 0, 0.0, "", "-") for panel in self.panels: data = {} field_name_iter = (fn for row in panel.rows for fn in row) for name in field_name_iter: field = form._fields[name] if field.is_hidden: continue value = field.data if not isinstance(field, FileField) and not field.flags.render_empty: if value in _to_skip: continue value = Markup(field.render_view(entity=item)) if value == "": # related models may have [] as value, but we don't discard this type # of value in order to let widget a chance to render something useful # like an 'add model' button. # # if it renders an empty string, there's really no point in rendering # a line for this empty field continue label = self.label_for(field, mapper, name) data[name] = (label, value) if data: panels.append((panel, data)) templates = self.get_templates("view_template", "widgets/render_single.html") ctx = { "view": self, "related_views": related_views, "entity": item, "panels": panels, "form": form, } return Markup(render_template(templates, **ctx)) def render_form(self, form, for_new=False, has_save_and_add_new=False): # Client-side rules for jQuery.validate # See: http://docs.jquery.com/Plugins/Validation/Methods#Validator rules = {} for field in form: rules_for_field = {} for validator in field.validators: rule_for_validator = getattr(validator, "rule", None) if rule_for_validator: rules_for_field.update(rule_for_validator) if rules_for_field: rules[field.name] = rules_for_field if rules: rules = Markup(json.dumps(rules)) else: rules = None templates = self.get_templates("edit_template", "widgets/render_for_edit.html") ctx = { "view": self, "form": form, "for_new": for_new, "has_save_and_add_new": has_save_and_add_new, "rules": rules, } return Markup(render_template(templates, **ctx)) def label_for(self, field, mapper, name): label = field.label if label is None: try: info = mapper.c[name].info label = info["label"] except (AttributeError, KeyError): pass if label is None: try: label = _(name) except KeyError: # i18n may be not initialized (in some unit tests for example) label = name return label # # Used to describe single entity views. # class Panel(object): """`Panel` and `Row` classes help implement a trivial internal DSL for specifying multi-column layouts in forms or object views. They are currently not really used, since we went with 1-column designs eventually. """ def __init__(self, label=None, *rows): self.label = label self.rows = rows def __iter__(self): return iter(self.rows) def __getitem__(self, item): return self.rows[item] def __len__(self): return len(self.rows) class Row(object): """`Panel` and `Row` classes help implement a trivial internal DSL for specifying multi-column layouts in forms or object views. They are currently not really used, since we went with 1-column designs eventually. """ def __init__(self, *cols): self.cols = cols def __iter__(self): return iter(self.cols) def __getitem__(self, item): return self.cols[item] def __len__(self): return len(self.cols) class ModelWidget(object): edit_template = "widgets/model_widget_edit.html" view_template = "widgets/model_widget_view.html" def __init__(self, edit_template=None, view_template=None): if edit_template is not None: self.edit_template = edit_template if view_template is not None: self.view_template = view_template def __call__(self, field, *args, **kwargs): return render_template(self.edit_template, form=field) def render_view(self, field, *args, **kwargs): _to_skip = (None, False, 0, 0.0, "", "-") rows = [] for f in field.form: if f.is_hidden: continue value = f.data if value in _to_skip and not f.flags.render_empty: continue value = Markup(f.render_view()) if value == "": # related models may have [] as value, but we don't discard this type # of value in order to let widget a chance to render something useful # like an 'add model' button. # # if it renders an empty string, there's really no point in rendering # a line for this empty field continue label = f.label rows.append((label, value)) return render_template(self.view_template, field=field, rows=rows) # Form field widgets ##################################################### class TextInput(wtforms.widgets.TextInput): """Support pre and post icons. An Icon can be a plain string, or an instance of :class:`abilian.web.action.Icon`. """ pre_icon = None # type: Optional[Text] post_icon = None # type: Optional[Text] def __init__(self, input_type=None, pre_icon=None, post_icon=None, *args, **kwargs): super(TextInput, self).__init__(input_type, *args, **kwargs) if pre_icon is not None: self.pre_icon = pre_icon if post_icon is not None: self.post_icon = post_icon def __call__(self, field, *args, **kwargs): if not any((self.pre_icon, self.post_icon)): return super(TextInput, self).__call__(field, *args, **kwargs) kwargs.setdefault("type", self.input_type) if "value" not in kwargs: kwargs["value"] = field._value() params = self.html_params(name=field.name, **kwargs) return Markup( render_template_string( """
{%- if widget.pre_icon %}
{{ widget.pre_icon }}
{%- endif %} {%- if widget.post_icon %}
{{ widget.post_icon }}
{%- endif %}
""", widget=self, params=params, ) ) @property def typename(self): return self.__class__.__name__.lower() class TextArea(BaseTextArea): """Accepts "resizeable" parameter: "vertical", "horizontal", "both", None.""" _resizeable_valid = ("vertical", "horizontal", "both", None) resizeable = None rows = None def __init__(self, resizeable=None, rows=None, *args, **kwargs): BaseTextArea.__init__(self, *args, **kwargs) if resizeable not in self._resizeable_valid: raise ValueError( "Invalid value for resizeable: {}, valid values are: {!r}" "".format(resizeable, self._resizeable_valid) ) if resizeable: self.resizeable = "resizeable-" + resizeable else: self.resizeable = "not-resizeable" if rows: self.rows = int(rows) def __call__(self, *args, **kwargs): if self.resizeable: css = kwargs.get("class_", "") kwargs["class_"] = css + " " + self.resizeable if self.rows and "rows" not in kwargs: kwargs["rows"] = self.rows return super(TextArea, self).__call__(*args, **kwargs) class FileInput(object): """Renders a file input. Inspired from http://www.abeautifulsite.net/blog/2013/08/whipping- file-inputs-into-shape-with-bootstrap-3/ """ def __init__(self, template="widgets/file_input.html"): self.template = template def __call__(self, field, **kwargs): kwargs.setdefault("id", field.id) kwargs["name"] = field.name kwargs["type"] = "file" kwargs["disabled"] = "disabled" # JS widget will activate it input_elem = "".format(html_params(**kwargs)) button_label = _("Add file") if "multiple" in kwargs else _("Select file") existing = self.build_exisiting_files_list(field) uploads = self.build_uploads_list(field) if not field.multiple and uploads: # single file field: exising file replaced by new upload, don't show # existing existing = [] else: for data in existing: # this might be a very big bytes object: in any case it will not be used # in widget's template, and during development it makes very large pages # due to debugtoolbar capturing template parameters del data["file"] ctx = { "id": field.id, "field": field, "widget": self, "input": input_elem, "button_label": button_label, "existing": existing, "uploaded": uploads, } return Markup(render_template(self.template, **ctx)) def build_exisiting_files_list(self, field): existing = [] blob = None object_data = field.object_data if not object_data: return existing if not field.multiple: object_data = [object_data] blob = getattr(field, "blob") for idx, data in enumerate(object_data): if data is not None: existing.append( { "file": data, "size": len(bytes(data)), "delete": idx in field.delete_files_index, } ) if hasattr(data, "filename"): existing[-1]["filename"] = data.filename elif blob and isinstance(blob, Blob): existing[-1]["filename"] = blob.meta.get("filename", "") return existing def build_uploads_list(self, field): uploads = current_app.extensions["uploads"] uploaded = [] for handle in field.upload_handles: file_ = uploads.get_file(current_user, handle) if file_ is None: continue meta = uploads.get_metadata(current_user, handle) uploaded.append( { "file": file_, "handle": handle, "filename": meta.get("filename", handle), "size": file_.stat().st_size, } ) return uploaded class ImageInput(FileInput): """An image widget with client-side preview. To show current image field data has to provide an attribute named `url`. """ def __init__( self, template="widgets/image_input.html", width=120, height=120, resize_mode=image.CROP, valid_extensions=("jpg", "jpeg", "png"), ): super(ImageInput, self).__init__(template=template) self.resize_mode = resize_mode self.valid_extensions = valid_extensions self.width, self.height = width, height def build_exisiting_files_list(self, field): existing = super(ImageInput, self).build_exisiting_files_list(field) for data in existing: value = data["file"] if value: if hasattr(value, "url"): image_url = value.url else: image_url = self.get_b64_thumb_url( self.get_thumb(value, self.width, self.height) ) data["image_url"] = image_url return existing def build_uploads_list(self, field): uploaded = super(ImageInput, self).build_uploads_list(field) for data in uploaded: value = data["file"] if value: if hasattr(value, "url"): image_url = value.url else: with value.open("rb") as in_: image_url = self.get_b64_thumb_url( self.get_thumb(in_, self.width, self.height) ) data["image_url"] = image_url return uploaded def get_thumb(self, data, width, height): try: get_format(data) except IOError: return "" return image.resize(data, width, height, mode=self.resize_mode) def get_b64_thumb_url(self, img): if not img: return "" try: fmt = image.get_format(img).lower() except IOError: return "" thumb = base64.b64encode(img).decode("ascii") return "data:image/{format};base64,{img}".format(format=fmt, img=thumb) def render_view(self, field, **kwargs): data = field.data if not data: return "" try: get_format(data) except IOError: return "" width = kwargs.get("width", self.width) height = kwargs.get("heigth", self.height) thumb = self.get_thumb(data, width, height) width, height = image.get_size(thumb) tmpl = '' ctx = {"url": self.get_b64_thumb_url(thumb), "width": width, "height": height} return render_template_string(tmpl, **ctx) class Chosen(Select): """Extends the Select widget using the Chosen jQuery plugin.""" def __call__(self, field, **kwargs): kwargs.setdefault("id", field.id) params = html_params(name=field.name, **kwargs) html = ['") return HTMLString("".join(html)) @classmethod def render_option(cls, value, label, selected, **kwargs): options = dict(kwargs, value=value) if selected: options["selected"] = True params = html_params(**options) return HTMLString( "".format(params, cgi.escape(text_type(label))) ) class TagInput(Input): """Extends the Select widget using the Chosen jQuery plugin.""" def __call__(self, field, **kwargs): kwargs.setdefault("id", field.id) kwargs["class_"] = "tagbox" if "value" not in kwargs: kwargs["value"] = field._value() params = self.html_params(name=field.name, **kwargs) return HTMLString("".format(params)) class DateInput(Input): """Renders date inputs using the fancy Bootstrap Datepicker: https://github.com/eternicode/bootstrap-datepicker """ input_type = "date" def __call__(self, field, **kwargs): kwargs.setdefault("id", field.id) field_id = kwargs.pop("id") kwargs.setdefault("name", field.name) field_name = kwargs.pop("name") kwargs.pop("type", None) value = kwargs.pop("value", None) if value is None: value = field._value() if not value: value = "" date_fmt = kwargs.pop("format", None) if date_fmt is not None: date_fmt = ( date_fmt.replace("%", "") .replace("d", "dd") .replace("m", "mm") .replace("Y", "yyyy") ) else: date_fmt = get_locale().date_formats["short"].pattern date_fmt = babel2datepicker(date_fmt) date_fmt = date_fmt.replace("M", "m") # force numerical months attributes = { "class": "input-group date", "data-provide": "datepicker", "data-date": value, "data-date-format": date_fmt, "data-date-autoclose": "true", } s = "
\n".format(html_params(**attributes)) s += ' \n'.format( html_params(name=field_name, id=field_id, value=value, **kwargs) ) s += ' \n' s += "
\n" return Markup(s) def render_view(self, field, **kwargs): return format_date(field.data) if field.data else "" class TimeInput(Input): """Renders time inputs using boostrap timepicker: https://github.com/jdewit/bootstrap-timepicker """ template = "widgets/timepicker.html" def __init__( self, template=None, widget_mode="dropdown", h24_mode=True, minuteStep=1, showSeconds=False, secondStep=1, showInputs=False, disableFocus=False, modalBackdrop=False, ): Input.__init__(self) if template is not None: self.template = template self.widget_mode = widget_mode self.h24_mode = h24_mode self.minuteStep = minuteStep self.showSeconds = showSeconds self.secondStep = secondStep self.showInputs = showInputs self.disableFocus = disableFocus self.modalBackdrop = modalBackdrop self.strptime = "%H:%M" if self.h24_mode else "%I:%M %p" def __call__(self, field, **kwargs): kwargs.setdefault("id", field.id) field_id = kwargs.pop("id") value = kwargs.pop("value", None) if value is None: value = field._value() if not value: value = "" time_fmt = get_locale().time_formats["short"].format is_h12 = "%(h)s" in time_fmt or "%(K)s" in time_fmt input_params = { "data-template": self.widget_mode, "data-show-meridian": is_h12, "data-minute-step": self.minuteStep, "data-show-seconds": self.showSeconds, "data-second-step": self.secondStep, "data-show-inputs": self.showInputs, "data-disable-focus": self.disableFocus, "data-modal-backdrop": self.modalBackdrop, } input_params = {k: Markup(json.dumps(v)) for k, v in input_params.items()} ctx = { "id": field_id, "value": value, "field": field, "required": False, "timepicker_attributes": input_params, } return Markup(render_template(self.template, **ctx)) class DateTimeInput(object): """if corresponding field.raw_data exist it is used to initialize default date & time (raw_data example: ["10/10/16 | 09:00"])""" def __init__(self): self.date = DateInput() self.time = TimeInput() def __call__(self, field, **kwargs): kwargs.setdefault("id", field.id) field_id = kwargs.pop("id") kwargs.setdefault("name", field.name) field_name = kwargs.pop("name") locale = get_locale() date_fmt = locale.date_formats["short"].pattern date_fmt = babel2datetime(date_fmt) date_fmt = date_fmt.replace("%B", "%m").replace( "%b", "%m" ) # force numerical months time_fmt = "%H:%M" value = kwargs.pop("value", None) if value is None: if field.data: value = field.data date_value = value.strftime(date_fmt) if value else "" time_value = value.strftime(time_fmt) if value else "" elif field.raw_data: value = field.raw_data # example "10/10/16 | 09:00" value = "".join(value) value = value.split("|") try: date_value = datetime.strptime(value[0].strip(), date_fmt) except (ValueError, IndexError): date_value = "" try: time_value = value[1].strip() # example "09:00" except IndexError: time_value = "" else: date_value = "" time_value = "" return ( Markup( '
\n' '\n' "".format( id=field_id, name=field_name, date=date_value, time=time_value ) ) + self.date( field, id=field_id + "-date", name=field_name + "-date", value=date_value, ) + self.time( field, id=field_id + "-time", name=field_name + "-time", value=time_value, ) + Markup("
") ) class DefaultViewWidget(object): def render_view(self, field, **kwargs): value = field.object_data if isinstance(value, string_types): return text2html(value) else: # [], None and other must be rendered using empty string return text_type(value or "") class BooleanWidget(wtforms.widgets.CheckboxInput): # valid data-* options when using boostrap-switch _ON_OFF_VALID_OPTIONS = frozenset( ( "animate", "indeterminate", "inverse", "radio-all-off", "on-color", "off-color", "on-text", "off-text", "label-text", "handle-width", "label-width", "base-class", "wrapper-class", ) ) def __init__(self, *args, **kwargs): self.on_off_mode = kwargs.pop("on_off_mode", False) self.on_off_options = {} on_off_options = kwargs.pop("on_off_options", {}) for k, v in on_off_options.items(): if k not in self._ON_OFF_VALID_OPTIONS: continue self.on_off_options["data-" + k] = v if self.on_off_mode: self.on_off_options["data-toggle"] = "on-off" super(BooleanWidget, self).__init__(*args, **kwargs) def __call__(self, field, **kwargs): if self.on_off_mode: kwargs.update(self.on_off_options) return super(BooleanWidget, self).__call__(field, **kwargs) def render_view(self, field, **kwargs): return "\u2713" if field.object_data else "" # Text_type "Check mark" class PasswordInput(BasePasswordInput): """Supports setting 'autocomplete' at instanciation time.""" def __init__(self, *args, **kwargs): self.autocomplete = kwargs.pop("autocomplete", None) BasePasswordInput.__init__(self, *args, **kwargs) def __call__(self, field, **kwargs): kwargs.setdefault("autocomplete", self.autocomplete) return BasePasswordInput.__call__(self, field, **kwargs) def render_view(self, field, **kwargs): return "*****" class FloatWidget(wtforms.widgets.TextInput): """In view mode, format float number to 'precision' decimal.""" def __init__(self, precision=None): self.precision = precision if precision is not None: self._fmt = ".{:d}f".format(precision) def render_view(self, field, **kwargs): data = field.object_data if data is None: return "" return format(data, self._fmt) class DateWidget(wtforms.widgets.TextInput): def render_view(self, field, **kwargs): return format_date(field.object_data) if field.object_data else "" class DateTimeWidget(DateWidget): def render_view(self, field, **kwargs): return format_datetime(field.object_data) if field.object_data else "" class EntityWidget(object): def render_view(self, field, **kwargs): objs = field.object_data if not field.multiple: objs = [objs] return ", ".join( '{}'.format(url_for(o), cgi.escape(o.name)) for o in objs if o ) class HoursWidget(TextInput): """Widget used to show / enter hours. Currently hardcoded to heure(s) """ post_icon = _l("hour(s)") input_type = "number" def render_view(self, field, **kwargs): val = field.object_data unit = "h" if val is None: return "" # \u00A0: non-breakable whitespace return "{value}\u00A0{unit}".format(value=val, unit=unit) class MoneyWidget(TextInput): """Widget used to show / enter money amount. Currently hardcoded to € / k€. """ post_icon = "€" input_type = "number" def render_view(self, field, **kwargs): val = field.object_data unit = "€" if val is None: return "" if val > 1000: unit = "k€" # pylint: disable=W1633 val = int(round(val / 1000.0)) # `format_currency()` is not used since it display numbers with cents # units, which we don't want # # \u00A0: non-breakable whitespace return "{value}\u00A0{unit}".format(value=format_number(val), unit=unit) class EmailWidget(TextInput): pre_icon = "@" def render_view(self, field, **kwargs): links = "" if isinstance(field, wtforms.fields.FieldList): for entry in field.entries: link = bleach.linkify(entry.data, parse_email=True) if link: links += ' {} 
'.format(link) else: link = bleach.linkify(field.object_data, parse_email=True) if link: links = '{} '.format(link) return links class URLWidget(object): def render_view(self, field, **kwargs): return linkify_url(field.object_data) if field.object_data else "" class RichTextWidget(object): template = "widgets/richtext.html" allowed_tags = { "a": {"href": True, "title": True}, "abbr": {"title": True}, "acronym": {"title": True}, "b": True, "blockquote": True, "br": True, "code": True, "em": True, "h1": True, "h2": True, "h3": True, "h4": True, "h5": True, "h6": True, "i": True, "img": {"src": True}, "li": True, "ol": True, "strong": True, "ul": True, "p": True, "u": True, } profile = "standard" def __init__(self, allowed_tags=None, template=None, profile=None): if allowed_tags is not None: self.allowed_tags = allowed_tags if template is not None: self.template = template if profile is not None: self.profile = profile def __call__(self, field, **kwargs): value = kwargs.pop("value") if "value" in kwargs else field._value() kwargs.setdefault("allowed_tags", self.allowed_tags) kwargs.setdefault("profile", self.profile) return render_template(self.template, field=field, value=value, kw=kwargs) class ListWidget(wtforms.widgets.ListWidget): """display field label is optionnal.""" def __init__(self, html_tag="ul", prefix_label=True, show_label=True): wtforms.widgets.ListWidget.__init__(self, html_tag, prefix_label) self.show_label = show_label def __call__(self, field, **kwargs): if self.show_label: return super(ListWidget, self).__call__(field, **kwargs) kwargs.setdefault("id", field.id) html = ["<{} {}>".format(self.html_tag, wtforms.widgets.html_params(**kwargs))] for subfield in field: html.append("
  • {}
  • ".format(subfield())) html.append("".format(self.html_tag)) return wtforms.widgets.HTMLString("".join(html)) def render_view(self, field, **kwargs): data = field.data is_empty = data == [] if field.multiple else data is None if not is_empty: data = ( [label for v, label, checked in field.iter_choices() if checked] if (hasattr(field, "iter_choices") and callable(field.iter_choices)) else field.object_data ) else: data = [] tpl = """{%- for obj in data %} {{ obj }} {%- endfor %}""" return Markup(render_template_string(tpl, data=data)) class FieldListWidget(object): """For list of Fields (using )""" view_template = "widgets/fieldlist_view.html" template = "widgets/fieldlist.html" def __init__(self, template=None, view_template=None): if template is not None: self.template = template if view_template is not None: self.view_template = view_template def __call__(self, field, **kwargs): assert isinstance(field, wtforms.fields.FieldList) return Markup(render_template(self.template, field=field)) def render_view(self, field, **kwargs): assert isinstance(field, wtforms.fields.FieldList) value = field.object_data if not value: return "" return Markup(render_template(self.view_template, field=field)) class TabularFieldListWidget(object): """For list of formfields. 2 templates are available: * widgets/tabular_fieldlist_widget.html (default): Show sub-forms as a table, one row of inputs per model * widgets/model_fieldlist.html: Show sub-forms as a list of forms """ def __init__(self, template="widgets/tabular_fieldlist_widget.html"): self.template = template def __call__(self, field, **kwargs): assert isinstance(field, wtforms.fields.FieldList) labels = None if len(field): assert isinstance(field[0], wtforms.fields.FormField) field_names = [f.short_name for f in field[0] if not f.is_hidden] data_type = field.entries[0].__class__.__name__ + "Data" Data = namedtuple(data_type, field_names) labels = Data(*[f.label for f in field[0] if not f.is_hidden]) return Markup(render_template(self.template, labels=labels, field=field)) class ModelListWidget(object): def __init__(self, template="widgets/horizontal_table.html"): self.template = template def render_view(self, field, **kwargs): assert isinstance(field, ModelFieldList) value = field.object_data if not value: return render_template( self.template, field=field, labels=(), rows=(), **kwargs ) field_names = field._field_names labels = field._field_labels data_type = field.entries[0].object_data.__class__.__name__ + "Data" Data = namedtuple(data_type, field_names) labels = Data(*labels) rows = [] for entry in field.entries: row = [] for f in filter(lambda f: not f.is_hidden, entry.form): row.append(Markup(f.render_view())) rows.append(Data(*row)) rendered = render_template( self.template, field=field, labels=labels, rows=rows, **kwargs ) return rendered # # Selection widget. # class Select2(Select): """Transforms a Select widget into a Select2 widget. Depends on global JS code. """ unescape_html = False def __init__(self, unescape_html=False, js_init="select2", *args, **kwargs): super(Select2, self).__init__(*args, **kwargs) self.js_init = js_init if unescape_html: self.unescape_html = True def __call__(self, field, *args, **kwargs): # 'placeholder' option presence is required for 'allowClear' params = {"placeholder": ""} if self.unescape_html: params["makeHtml"] = True if not field.flags.required: params["allowClear"] = True css_class = kwargs.setdefault("class_", "") if "js-widget" not in css_class: css_class += " js-widget" kwargs["class_"] = css_class kwargs.setdefault("data-init-with", self.js_init) kwargs["data-init-params"] = json.dumps(params) return Select.__call__(self, field, *args, **kwargs) def render_view(self, field, **kwargs): labels = [ text_type(label) for v, label, checked in field.iter_choices() if checked ] return "; ".join(labels) @classmethod def render_option(cls, value, label, selected, **kwargs): if value is None: return HTMLString("") return Select.render_option(value, label, selected, **kwargs) class Select2Ajax(object): """Ad-hoc select widget based on Select2. The code below is probably very fragile, since it depends on the internal structure of a Select2 widget. :param format_result: `formatResult` arg of Select2. Must be a valid javascript reference (like `Abilian.my_format_function`) :param format_selection: like `format_result`, but for Select2's `formatSelection` :param values_builder: an optional function, which given a data iterable of values, returns a list of dict items suitable for widget initial data; generally needed when using custom format_result/format_selection. """ def __init__( self, template="widgets/select2ajax.html", multiple=False, format_result=None, format_selection=None, values_builder=None, ): self.template = template self.multiple = multiple self.values_builder = ( values_builder if callable(values_builder) else lambda data: [{"id": o.id, "text": o.name} for o in data if o] ) self.s2_params = {"multiple": self.multiple} if format_result: self.s2_params["formatResult"] = format_result if format_selection: self.s2_params["formatSelection"] = format_selection def process_formdata(self, valuelist): """field helper: as of select2 3.x, multiple values are passed as a single string.""" if self.multiple: valuelist = valuelist[0].split(",") return valuelist def __call__(self, field, **kwargs): """Render widget.""" if self.multiple: kwargs["multiple"] = True css_class = kwargs.setdefault("class_", "") if "class" in kwargs: css_class += kwargs.pop("class", "") kwargs["class_"] = css_class if "js-widget" not in css_class: css_class += " js-widget" kwargs["class_"] = css_class s2_params = {} s2_params.update(self.s2_params) if field.ajax_source: s2_params["ajax"] = {"url": text_type(field.ajax_source)} s2_params["placeholder"] = text_type(field.label.text) if not field.flags.required: s2_params["allowClear"] = True data = field.data if not self.multiple: data = [data] values = self.values_builder(data) input_value = ",".join(text_type(o.id) for o in data if o) data_node_id = None json_data = {} if values: json_data["values"] = values data_node_id = s2_params["dataNodeId"] = field.id + "-json" kwargs["data-init-with"] = "select2ajax" kwargs["data-init-params"] = json.dumps(s2_params) extra_args = Markup(html_params(**kwargs)) ctx = { "field": field, "name": field.name, "id": field.id, "input_value": input_value, "json_data": json_data, "required": not field.allow_blank, "data_node_id": data_node_id, "extra_args": extra_args, } return Markup(render_template(self.template, **ctx)) PK!WiWiabilian/web/frontend.py# coding=utf-8 """Front-end for a CRM app. This should eventually allow implementing very custom CRM-style application. """ from __future__ import absolute_import, division, print_function, \ unicode_literals import copy import logging import re from collections import OrderedDict from typing import List, Tuple import sqlalchemy as sa from flask import Blueprint, current_app, g, jsonify, redirect, \ render_template, request, session, url_for from flask_login import current_user from six import add_metaclass from sqlalchemy import Date, DateTime, func, orm from sqlalchemy.sql.expression import asc, desc, nullsfirst, nullslast from werkzeug.exceptions import BadRequest from abilian.core.entities import Entity from abilian.core.extensions import db from abilian.i18n import _l from abilian.services import audit_service, get_service from abilian.services.security import READ # noqa from abilian.services.vocabularies.models import BaseVocabulary from . import search from .action import Action, ActionDropDown, ActionGroup, ActionGroupItem, \ Endpoint, FAIcon, actions from .forms.widgets import AjaxMainTableView, Panel, RelatedTableView, Row, \ SingleView from .nav import BreadcrumbItem from .views import JSONView, JSONWhooshSearch, ObjectCreate, ObjectDelete, \ ObjectEdit, ObjectView, default_view logger = logging.getLogger(__name__) class ModuleAction(Action): """Base action class for :class:`Module` actions. Basic condition is simple: :attr:`category` must match the string `'module:{module.endpoint}'` """ def __init__(self, module, group, name, *args, **kwargs): self.group = group super(ModuleAction, self).__init__( module.action_category, name, *args, **kwargs ) def pre_condition(self, context): module = actions.context.get("module") if not module: return False return self.category == module.action_category class ModuleActionGroup(ModuleAction, ActionGroup): template_string = ActionGroup.template_string class ModuleActionDropDown(ModuleAction, ActionDropDown): template_string = ActionDropDown.template_string class ModuleActionGroupItem(ModuleAction, ActionGroupItem): pass def add_to_recent_items(entity, type="ignored"): if not isinstance(entity, Entity): return object_type = entity.object_type url = current_app.default_view.url_for(entity) if not hasattr(g, "recent_items"): g.recent_items = [] g.recent_items.insert(0, {"type": object_type, "name": entity.name, "url": url}) s = set() new_recent_items = [] for item in g.recent_items: item_url = item["url"] if item_url in s: continue s.add(item_url) new_recent_items.append(item) if len(new_recent_items) > 5: del new_recent_items[5:] session["recent_items"] = g.recent_items = new_recent_items def expose(url="/", methods=("GET",)): """Use this decorator to expose views in your view classes. `url` Relative URL for the view `methods` Allowed HTTP methods. By default only GET is allowed. """ def wrap(f): if not hasattr(f, "_urls"): f._urls = [] f._urls.append((url, methods)) return f return wrap def labelize(s): return " ".join([w.capitalize() for w in s.split("_")]) def make_single_view(form, **options): panels = [] for gr in form._groups.items(): panel = Panel(gr[0], *[Row(x) for x in gr[1]]) panels.append(panel) return SingleView(form, *panels, **options) class ModuleView(object): """Mixin for module base views. Provide :attr:`module`. """ #: :class:`Module` instance module = None # type: Module def __init__(self, module, *args, **kwargs): self.module = module super(ModuleView, self).__init__(*args, **kwargs) class BaseEntityView(ModuleView): pk = "entity_id" def init_object(self, args, kwargs): args, kwargs = super(BaseEntityView, self).init_object(args, kwargs) # security check if self.obj and not self.check_access(): # FIXME: will lead base views to return 404. Ok when permission is # READ, but when it's WRITE would 403 be more appropriate? self.obj = None return args, kwargs def breadcrumb(self): return BreadcrumbItem( label=self.obj.name or self.obj.id, url=Endpoint(".entity_view", entity_id=self.obj.id), ) def prepare_args(self, args, kwargs): args, kwargs = super(BaseEntityView, self).prepare_args(args, kwargs) actions.context["module"] = self.module add_to_recent_items(self.obj) return args, kwargs def redirect_to_index(self): return redirect(self.module.url) @property def single_view(self): return make_single_view( self.form, view_template=self.module.view_template, view=self, module=self.module, **self.module.view_options ) def check_access(self): return self._check_view_permission(self) def _check_view_permission(self, view): """ :param view: a :class:`ObjectView` class or instance """ security = get_service("security") return security.has_permission(current_user, view.permission, self.obj) @property def can_edit(self): return self._check_view_permission(self.module.edit_cls) @property def can_delete(self): return self._check_view_permission(self.module.delete_cls) @property def can_create(self): create_cls = self.module.create_cls permission = create_cls.permission cls_permissions = dict(self.Model.__default_permissions__) if self.permission in cls_permissions: security = get_service("security") return security.has_permission( current_user, create_cls.permission, obj=self.obj, roles=cls_permissions[permission], ) return False EDIT_ACTION = Action( "module", "object:view", title=_l("Edit"), button="default", condition=lambda ctx: ctx["view"].can_edit, icon=FAIcon("edit"), url=lambda ctx: url_for(".entity_edit", **{ctx["view"].pk: ctx["view"].obj.id}), ) DELETE_ACTION = Action( "module", "object:view", title=_l("Delete"), button="danger", condition=lambda ctx: ctx["view"].can_delete, icon=FAIcon("trash fa-inverse"), url=lambda ctx: url_for(".entity_delete", **{ctx["view"].pk: ctx["view"].obj.id}), ) DELETE_ACTION.template = "widgets/frontend_action_delete_confim.html" class EntityView(BaseEntityView, ObjectView): mode = "view" template = "default/single_view.html" @property def object_actions(self): ctx = actions.context return [a for a in (EDIT_ACTION, DELETE_ACTION) if a.available(ctx)] @property def template_kwargs(self): module = self.module related_views = [v.render(self.obj) for v in module.related_views] rendered_entity = self.single_view.render( self.obj, self.form, related_views=related_views ) audit_entries = audit_service.entries_for(self.obj) return { "rendered_entity": rendered_entity, "related_views": related_views, "audit_entries": audit_entries, "show_new_comment_form": True, "show_new_attachment_form": True, "module": self.module, } class EntityEdit(BaseEntityView, ObjectEdit): template = "default/single_view.html" mode = "edit" @property def template_kwargs(self): rendered_entity = self.single_view.render_form(self.form) return { "rendered_entity": rendered_entity, "show_new_comment_form": False, "show_new_attachment_form": False, "module": self.module, } class EntityCreate(BaseEntityView, ObjectCreate): template = "default/single_view.html" mode = "create" prepare_args = ObjectCreate.prepare_args breadcrumb = ObjectCreate.breadcrumb def check_access(self): return self.can_create @property def template_kwargs(self): rendered_entity = self.single_view.render_form(self.form) return { "rendered_entity": rendered_entity, "for_new": True, "module": self.module, } class EntityDelete(BaseEntityView, ObjectDelete): pass class ListJson(ModuleView, JSONView): """JSON endpoint, for AJAX-backed table views.""" def data(self, *args, **kwargs): echo = int(kwargs.get("sEcho", 0)) length = int(kwargs.get("iDisplayLength", 10)) start = int(kwargs.get("iDisplayStart", 0)) end = start + length total_count = self.module.listing_query.count() query = self.module.list_query(request) count = query.count() query = self.module.ordered_query(request, query) entities = query.slice(start, end).all() table_view = AjaxMainTableView( columns=self.module.list_view_columns, name=self.module.managed_class.__name__.lower(), ajax_source=url_for(".list_json"), ) data = [table_view.render_line(e) for e in entities] result = { "sEcho": echo, "iTotalRecords": total_count, "iTotalDisplayRecords": count, "aaData": data, } return result class ModuleMeta(type): """Module metaclass. Does some precalculations (like getting list of view methods from the class) to avoid calculating them for each view class instance. """ def __init__(cls, classname, bases, fields): type.__init__(cls, classname, bases, fields) # Gather exposed views cls._urls = [] cls._default_view = None for p in dir(cls): attr = getattr(cls, p) if hasattr(attr, "_urls"): # Collect methods for url, methods in attr._urls: cls._urls.append((url, p, methods)) if url == "/": cls._default_view = p # Wrap views # setattr(cls, p, _wrap_view(attr)) class ModuleComponent(object): """A component that provide new functions for a :class:`Module`""" name = None # type: str def __init__(self, name=None): if name is not None: self.name = name if self.name is None: raise ValueError("A module component must have a name") def init_module(self, module): self.module = module self.init() def init(self, *args, **kwargs): """Implements this in components.""" pass def get_actions(self): return [] @add_metaclass(ModuleMeta) class Module(object): id = None # type: str endpoint = None # type: str label = None # type: str managed_class = None # type: type list_view = None list_view_columns = [] # type: List single_view = None components = () # type: Tuple # class based views. If not provided will be automaticaly created from # EntityView etc defined below base_template = "base.html" view_cls = EntityView edit_cls = EntityEdit create_cls = EntityCreate delete_cls = EntityDelete json_search_cls = JSONWhooshSearch JSON2_SEARCH_LENGTH = 50 # form_class. Used when view_cls/edit_cls are not provided edit_form_class = None view_form_class = None # by default, same as edit_form_class url = None name = None view_new_save_and_add = False # show 'save and add new' button in /new form static_folder = None view_template = None view_options = None related_views = [] # type: List[RelatedView] blueprint = None search_criterions = ( search.TextSearchCriterion("name", attributes=("name", "nom")), ) # used mostly to change datatable search_label tableview_options = {} # type: ignore _urls = [] # type: List[Tuple] def __init__(self): # If endpoint name is not provided, get it from the class name if self.endpoint is None: class_name = self.__class__.__name__ if class_name.endswith("Module"): class_name = class_name[0 : -len("Module")] self.endpoint = class_name.lower() if self.label is None: self.label = labelize(self.endpoint) if self.id is None: self.id = self.managed_class.__name__.lower() # If name is not provided, use capitalized endpoint name if self.name is None: self.name = self._prettify_name(self.__class__.__name__) if self.view_options is None: self.view_options = {} # self.single_view = make_single_view(self.edit_form_class, # view_template=self.view_template, # **self.view_options) if self.view_form_class is None: self.view_form_class = self.edit_form_class # init class based views kw = { "Model": self.managed_class, "pk": "entity_id", "module": self, "base_template": self.base_template, } self._setup_view( "/", "entity_view", self.view_cls, Form=self.view_form_class, **kw ) view_endpoint = self.endpoint + ".entity_view" self._setup_view( "//edit", "entity_edit", self.edit_cls, Form=self.edit_form_class, view_endpoint=view_endpoint, **kw ) self._setup_view( "/new", "entity_new", self.create_cls, Form=self.edit_form_class, chain_create_allowed=self.view_new_save_and_add, view_endpoint=view_endpoint, **kw ) self._setup_view( "//delete", "entity_delete", self.delete_cls, Form=self.edit_form_class, view_endpoint=view_endpoint, **kw ) self._setup_view("/json", "list_json", ListJson, module=self) self._setup_view( "/json_search", "json_search", self.json_search_cls, Model=self.managed_class, ) self.init_related_views() # copy criterions instances; without that they may be shared by # subclasses self.search_criterions = copy.deepcopy(self.__class__.search_criterions) for sc in self.search_criterions: sc.model = self.managed_class self.__components = {} for component in self.components: component.init_module(self) self.__components[component.name] = component def get_component(self, name): return self.__components.get(name) def _setup_view(self, url, attr, cls, *args, **kwargs): """Register class based views.""" view = cls.as_view(attr, *args, **kwargs) setattr(self, attr, view) self._urls.append((url, attr, view.methods)) def init_related_views(self): related_views = [] for view in self.related_views: if not isinstance(view, RelatedView): view = DefaultRelatedView(*view) related_views.append(view) self.related_views = related_views @property def action_category(self): return "module:{}".format(self.endpoint) def get_grouped_actions(self): items = actions.for_category(self.action_category) groups = OrderedDict() for action in items: groups.setdefault(action.group, []).append(action) return groups def register_actions(self): ACTIONS = [ ModuleAction( self, "entity", "create", title=_l("Create New"), icon=FAIcon("plus"), endpoint=Endpoint(self.endpoint + ".entity_new"), button="default", ) ] for component in self.components: ACTIONS.extend(component.get_actions()) actions.register(*ACTIONS) def create_blueprint(self, crud_app): """Create a Flask blueprint for this module.""" # Store admin instance self.crud_app = crud_app self.app = crud_app.app # If url is not provided, generate it from endpoint name if self.url is None: self.url = "{}/{}".format(self.crud_app.url, self.endpoint) else: if not self.url.startswith("/"): self.url = "{}/{}".format(self.crud_app.url, self.url) # Create blueprint and register rules self.blueprint = Blueprint(self.endpoint, __name__, url_prefix=self.url) for url, name, methods in self._urls: self.blueprint.add_url_rule(url, name, getattr(self, name), methods=methods) # run default_view decorator default_view(self.blueprint, self.managed_class, id_attr="entity_id")( self.entity_view ) # delay registration of our breadcrumbs to when registered on app; thus # 'parents' blueprint can register theirs befores ours self.blueprint.record_once(self._setup_breadcrumb_preprocessors) return self.blueprint def _setup_breadcrumb_preprocessors(self, state): self.blueprint.url_value_preprocessor(self._add_breadcrumb) def _add_breadcrumb(self, endpoint, values): g.breadcrumb.append( BreadcrumbItem(label=self.label, url=Endpoint(".list_view")) ) @property def base_query(self): """Return a query instance for :attr:`managed_class`.""" return self.managed_class.query @property def read_query(self): """Return a query instance for :attr:`managed_class` filtering on `READ` permission.""" return self.base_query.with_permission(READ) @property def listing_query(self): """Like `read_query`, but can be made lightweight with only columns and joins of interest. `read_query` can be used with exports for example, with lot more columns (generallly it means more joins). """ return self.base_query.with_permission(READ) def query(self, request): """Return filtered query based on request args.""" args = request.args search = args.get("sSearch", "").replace("%", "").lower() query = self.read_query.distinct() for crit in self.search_criterions: query = crit.filter(query, self, request, search) return query def list_query(self, request): """Return a filtered query based on request args, for listings. Like `query`, but subclasses can modify it to remove costly joined loads for example. """ args = request.args search = args.get("sSearch", "").replace("%", "").lower() query = self.listing_query query = query.distinct() for crit in self.search_criterions: query = crit.filter(query, self, request, search) return query def ordered_query(self, request, query=None): """Order query according to request args. If query is None, the query is generated according to request args with self.query(request) """ if query is None: query = self.query(request) engine = query.session.get_bind(self.managed_class.__mapper__) args = request.args sort_col = int(args.get("iSortCol_0", 1)) sort_dir = args.get("sSortDir_0", "asc") sort_col_def = self.list_view_columns[sort_col] sort_col_name = sort_col_def["name"] rel_sort_names = sort_col_def.get("sort_on", (sort_col_name,)) sort_cols = [] for rel_col in rel_sort_names: sort_col = getattr(self.managed_class, rel_col) if hasattr(sort_col, "property") and isinstance( sort_col.property, orm.properties.RelationshipProperty ): # this is a related model: find attribute to filter on query = query.outerjoin(sort_col_name, aliased=True) rel_model = sort_col.property.mapper.class_ default_sort_name = "name" if issubclass(rel_model, BaseVocabulary): default_sort_name = "label" rel_sort_name = sort_col_def.get("relationship_sort_on", None) if rel_sort_name is None: rel_sort_name = sort_col_def.get("sort_on", default_sort_name) sort_col = getattr(rel_model, rel_sort_name, None) # XXX: Big hack, date are sorted in reverse order by default if isinstance(sort_col, (Date, DateTime)): sort_dir = "asc" if sort_dir == "desc" else "desc" elif ( isinstance(sort_col, sa.types.String) or hasattr(sort_col, "property") and isinstance(sort_col.property.columns[0].type, sa.types.String) ): sort_col = func.lower(sort_col) if sort_col is not None: try: direction = desc if sort_dir == "desc" else asc sort_col = direction(sort_col) except BaseException: # FIXME pass # sqlite does not support 'NULLS FIRST|LAST' in ORDER BY # clauses if engine.name != "sqlite": nullsorder = nullslast if sort_dir == "desc" else nullsfirst try: sort_col = nullsorder(sort_col) except BaseException: # FIXME pass sort_cols.append(sort_col) if sort_cols: try: query = query.order_by(*sort_cols) except BaseException: # FIXME pass query.reset_joinpoint() return query # # Exposed views # @expose("/") def list_view(self): actions.context["module"] = self table_view = AjaxMainTableView( name=self.managed_class.__name__.lower(), columns=self.list_view_columns, ajax_source=url_for(".list_json"), search_criterions=self.search_criterions, options=self.tableview_options, ) rendered_table = table_view.render() ctx = { "rendered_table": rendered_table, "module": self, "base_template": self.base_template, } return render_template("default/list_view.html", **ctx) def list_json2_query_all(self, q): """Implements the search query for the list_json2 endpoint. May be re-defined by a Module subclass in order to customize the search results. - Return: a list of results (not json) with an 'id' and a 'text' (that will be displayed in the select2). """ cls = self.managed_class query = db.session.query(cls.id, cls.name) query = ( query.filter(cls.name.ilike("%" + q + "%")) .distinct() .order_by(cls.name) .limit(self.JSON2_SEARCH_LENGTH) ) results = query.all() results = [{"id": r[0], "text": r[1]} for r in results] return results @expose("/json2") def list_json2(self): """Other JSON endpoint, this time used for filling select boxes dynamically. You can write your own search method in list_json2_query_all, that returns a list of results (not json). """ args = request.args q = args.get("q", "").replace("%", " ") if not q or len(q) < 2: raise BadRequest() results = self.list_json2_query_all(q) results = {"results": results} return jsonify(results) # # Utils # def is_current(self): return request.path.startswith(self.url) @staticmethod def _prettify_name(name): """Prettify class name by splitting name by capital characters. So, 'MySuperClass' will look like 'My Super Class' `name` String to prettify """ return re.sub(r"(?<=.)([A-Z])", r" \1", name) class RelatedView(object): """A base class for related views.""" def render(self, entity): """Return a dict with keys 'label', 'attr_name', 'rendered', 'size', 'show_empty', 'default_collapsed'.""" raise NotImplementedError class DefaultRelatedView(RelatedView): """Default view used by Module for items directly related to entity.""" def __init__(self, label, attr, column_names, options=None, show_empty=False): self.label = label self.attr = attr self.show_empty = show_empty self.column_names = column_names self.options = {} if options is not None: self.options.update(options) def render(self, entity): view = RelatedTableView(self.column_names, self.options) related_entities = getattr(entity, self.attr) return { "label": self.label, "attr_name": self.attr, "rendered": view.render(related_entities, related_to=entity), "show_empty": self.show_empty, "size": len(related_entities), } # TODO: rename to CRMApp ? class CRUDApp(object): modules = () def __init__(self, app, modules=None, name=None): if name is None: name = self.__class__.__module__ modules_signature = ",".join(str(module.id) for module in self.modules) name = name + "-" + modules_signature self.name = name self.app = app app.extensions[name] = self if modules: self.modules = modules for module in self.modules: self.add_module(module) def get_module(self, module_id): for m in self.modules: if m.id == module_id: return m return None def add_module(self, module): self.app.register_blueprint(self.create_blueprint(module)) module.register_actions() def create_blueprint(self, module): return module.create_blueprint(self) PK!4Sabilian/web/http.py# -*- coding: utf-8 -*- """View decorators for controlling some aspect of HTTP, mainly: Cache headers.""" from __future__ import absolute_import, division, print_function, \ unicode_literals from functools import wraps from flask import make_response def nocache(view): @wraps(view) def _nocache(*args, **kwargs): resp = make_response(view(*args, **kwargs)) resp.headers["Cache-Control"] = "no-cache" return resp return _nocache PK!v3}abilian/web/nav.py# coding=utf-8 """Navigation elements. Abilian define theses categories: `section`: Used for navigation elements relevant to site section `user`: User for element that should appear in user menu """ from __future__ import absolute_import, division, print_function, \ unicode_literals from flask import g from jinja2 import Markup, Template from six import string_types, text_type from .action import ACTIVE, ENABLED, Action, Glyphicon, getset class NavItem(Action): """A single navigation item.""" divider = False def __init__(self, category, name, divider=False, *args, **kwargs): category = "navigation:" + category Action.__init__(self, category, name, *args, **kwargs) self.divider = divider @getset def status(self, value=None): current = g.nav.get("active") if current is None: return ENABLED if not current.startswith("navigation:"): current = "navigation:" + current status = ACTIVE if current == self.path else ENABLED return status @property def path(self): return self.category + ":" + self.name class NavGroup(NavItem): """A navigation group renders a list of items.""" template_string = """ """ def __init__(self, category, name, items=(), *args, **kwargs): NavItem.__init__(self, category, name, *args, **kwargs) self.items = list(items) self._paths = {self.path} for i in self.items: self._paths.add(i.path) def append(self, item): self.items.append(item) self._paths.add(item.path) def insert(self, pos, item): self.items.insert(pos, item) self._paths.add(item.path) def get_render_args(self, **kwargs): params = super(NavGroup, self).get_render_args(**kwargs) params["action_items"] = [a for a in self.items if a.available(params)] return params @getset def status(self, value=None): current = g.nav.get("active") if current is None: return ENABLED if not current.startswith("navigation:"): current = "navigation:" + current status = ACTIVE if current in self._paths else ENABLED return status class BreadcrumbItem(object): """A breadcrumb element has at least a label or an icon.""" #: Label shown to user. May be an i18n string instance label = None #: Icon to use. icon = None #: Additional text, can be used as tooltip for example description = None #: either an Unicode string or an :class:`Endpoint` instance. _url = None template_string = ( '{%- if url %}{%- endif %}' "{%- if item.icon %}{{ item.icon }} {%- endif %}" "{{ item.label }}" "{%- if url %}{%- endif %}" ) def __init__(self, label="", url="#", icon=None, description=None): # don't test 'label or...': if label is a lazy_gettext, it will be # resolved. If this item is created in a url_value_preprocessor, it will # setup i18n before auth has loaded user, so i18n will fallback on browser # negociation instead of user's site preference, and load wrong catalogs for # the whole request. assert label is not None or icon is None self.label = label if isinstance(icon, string_types): icon = Glyphicon(icon) self.icon = icon self.description = description self._url = url self.__template = Template(self.template_string) @property def url(self): return text_type(self._url) def render(self): return Markup(self.__template.render(item=self, url=self.url)) PK! >WW#abilian/web/preferences/__init__.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function PK!}1abilian/web/preferences/tests/avatar-colormap.pngPNG  IHDR{`IDATxI İosr1|(%?_mlrj[|~tحXfʰ}!щkQ'6ɽ(pB@/D[`P1%|Fp(Fѽ'p8: s2 ?F#BMA/:{Q:X-{: >79PP`8 ū1l*,¬1+ [p,7|NLNa7d>s R6 %Q5o72OX%('U>(e)d@\$Z2 | \ƬPl\ɤKlٹ|?!R)sRtE>3Hwp |L%*.2R4A2mE E@Lf xqjzS<\L!1 p/Jx8>k$uM0E"x`;]b0&Vx%nߎ a?qY+P}\@ @ R @d@ @ @'@  @6 @p~p~!p|$nLIENDB`PK! ''6abilian/web/preferences/tests/test_user_preferences.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals import imghdr from pathlib import Path from flask import request, url_for from flask_login import login_user from abilian.web.preferences.user import UserPreferencesForm AVATAR_COLORMAP = Path(__file__).parent / "avatar-colormap.png" def test_form_photo(app, db): user = app.create_root_user() url = url_for("preferences.user") uploads = app.extensions["uploads"] with AVATAR_COLORMAP.open("rb") as f: handle = uploads.add_file(user, f, filename="avatar.png", mimetype="image/png") kwargs = {"method": "POST", "data": {"photo": handle}} with app.test_request_context(url, **kwargs): login_user(user) form = UserPreferencesForm(request.form) form.validate() assert form.photo.data is not None img_data = form.photo.data img_type = imghdr.what("ignored", img_data) # ???: should be 'png' but is 'jpeg' on Python 2 assert img_type in ("png", "jpeg") PK!1:™abilian/web/preferences/user.py# coding=utf-8 """""" from __future__ import absolute_import, division, print_function, \ unicode_literals import imghdr from io import BytesIO import babel.dates import PIL.Image from flask import current_app, flash, g, redirect, render_template, request, \ url_for from six import PY2 from werkzeug.exceptions import InternalServerError from wtforms.fields import StringField from wtforms.validators import ValidationError from abilian.core.extensions import db from abilian.i18n import _, _l, get_default_locale from abilian.services.preferences.panel import PreferencePanel from abilian.web import csrf from abilian.web.forms import Form, fields, required, widgets class UserPreferencesForm(Form): password = StringField( _l("New Password"), widget=widgets.PasswordInput(autocomplete="off") ) confirm_password = StringField( _l("Confirm new password"), widget=widgets.PasswordInput(autocomplete="off") ) photo = fields.FileField( label=_l("Photo"), widget=widgets.ImageInput(width=55, height=55) ) locale = fields.LocaleSelectField( label=_l("Preferred Language"), validators=[required()], default=lambda: get_default_locale(), ) timezone = fields.TimezoneField( label=_l("Time zone"), validators=(required(),), default=babel.dates.LOCALTZ ) def validate_password(self, field): pwd = field.data confirmed = self["confirm_password"].data if pwd != confirmed: raise ValidationError( _( "Passwords differ. Ensure you have typed same password " 'in both "password" field and "confirm password" field.' ) ) def validate_photo(self, field): data = request.form.get(field.name) if not data: return data = field.data filename = data.filename valid = any(filename.lower().endswith(ext) for ext in (".png", ".jpg", ".jpeg")) if not valid: raise ValidationError(_("Only PNG or JPG image files are accepted")) img_type = imghdr.what("ignored", data.read()) if img_type not in ("png", "jpeg"): raise ValidationError(_("Only PNG or JPG image files are accepted")) data.seek(0) try: # check this is actually an image file im = PIL.Image.open(data) im.load() except BaseException: raise ValidationError(_("Could not decode image file")) # convert to jpeg # FIXME: better do this at model level? jpeg = BytesIO() im.convert("RGB").save(jpeg, "JPEG") field.data = jpeg.getvalue() class UserPreferencesPanel(PreferencePanel): id = "user" label = _l("About me") def is_accessible(self): return True def get(self): # Manual security check, should be done by the framework instead. if not self.is_accessible(): raise InternalServerError() data = {} photo = g.user.photo if photo: # subclass str/bytes to set additional 'url' attribute photo = type( b"Photo" if PY2 else "Photo", (bytes,), {"object": photo, "url": url_for("users.photo", user_id=g.user.id)}, ) data["photo"] = photo form = UserPreferencesForm(obj=g.user, formdata=None, prefix=self.id, **data) if form["locale"].data is None: form["locale"].data = get_default_locale() ctx = {"form": form, "title": self.label} return render_template("preferences/user.html", **ctx) @csrf.support_graceful_failure def post(self): # Manual security check, should be done by the framework instead. if not self.is_accessible(): raise InternalServerError() if request.form["_action"] == "cancel": return redirect(url_for(".user")) form = UserPreferencesForm(request.form, prefix=self.id) if form.validate(): if request.csrf_failed: current_app.extensions["csrf-handler"].flash_csrf_failed_message() return render_template("preferences/user.html", form=form) del form.confirm_password if form.password.data: g.user.set_password(form.password.data) flash(_("Password changed"), "success") del form.password form.populate_obj(g.user) db.session.commit() flash(_("Preferences saved."), "info") return redirect(url_for(".user")) else: return render_template("preferences/user.html", form=form) PK!gg(abilian/web/resources/bootbox/bootbox.js/** * bootbox.js [v4.4.0] * * http://bootboxjs.com/license.txt */ // @see https://github.com/makeusabrew/bootbox/issues/180 // @see https://github.com/makeusabrew/bootbox/issues/186 (function (root, factory) { "use strict"; if (typeof define === "function" && define.amd) { // AMD. Register as an anonymous module. define('bootbox', ["jquery"], factory); } else if (typeof exports === "object") { // Node. Does not work with strict CommonJS, but // only CommonJS-like environments that support module.exports, // like Node. module.exports = factory(require("jquery")); } else { // Browser globals (root is window) root.bootbox = factory(root.jQuery); } }(this, function init($, undefined) { "use strict"; // the base DOM structure needed to create a modal var templates = { dialog: "", header: "", footer: "", closeButton: "", form: "", inputs: { text: "", textarea: "", email: "", select: "", checkbox: "
    ", date: "", time: "", number: "", password: "" } }; var defaults = { // default language locale: "en", // show backdrop or not. Default to static so user has to interact with dialog backdrop: "static", // animate the modal in/out animate: true, // additional class string applied to the top level dialog className: null, // whether or not to include a close button closeButton: true, // show the dialog immediately by default show: true, // dialog container container: "body" }; // our public object; augmented after our private API var exports = {}; /** * @private */ function _t(key) { var locale = locales[defaults.locale]; return locale ? locale[key] : locales.en[key]; } function processCallback(e, dialog, callback) { e.stopPropagation(); e.preventDefault(); // by default we assume a callback will get rid of the dialog, // although it is given the opportunity to override this // so, if the callback can be invoked and it *explicitly returns false* // then we'll set a flag to keep the dialog active... var preserveDialog = $.isFunction(callback) && callback.call(dialog, e) === false; // ... otherwise we'll bin it if (!preserveDialog) { dialog.modal("hide"); } } function getKeyLength(obj) { // @TODO defer to Object.keys(x).length if available? var k, t = 0; for (k in obj) { t ++; } return t; } function each(collection, iterator) { var index = 0; $.each(collection, function(key, value) { iterator(key, value, index++); }); } function sanitize(options) { var buttons; var total; if (typeof options !== "object") { throw new Error("Please supply an object of options"); } if (!options.message) { throw new Error("Please specify a message"); } // make sure any supplied options take precedence over defaults options = $.extend({}, defaults, options); if (!options.buttons) { options.buttons = {}; } buttons = options.buttons; total = getKeyLength(buttons); each(buttons, function(key, button, index) { if ($.isFunction(button)) { // short form, assume value is our callback. Since button // isn't an object it isn't a reference either so re-assign it button = buttons[key] = { callback: button }; } // before any further checks make sure by now button is the correct type if ($.type(button) !== "object") { throw new Error("button with key " + key + " must be an object"); } if (!button.label) { // the lack of an explicit label means we'll assume the key is good enough button.label = key; } if (!button.className) { if (total <= 2 && index === total-1) { // always add a primary to the main option in a two-button dialog button.className = "btn-primary"; } else { button.className = "btn-default"; } } }); return options; } /** * map a flexible set of arguments into a single returned object * if args.length is already one just return it, otherwise * use the properties argument to map the unnamed args to * object properties * so in the latter case: * mapArguments(["foo", $.noop], ["message", "callback"]) * -> { message: "foo", callback: $.noop } */ function mapArguments(args, properties) { var argn = args.length; var options = {}; if (argn < 1 || argn > 2) { throw new Error("Invalid argument length"); } if (argn === 2 || typeof args[0] === "string") { options[properties[0]] = args[0]; options[properties[1]] = args[1]; } else { options = args[0]; } return options; } /** * merge a set of default dialog options with user supplied arguments */ function mergeArguments(defaults, args, properties) { return $.extend( // deep merge true, // ensure the target is an empty, unreferenced object {}, // the base options object for this type of dialog (often just buttons) defaults, // args could be an object or array; if it's an array properties will // map it to a proper options object mapArguments( args, properties ) ); } /** * this entry-level method makes heavy use of composition to take a simple * range of inputs and return valid options suitable for passing to bootbox.dialog */ function mergeDialogOptions(className, labels, properties, args) { // build up a base set of dialog properties var baseOptions = { className: "bootbox-" + className, buttons: createLabels.apply(null, labels) }; // ensure the buttons properties generated, *after* merging // with user args are still valid against the supplied labels return validateButtons( // merge the generated base properties with user supplied arguments mergeArguments( baseOptions, args, // if args.length > 1, properties specify how each arg maps to an object key properties ), labels ); } /** * from a given list of arguments return a suitable object of button labels * all this does is normalise the given labels and translate them where possible * e.g. "ok", "confirm" -> { ok: "OK, cancel: "Annuleren" } */ function createLabels() { var buttons = {}; for (var i = 0, j = arguments.length; i < j; i++) { var argument = arguments[i]; var key = argument.toLowerCase(); var value = argument.toUpperCase(); buttons[key] = { label: _t(value) }; } return buttons; } function validateButtons(options, buttons) { var allowedButtons = {}; each(buttons, function(key, value) { allowedButtons[value] = true; }); each(options.buttons, function(key) { if (allowedButtons[key] === undefined) { throw new Error("button key " + key + " is not allowed (options are " + buttons.join("\n") + ")"); } }); return options; } exports.alert = function() { var options; options = mergeDialogOptions("alert", ["ok"], ["message", "callback"], arguments); if (options.callback && !$.isFunction(options.callback)) { throw new Error("alert requires callback property to be a function when provided"); } /** * overrides */ options.buttons.ok.callback = options.onEscape = function() { if ($.isFunction(options.callback)) { return options.callback.call(this); } return true; }; return exports.dialog(options); }; exports.confirm = function() { var options; options = mergeDialogOptions("confirm", ["cancel", "confirm"], ["message", "callback"], arguments); /** * overrides; undo anything the user tried to set they shouldn't have */ options.buttons.cancel.callback = options.onEscape = function() { return options.callback.call(this, false); }; options.buttons.confirm.callback = function() { return options.callback.call(this, true); }; // confirm specific validation if (!$.isFunction(options.callback)) { throw new Error("confirm requires a callback"); } return exports.dialog(options); }; exports.prompt = function() { var options; var defaults; var dialog; var form; var input; var shouldShow; var inputOptions; // we have to create our form first otherwise // its value is undefined when gearing up our options // @TODO this could be solved by allowing message to // be a function instead... form = $(templates.form); // prompt defaults are more complex than others in that // users can override more defaults // @TODO I don't like that prompt has to do a lot of heavy // lifting which mergeDialogOptions can *almost* support already // just because of 'value' and 'inputType' - can we refactor? defaults = { className: "bootbox-prompt", buttons: createLabels("cancel", "confirm"), value: "", inputType: "text" }; options = validateButtons( mergeArguments(defaults, arguments, ["title", "callback"]), ["cancel", "confirm"] ); // capture the user's show value; we always set this to false before // spawning the dialog to give us a chance to attach some handlers to // it, but we need to make sure we respect a preference not to show it shouldShow = (options.show === undefined) ? true : options.show; /** * overrides; undo anything the user tried to set they shouldn't have */ options.message = form; options.buttons.cancel.callback = options.onEscape = function() { return options.callback.call(this, null); }; options.buttons.confirm.callback = function() { var value; switch (options.inputType) { case "text": case "textarea": case "email": case "select": case "date": case "time": case "number": case "password": value = input.val(); break; case "checkbox": var checkedItems = input.find("input:checked"); // we assume that checkboxes are always multiple, // hence we default to an empty array value = []; each(checkedItems, function(_, item) { value.push($(item).val()); }); break; } return options.callback.call(this, value); }; options.show = false; // prompt specific validation if (!options.title) { throw new Error("prompt requires a title"); } if (!$.isFunction(options.callback)) { throw new Error("prompt requires a callback"); } if (!templates.inputs[options.inputType]) { throw new Error("invalid prompt type"); } // create the input based on the supplied type input = $(templates.inputs[options.inputType]); switch (options.inputType) { case "text": case "textarea": case "email": case "date": case "time": case "number": case "password": input.val(options.value); break; case "select": var groups = {}; inputOptions = options.inputOptions || []; if (!$.isArray(inputOptions)) { throw new Error("Please pass an array of input options"); } if (!inputOptions.length) { throw new Error("prompt with select requires options"); } each(inputOptions, function(_, option) { // assume the element to attach to is the input... var elem = input; if (option.value === undefined || option.text === undefined) { throw new Error("given options in wrong format"); } // ... but override that element if this option sits in a group if (option.group) { // initialise group if necessary if (!groups[option.group]) { groups[option.group] = $("").attr("label", option.group); } elem = groups[option.group]; } elem.append(""); }); each(groups, function(_, group) { input.append(group); }); // safe to set a select's value as per a normal input input.val(options.value); break; case "checkbox": var values = $.isArray(options.value) ? options.value : [options.value]; inputOptions = options.inputOptions || []; if (!inputOptions.length) { throw new Error("prompt with checkbox requires options"); } if (!inputOptions[0].value || !inputOptions[0].text) { throw new Error("given options in wrong format"); } // checkboxes have to nest within a containing element, so // they break the rules a bit and we end up re-assigning // our 'input' element to this container instead input = $("
    "); each(inputOptions, function(_, option) { var checkbox = $(templates.inputs[options.inputType]); checkbox.find("input").attr("value", option.value); checkbox.find("label").append(option.text); // we've ensured values is an array so we can always iterate over it each(values, function(_, value) { if (value === option.value) { checkbox.find("input").prop("checked", true); } }); input.append(checkbox); }); break; } // @TODO provide an attributes option instead // and simply map that as keys: vals if (options.placeholder) { input.attr("placeholder", options.placeholder); } if (options.pattern) { input.attr("pattern", options.pattern); } if (options.maxlength) { input.attr("maxlength", options.maxlength); } // now place it in our form form.append(input); form.on("submit", function(e) { e.preventDefault(); // Fix for SammyJS (or similar JS routing library) hijacking the form post. e.stopPropagation(); // @TODO can we actually click *the* button object instead? // e.g. buttons.confirm.click() or similar dialog.find(".btn-primary").click(); }); dialog = exports.dialog(options); // clear the existing handler focusing the submit button... dialog.off("shown.bs.modal"); // ...and replace it with one focusing our input, if possible dialog.on("shown.bs.modal", function() { // need the closure here since input isn't // an object otherwise input.focus(); }); if (shouldShow === true) { dialog.modal("show"); } return dialog; }; exports.dialog = function(options) { options = sanitize(options); var dialog = $(templates.dialog); var innerDialog = dialog.find(".modal-dialog"); var body = dialog.find(".modal-body"); var buttons = options.buttons; var buttonStr = ""; var callbacks = { onEscape: options.onEscape }; if ($.fn.modal === undefined) { throw new Error( "$.fn.modal is not defined; please double check you have included " + "the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ " + "for more details." ); } each(buttons, function(key, button) { // @TODO I don't like this string appending to itself; bit dirty. Needs reworking // can we just build up button elements instead? slower but neater. Then button // can just become a template too buttonStr += ""; callbacks[key] = button.callback; }); body.find(".bootbox-body").html(options.message); if (options.animate === true) { dialog.addClass("fade"); } if (options.className) { dialog.addClass(options.className); } if (options.size === "large") { innerDialog.addClass("modal-lg"); } else if (options.size === "small") { innerDialog.addClass("modal-sm"); } if (options.title) { body.before(templates.header); } if (options.closeButton) { var closeButton = $(templates.closeButton); if (options.title) { dialog.find(".modal-header").prepend(closeButton); } else { closeButton.css("margin-top", "-10px").prependTo(body); } } if (options.title) { dialog.find(".modal-title").html(options.title); } if (buttonStr.length) { body.after(templates.footer); dialog.find(".modal-footer").html(buttonStr); } /** * Bootstrap event listeners; used handle extra * setup & teardown required after the underlying * modal has performed certain actions */ dialog.on("hidden.bs.modal", function(e) { // ensure we don't accidentally intercept hidden events triggered // by children of the current dialog. We shouldn't anymore now BS // namespaces its events; but still worth doing if (e.target === this) { dialog.remove(); } }); /* dialog.on("show.bs.modal", function() { // sadly this doesn't work; show is called *just* before // the backdrop is added so we'd need a setTimeout hack or // otherwise... leaving in as would be nice if (options.backdrop) { dialog.next(".modal-backdrop").addClass("bootbox-backdrop"); } }); */ dialog.on("shown.bs.modal", function() { dialog.find(".btn-primary:first").focus(); }); /** * Bootbox event listeners; experimental and may not last * just an attempt to decouple some behaviours from their * respective triggers */ if (options.backdrop !== "static") { // A boolean true/false according to the Bootstrap docs // should show a dialog the user can dismiss by clicking on // the background. // We always only ever pass static/false to the actual // $.modal function because with `true` we can't trap // this event (the .modal-backdrop swallows it) // However, we still want to sort of respect true // and invoke the escape mechanism instead dialog.on("click.dismiss.bs.modal", function(e) { // @NOTE: the target varies in >= 3.3.x releases since the modal backdrop // moved *inside* the outer dialog rather than *alongside* it if (dialog.children(".modal-backdrop").length) { e.currentTarget = dialog.children(".modal-backdrop").get(0); } if (e.target !== e.currentTarget) { return; } dialog.trigger("escape.close.bb"); }); } dialog.on("escape.close.bb", function(e) { if (callbacks.onEscape) { processCallback(e, dialog, callbacks.onEscape); } }); /** * Standard jQuery event listeners; used to handle user * interaction with our dialog */ dialog.on("click", ".modal-footer button", function(e) { var callbackKey = $(this).data("bb-handler"); processCallback(e, dialog, callbacks[callbackKey]); }); dialog.on("click", ".bootbox-close-button", function(e) { // onEscape might be falsy but that's fine; the fact is // if the user has managed to click the close button we // have to close the dialog, callback or not processCallback(e, dialog, callbacks.onEscape); }); dialog.on("keyup", function(e) { if (e.which === 27) { dialog.trigger("escape.close.bb"); } }); // the remainder of this method simply deals with adding our // dialogent to the DOM, augmenting it with Bootstrap's modal // functionality and then giving the resulting object back // to our caller $(options.container).append(dialog); dialog.modal({ backdrop: options.backdrop ? "static": false, keyboard: false, show: false }); if (options.show) { dialog.modal("show"); } // @TODO should we return the raw element here or should // we wrap it in an object on which we can expose some neater // methods, e.g. var d = bootbox.alert(); d.hide(); instead // of d.modal("hide"); /* function BBDialog(elem) { this.elem = elem; } BBDialog.prototype = { hide: function() { return this.elem.modal("hide"); }, show: function() { return this.elem.modal("show"); } }; */ return dialog; }; exports.setDefaults = function() { var values = {}; if (arguments.length === 2) { // allow passing of single key/value... values[arguments[0]] = arguments[1]; } else { // ... and as an object too values = arguments[0]; } $.extend(defaults, values); }; exports.hideAll = function() { $(".bootbox").modal("hide"); return exports; }; /** * standard locales. Please add more according to ISO 639-1 standard. Multiple language variants are * unlikely to be required. If this gets too large it can be split out into separate JS files. */ var locales = { bg_BG : { OK : "Ок", CANCEL : "Отказ", CONFIRM : "Потвърждавам" }, br : { OK : "OK", CANCEL : "Cancelar", CONFIRM : "Sim" }, cs : { OK : "OK", CANCEL : "Zrušit", CONFIRM : "Potvrdit" }, da : { OK : "OK", CANCEL : "Annuller", CONFIRM : "Accepter" }, de : { OK : "OK", CANCEL : "Abbrechen", CONFIRM : "Akzeptieren" }, el : { OK : "Εντάξει", CANCEL : "Ακύρωση", CONFIRM : "Επιβεβαίωση" }, en : { OK : "OK", CANCEL : "Cancel", CONFIRM : "OK" }, es : { OK : "OK", CANCEL : "Cancelar", CONFIRM : "Aceptar" }, et : { OK : "OK", CANCEL : "Katkesta", CONFIRM : "OK" }, fa : { OK : "قبول", CANCEL : "لغو", CONFIRM : "تایید" }, fi : { OK : "OK", CANCEL : "Peruuta", CONFIRM : "OK" }, fr : { OK : "OK", CANCEL : "Annuler", CONFIRM : "D'accord" }, he : { OK : "אישור", CANCEL : "ביטול", CONFIRM : "אישור" }, hu : { OK : "OK", CANCEL : "Mégsem", CONFIRM : "Megerősít" }, hr : { OK : "OK", CANCEL : "Odustani", CONFIRM : "Potvrdi" }, id : { OK : "OK", CANCEL : "Batal", CONFIRM : "OK" }, it : { OK : "OK", CANCEL : "Annulla", CONFIRM : "Conferma" }, ja : { OK : "OK", CANCEL : "キャンセル", CONFIRM : "確認" }, lt : { OK : "Gerai", CANCEL : "Atšaukti", CONFIRM : "Patvirtinti" }, lv : { OK : "Labi", CANCEL : "Atcelt", CONFIRM : "Apstiprināt" }, nl : { OK : "OK", CANCEL : "Annuleren", CONFIRM : "Accepteren" }, no : { OK : "OK", CANCEL : "Avbryt", CONFIRM : "OK" }, pl : { OK : "OK", CANCEL : "Anuluj", CONFIRM : "Potwierdź" }, pt : { OK : "OK", CANCEL : "Cancelar", CONFIRM : "Confirmar" }, ru : { OK : "OK", CANCEL : "Отмена", CONFIRM : "Применить" }, sq : { OK : "OK", CANCEL : "Anulo", CONFIRM : "Prano" }, sv : { OK : "OK", CANCEL : "Avbryt", CONFIRM : "OK" }, th : { OK : "ตกลง", CANCEL : "ยกเลิก", CONFIRM : "ยืนยัน" }, tr : { OK : "Tamam", CANCEL : "İptal", CONFIRM : "Onayla" }, zh_CN : { OK : "OK", CANCEL : "取消", CONFIRM : "确认" }, zh_TW : { OK : "OK", CANCEL : "取消", CONFIRM : "確認" } }; exports.addLocale = function(name, values) { $.each(["OK", "CANCEL", "CONFIRM"], function(_, v) { if (!values[v]) { throw new Error("Please supply a translation for '" + v + "'"); } }); locales[name] = { OK: values.OK, CANCEL: values.CANCEL, CONFIRM: values.CONFIRM }; return exports; }; exports.removeLocale = function(name) { delete locales[name]; return exports; }; exports.setLocale = function(name) { return exports.setDefaults("locale", name); }; exports.init = function(_$) { return init(_$ || $); }; return exports; })); PK!XDZNNFabilian/web/resources/bootstrap/fonts/glyphicons-halflings-regular.eotNAMLP',(GLYPHICONS HalflingsRegularxVersion 1.009;PS 001.009;hotconv 1.0.70;makeotf.lib2.5.583298GLYPHICONS Halflings RegularBSGPMMF٣(uʌ<0DB/X N CC^ rmR2skPJ"5+glW*iW/E4#ԣU~fUDĹJ1/!/s7k(hN8od$yq19@-HGS"Fjؠ6C3&W51BaQaRU/{*=@dh$1Tۗnc+cA Zɀ@Qcal2>Km' CHMĬfBX,Ype U*Ҕz miO1nE. hx!aC XTV‹ R%|IHP5"bN=r/_R_ %҄uzҘ52ġP)F7SqF{nia@Ds;}9⬥?ź R{Tk;޵ǜU\NZQ-^s7f 0S3A _n`W7Ppi!g/_pZ-=ץ~WZ#/4 KF` z0| Dѵ&däIÏ;M{'omm I !wi9|H:ۧ{~qO, L]&J09/9&Y 蓰{;'3`e@vHyDZ$3Dx28 W Cx5xwB`$C$'ElyhԀ DJ $(pQAA܉A@'$ hp0V0 `se$4$"t2=f4A{Tk0|rH`L&sh]A<`R'!1N;_t3# V *veF`E O${)W=p:F`22ړC^.ćG<.pNe2ִ+Ysl:˼ ܫu5tu^86ȄTmyQ%u~%~1rҘawߚ^_ZZa0!N`. uqYB\ᨀ[e:@J'Eہ,3ubj@pfeW9( ޅ=lG7gj SM609OˑlBa݁ <Bՙ(VRApf^+g9qMt]تpEr@]@VkV ud^X R@?EY2]#Ǽ4JK'dPC|mmn#$+48u'e&[n[L%{BCDL:^!bƙ:&g3-3ub iLZڂWFSId6.k5Pl77UzT:NN.")['|U"AIvwptdk9嫫9nDmq7I|6Kbc]MBABȪ_JT q  6@Fhd`GT:M7'L,IhFP ~j $¡„ 3hA-S^چ-%qe~Qqln"i&Qe?FlK"As(3Y;"Let'RzM1 0{=) K%$C 9M4c EotjVGD)l8,\w !%$3t TBzҴ iUJ[xgdBr$!eq"J> )\~3(^ R€8#>bHG'7_ fӫcκtDoAA߃(qB<``VΫ֘*buP4v@+.Qԥ$V@C0 RܐP[z:XH#e s>?EWO>@I$|si ES)0A?9ab,@K̩o&Q% ϞLu+ +H|Ɛ?NK4CnPt 'OT.j5Ĵ8vw֜I&+`yScaO[#gQd[KI矗`ČLP # )27aTi@c\ސ 0nCpߖ運4͵x*RzYbT[\kUvHʈqp঄IIŗ) bB XPNtz 2 I== ;}bqjiކa#" >11Ap1POOuxQ Fϲ(h݄O'MDxLK$ȵh& 14SirHJPtDM;rM+ *ؗ5u2$f3K %ѳb (@,2f,~"7R;E;HX(42Z'Tۿ2J+^!#oY~4-׃GW*!A0&8f{`W=DP8'= R g}iP>#4EBRY^4eN8V,[BĨD#X],LBsNC> +o^x jC.4Ya_{eA2=r+9POA!! }YPJeGn%x1/}RgHa ^3- 5 |qSaWK{ 1al`I1 Qf_yyCZ)L3X] W6@DMT<.uGK8DsбWr\7Z\V"ISd>CUjeD 3MtWcPӉ6#3QnቩJ\7#磱`؀K lV6 &T ~l. @61`! ` wYk/a0A¹ԁYhdxk:fEao̟^<IwYgq7s[ -y1ع5aMKאRBYFq}8*Nt'.YbZvK (]&ɜ(ՙ2:0 oΏхPKiBH4UX,[$ 0mXش f50VR 8%ާDtUs`-BPzPsvI8z-t1DiB "˶YTJ .?07jLN[2tĮ̎ #6?E׻:ɞY;A&qSIR)ss 9*x0Bj)mHAhyЏhMm&4Ŋ4 gV&tYOCS0Yd7MvNj)wA(o "͢[ E`7ezď-Q]6+Bca@^I:һ=sSnc 6 OB4LGpBq/>O pwj A*@JC[h&3B Qbϩ8 :%f~v/lS00a"B8(f uGoǚgyt_y~͔ %mL !I$Xt0~ePz]Ug Н=_?.j#+`li BM5 őGp7a ֒%Y[UG9@\bDY{{ED0 $Q+FvC`ݨ3Q E\uC9![$l 6DoDgG*+X!%#Cq ?8ZUB)U@opgީZq89|uccAќW;@">Ph_9}.6V/O:3}ZS {:~ykcO6;OB=bV. Rk o ^GV= }oI"+ ]wFzϷ`<30h3]Rf859s`KM8 XUq<\ZOssM&j&  .%PBL~^Gˈ3pD:Z<\ǠiW̆"(:zX~0PG]8RQMNTqfW~!0R%Ց0xvGFy/F-wu/*+ \8@6c<L;c[º nr QS'oQuT{qҐ_ͿSdA*ð:m8Yuz2PB Hh`lkpLLh cEb6eۏҋ ?!>| *=VK@rx0G`%ryr[6Y37 f**n%9df11ޢځ^'] Rq.,^%l e#wWs56!=!q[ %Ԯ]5^:m5)?V b|u7fw,:Ye R% [ o gFAzFPx{dxíw8ٔ{{L> d2CLL,L,(mS$=|%֝lu& ą83 N Xx \VnJ[)Iw/鹻 |GźYDH*Sp60cJ2@W%Ѧc_^$#*:G6n>D;~`9hXB UJB_вˈ%w'$v|#T<68KMϑ-5U+'B ĪNbJOv'|+*Mk(d }C˱@q&aR%} !VЃs3w2a2awHz/Q0F ]~;ä NDP mK3xke_ S!V&=v_PL9؃Yi NU_)J69f*S  17F|BR$y,Ʊ.&=uqsODBR=ɳeؽɇBH 2lu'h7^#S)Xi2..Pe/@FK$](%|2Y1pC8tI11N//+\pjdWmI=߽YZxMЉP81/ JG^U ,Pd1O^ypql2h$jvI%]V .'[+WU8[D,߻-=[ O wE)3J&dقݶR¡S\. 5J$I&oHȳ~ lz> Ux/Hu;?Gt{?;TH L|F8}{p:2t͆aѧp65Y"LD.rVS_ k]n&Hz~9æ p $4ق'{&M\ΰч!qi (.h' B T|{I6cL.빍iI꫿\!;g`1 j%C o3*60E؎]t.-%0 YK_nft] *VFCtJT+\WZ8gF^ ޞf 5I=#6.@2z;W`B/ęQghjyJNAX3, K66ڲM0T@O{4kj|"ftџۄU<-a5b)^R8:ilKa6@!]buvΏ$ oUœ~:.Lte JξP l$S[z~Rq39钺9Q/m"%ʤ7 5MKL鑧"IߏG XTގXLFݧV jp^/Mgۻ{w *9Oʈ<"aAq.M2@mp^'wߕmkxO8 $[&|YZy`2_|%r/J?QṈl3ÞKE$wvCh a@U1M%0?1* $GZ{!|ʿ$ە-٪Ev;͓:`Bl˸쌧ɬoQ0&,F?^s,ch˕$Ecl0w`⏺ň@/r^l8cT3k@JݔuP&ʪNdJjTKi *uX{tj~ɡ}i\BKenȵ|N u#]@lCZ$iPa㸩t04y20 s֪,Au!QBϖ^@Vsɑ\Za7쾉ш6-TrU u~1HJ(<αbRԖqi J?eG *jVħ ":Y);-Fd!HG~ux cb6m)&;0dU?8X~12ۼtIx5{(z '[ŃkZЅi,b1̇`(mHNeK/ [(#QGduT^m%!(7KgP=hϕkɐU+.[eC"GDΨ<*Ř 9&܂?)\<&Ŏ5 LJu@Y,냲ھ_w0^17p޻*>D8_)$UźR!jOF>{ t,-bP,m`D"/zA ͔إQZG&U]xejxLwv~=)@B6?!;53/ps@tOZS7ؙnlxZ?Zj a{6L41 2Qi&֥l]o=7ļ ofЖr MEV@H/aD٦HlK5)ŒZ OE3IG'г;D'zl(E$.ٜ-W R'\w+)w3꺾 @%R).~9;].šg+)%ȝk҉^NW>b1z:soD K2w[|>9vWMFu`axchիU`*ʆe]OV'6xd?H]_rA+zdFH ʋ<ǴkUsFzaH9-gvb=L/E).x9j%B)$AB t b.bAEZRbH(Jya9Wj0fF'Xz $DQ6q` o i={#4FYH@J3 3i~tYТhkHP17YD"pĦ;'16fpu>FoDQin̒- @P# hj ނŀfC 7°T5HVXpklĭ]yXr)?ͺBNJ B#9e&&_0=pZ6h) ̗a b=(p);.N,W^ *hԺCm}E7i6aIvͲxp*Ac#4N&`)ĉHWey7jloEh_n3 jp?4p2WE'kT_ &!ȖjVlHӻ_kɚʳaY s@[G"bYLܫXi Cq8&zVaY{#I@2m!d[1 AƢnKeם/>dmuX:xʷ\pNl+H+ctSǶC[~3e}6 \,Ʉ|Yݧv]'|&M2 ddsx-((76aXm=ӊQ<$Q†\ qiH阇i'i$"{S*VwF/tfQCWUZ{S;Nx}H&* 9׸qU1 a`(M-aG}n̽0 pmcn ɘ_\l} 9FvHþkJZNO mZQҤ aSf )QC+2 d[ H"t* c*bڢq,#S#u'Ҭ:4asCDMF|ɸm_1L]Y\*X>tgDd@&[)8;<{8<+VG\H^aae-4sJA \ hM[\`#pD5Z97g;BWmqTXX%0v&]E 4]FIJ&S_4R0D+meY gO+M{03v'ͅft:;ر Nn\ǔ^,)1laBZZ[  ZSUYh߆wS\/*?zQЋ`X4gr[CWG.Y0Q|RԃE[wy),ш$NK@c/b -#ZI G$ƗtmH#)XwPZAD|S ofTH)>M1b 7ɆSuq jK4[s xL Ǣ]5 !M!AdƧN><:ǻZ(8)e /W| bDDŃtT7rur0Ң`ܴh5 5S}4hrvalc!ZjB]xDbTxzYS6_)op>#@PS*bS\q ƋxYfQ><" Y6IEr_7Ұ VH!IrEL6!Nq"'daqMvA% v n.;A/2ʲa8D$GWv#̏ 9k'o؟o@ (]gk+}/ (nqK(f Ɵиp23YwpDdGq2$}KӯA"E&Ntg'Nes!Ю4qo}쿝S,ojr/s TMT&Qf\12h'&ctN'Tx7]2 ;G ʅ|T++:%/ 1T  ˀ<4͔˗ ,0~!WO' :suҦن(^ﮎ )7fmlҹ1ūtZh L0 6X"J҂ 49 ֩B}ԭ``Ӓ #Jn_F H|$OK=œi17o-Hqp[ɫ%%:Ɉi3۠G CLL4S:dBj|pYSDP>pv5KLe{t0yEND$*;z5NBIgn.N|׶nRaSZJcH mXek;_ 6,yb0#ZA e|wG U1lLD7ÄVqt[xuEQULPBlZSh.1Q0Uٱ8Rip;{H#GON!?t>Q |pkq!gT,j2sǍ4툊tjnƛ/IOE!ˋnF4M&1x$ew+vS  bm]e%8 P !s_06)Q2JB [t9'Ԝ,[fÆג]BB@r&Bs|Q gOC1J D&LJiC`A^#X8tH?daĖTSTaH0@U)^e}Jb7%ܔ%:ƿ@M+ysqL Y00ÔGD >ĩAW 2I:F 32ʠq:6S]K"g[ ϑHB5VEqLJX{CB!PIq9Llxʪ7>֤]@!@9H!pə$ ?)܎l/"́+@`}}:\ 8zQgS+򒤿C}R:HUF\Xg/AZ%c1wlETwX ZNhyf2D ø&vLq47z\iJyJ-kN3 -sJ5)V0N0d\ӛd0d-E[mf\UmxCR<(`ѕp4^!hQ `!l ~ƙ:JɠlW9˸ZXB=l)`jeVJUG!s1?Ƽ3Ê.}bIa6ʕ t?SxZJ'p i,.R2T`5-R BxrWH JPe#Bb|-[PEh‹(5Sfr/]IƊ dE#OS39ӻ]eۮɹ.9_beM9b#e(- 0Ra9"U,%~X܀z۽{'6[@t[W%* .d'vR {h!AedCE}x=E[|B$7J* B- ,=k7[_-I J5e̶{ ( ;WMw`~pAz 8f))(@ Īم<.a%N n@bz>%T*?lgbd<ĵw9Na8;<^*%y:tDҕZ<@0q4l\ 1`/$IJ ғsN);:A;)$ו Wwy%KrIv\bV\nd{6tv/~*O 7U>8rAC<jE-j牷xs)D1Ì/qp**̸$ّ,  Bȼpk MhpK7U]h&-$鎻Y;q6wzW˄֭AhD^R"s5fw +Q&/9ȂwNbz{Y> ]NEc,ߞ# BF:0/-EȾŒ׃F\I{tAZCORuk i)ytkdN&vA P{P'>xƆ`.%,;:Կ:aFoTQ}v#ףQk's~z5hMQʒY>CʍiUNF#J0uC8k! fv {E/IKIE> pyde ʾ=z:@7J|5g8x 3O 3H1؄F.yfzWIM j[.w%i?҆Uf|}@+[8k7CxSEOޯp$Q+:<]K3T-y[Nz;y-HZY^.M*'h8A.N2rLB 7:Or}CS˚S9Jq#WI}*8D!# g#Y>8` В ?a2H,^'?^nhOƒi<Ya2+6aFaMG-Gkè1TbL `*ـVX *xe§֊Z*c`VSbJU*6TK@zqPhg*ߔU(QU49L cM*TR!R,BȅE*C|TzpF@4*텰جXbL.T2y`Upb T,%@` #?@tGLŞS)ÿztϲFy׎ 14Lhfe(.)pK@\ Xe@TbvhD&0-IbD d@ZD1@ DyѧCN| 94Ӛ#Nc l;, `cX@(2$0 "@- $B@<$А8p7C b(@ PA@F 0tGORIJITySMW52\ToRKV0Ȏ( -$ !6wHGO r~e~/]V~/P~7SzKFv`;`9v# JBN,ӭ'`'`\LTApBs)r! ( i`PK!|¨¨Fabilian/web/resources/bootstrap/fonts/glyphicons-halflings-regular.svg PK!<\\Fabilian/web/resources/bootstrap/fonts/glyphicons-halflings-regular.ttfpFFTMm*GDEFD OS/2gk8`cmapڭrcvt ( gaspglyf}]oheadM/6hhea D$hmtx `tlocao0maxpj name,post5 webfTPT=vuvs Z 2UKWN@ { , h, h@( + / _ "#%&&' ' )9IY`iy )9FIYiy !'9IY` * / _ "#%&&' ' 0@P`bp 0@HP`p !#0@P`fbߵiY!     |vpjdc]WQKED 5 *+  / / _ _  ""##%%&&&&' ' '' !& )009:@IDPYN``XbiYpyaku } )09@FHIPY`ipy !!#'09@IPY `` ((h ./<2<2/<2<23!%3#(@ (ddLL[27>32+&/#"&/.=/&6?#"&'&546?>;'.?654676X& j  j )"& j  j )L j )"& j  j )"& j LL#32!2#!+"&5!"&=463!46^^L^^p@LE32!2+!2++"&=!"&?>;5!"&?>;&'&6;22?69  x } x }  x } x v L   d    d  l d;2#4.#"!!!!32>53#"'.'#7367#73>76p<#4@9+820{dd 09B49@4#bkv$B dpd>uhi-K0! .O2d22dJtB+"0J+ku0wd/5dW%{L>G!2+!2++"&=!"&?>;5!"&?>;4632654&#^CjB0  0BjC x  x u x u@--@$?2O*$ $*P2@%d    d   BVT@L!2#!"&=46 %A+32!546;5467.=#"&=!54&'.467>=2cQQc22cQQc2A7 7AA7 7Ad[##[[##[dd76!' Pԇ $ op zy#%**%$ pdL #7!2"'&6&546 6'&4#!"&7622?62~   \l lL 7  &   l 2'7' & c_"fn &\`tfjpO32!546;! 22&&L%6.676.67646p'0SFO$WOHBXAO$WOHB"7Q)mr *`)nq&* )2"'#'".4>"2>4&ȶNN;)wdNNrVVVVNdy%:MNȶ[VVVdXD>.54>0{xuX6Cy>>xC8ZvxyDH-Sv@9yUUy9@vS-H^{62!2'%&7%&63 a o  ^{"62!2'%&7%&63#7'7#'JJN a o  d⋌&2##!"&=467%>="&=46X|>& f   f &>|.hK  ]  ]  Kh.| L#'+/37GKOSW!2#!"&54635)"3!2654&33535!3535!35!"3!2654&35!3535!35~  Ud  & sdd dd d  & d dd dL   ddd  ^ ddddddddddd  ^ dddddddddLL/?!2#!"&546)2#!"&546!2#!"&546)2#!"&5462pmppmpLpppp LL/?O_o32+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=462LppL/?O_32+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=462DDDLpp&,  62"'&4?622;;nnBB# "' "/&47 &4?62 62    ;    %I2"'#".4>"2>4&3232++"&=#"&=46;546ijMN,mwbMMoXXXX K  K K  KMbyl+MMijMXXX# K K  K K %52"'#".4>"2>4&!2#!"&=46ijMN,mwbMMoXXXXX^  Mbyl+MMijMXXX  -32+"&5465".5472>54&&dd[֛[ҧg|rr|p>ٸu֛[[u'>7xtrrtxd/?32+"&54632+"&54632+"&54632+"&=46  ޖ  ޖ  ޖ    ~ p     >     GO27'#"/&/&'7'&/&54?6?'6776?6"264X!)&1-=+PP08,2&+!)&1-<,P  P/:-1&+x~~~P09,1&+"(&1,=,QQ09-0&* !(&0-=,P~~~d!%)-1!2!2!5463!546!5#!"&53333333,);  ;),,;)D);dddddddd;)d KK d);ddd);;) dDDDD 62++"&5!+"&5#"&l`    j`  w  ? d3!#!"&5463#"&=X;),Rp);vLp02".4>"2>4&3232+"&546֛[[֛[[rrrr|2   [֛[[֛;rrr   2  ^  )#!3333))p,p,d/3232"'&6;4632#!"&546;2!546& & T2   2 >p  ^  12".4>"2>4&3232"'&6;46֛[[֛[[rrrr|  & [֛[[֛;rrr   12".4>"2>4&%++"&5#"&762֛[[֛[[rrrr   &[֛[[֛;rrr  9!2#!"&'&547>!";2;26?>;26'.    W & & W tW    >     '2".4>"2>4&&546֛[[֛[[rrrr[֛[[֛;rrr] $  (76#!"&?&#"2>53".4>32  mtrrr[֛[[u$  Lrrrtu֛[[֛[576#!"&?&#"#4>323#"'&5463!232>  ntr[u[u  h ntr$  Krtu֛[u֛[v h  Lr d/?O_o!2#!"&546!"3!2654&32+"&=463!2#!"&=4632+"&=463!2#!"&=4632+"&=463!2#!"&=4632+"&=463!2#!"&=46}    R 2  2   > 2  2   > 2  2   > 2  2   >   ~   R d 2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2 L#54&#!"#"3!2654&#!546;2uSRvd);;));;) SuvR;));;)X);dLL 732#462#".'.#"#"'&5>763276}2 d!C@1?*'),GUKx;(.9)-EgPL 3 0[;P$ 97W W!1A2+"&54. +"&54>32+"&546!32+"&546ޣc 2  2 c*  `  ct  ,rr  ,tޣ 4  4  G9%6'%&+"&546;2762"/"/&4?'&4?62A   Xx"xx"xx"ww".   ^ x"xx"ww"xx"r/%6'%&+"&546;2%3"/.7654'&6?6A    `Z  HN.   ^ d  g~jb1K3#"/.7654&'&6?6%6'%&+"&546;2%3"/.7654'&6?6 D@  *o;7 *    `Z  HN iT "ZG !   ^ d  g~j  !%-;?CGKO3#!#!#3!##5!!!!#53#533!3533##5#535#5!!#53#53#53!5!ddpddX,,ddddD dddd,D,ddddd dd,dddX d,,d,,ddd dddddd,dddddd  #7#3#3#3#3#3!5!#53#53#53ddddddd,,dddd,Pdd[[[[[   "'463&"260V C;S;;S;V0 ;;T;;  ! "'463!"/ &"260V 08D;S;;S;V0 V08;;T;;d&!2&54&#!"3!2#!"&54?6,9K@  D@   K|@  @  J  L !2 46 >>CEU!"3!26?6'.#"#!"&/.+";26=463!2;2654&!"3!26/.6D N9  >SV N N      & X & l l- p  v       dL!)13232#!"&546;>35"264$2"&48]4$);;));;) '3]dϾV<?!(% _5,Ry:" *28 T2*BBW-ޑY". BB % Zd'2;#!5>54.'52%32654.+32654&+50;*7Xml0 ); !9uc>--Ni*S>vPR}^3:R.CuN7Y3(;  G)IsC3[:+ 1aJ);4ePZo!56764.'&'5mSB ,J   95(1(aaR@ 9%/#4.+!52>5#"#!#3'3#72 &2p"& 2KK}}KK} dd R ,১ !%/#4.+!52>5#"#!5!'7!5L2 &2p"& 2C১  vdd  ,}KK}}KKL/?!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=462X LLddddddddL/?!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=46DLDLLddddddddL/?5463!2#!"&5463!2#!"&5463!2#!"&5463!2#!"&Xp LddddddddL/?!2#!"&=46!2#!"&=46!2#!"&=46!2#!"&=462LLLLLddddddddL/?O_o32+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=4632+"&=46)2#!"&=462ddA ddA ddA ddA LddddddddddddddddL#*:J!#;2+"&=46!2#!"&=465#535!2#!"&=46!2#!"&=46dddd ,XLdddd}KdKddddL#*:J32+"&=46#3!2#!"&=463#'7!2#!"&=46!2#!"&=462ddgdd /ȧ,XLddLdddK}}dddd!2#!"&546 K,,,,,,v,,,D,,L!2#!"&5467'2"&4,XJ*J%pNNpNL d>tNoOOo62.'&54>"264usFE66 !^Xm)!fhHuXyHÂ2".4>"֛[[֛[[Ktrr[֛[[֛oVrru5.54>6?6&'.'&76#&*IOWN>%3Vp}?T|J$?LWPI)(!1 )  HuwsuEG^F&:cYEvsxv!K:%A'# " A)Y l */7>%!2!"3!26=7#!"&546 7l l27);;));Ȼp87cs* s ;) );;)2cL6!#"3!2657#!"&546&'5&>75>^i4);;));ȹpS 9dTX .9I@F* L6;) );;)g  0!;bA4 L5!2!"3!26=7#!"&546 62"/&4?622^^  Ȫ   ȯ  ȭ   ȭ   L326'+"&546d0dLJJL#3266''+"&5462d00dLJJJJ3''&47660J*J36 &546.2   d32+"&546!32+"&546  dL#!"&5463!2L  346&5&5460d * ;O#72#"&5&5&5464646dd12N: 9  > =,L32+"&5&54646Rdd0L;;dH  #!"&762!2#!"&=46  *9HdduJ  u`((&;(J ' 7(a#aa32".4>#"#";;26=326=4&+54&֛[[֛[[}dd[֛[[֛dd2".4>!"3!26=4&֛[[֛[[E [֛[[֛~dd32".4>"'&"2?2?64/764/֛[[֛[[ xx  xx  xx  xx [֛[[֛ xx  xx  xx  xx  $2".4>'&"2764/&"֛[[֛[[Tw[֛[[֛1Uw;K2".4>";7>32";2>54.#";26=4&֛[[֛[[?2".4>#";26=4&#";#"3!26=4&+4&֛[[֛[[    KK  ^  K[֛[[֛V   2  2  2  /_3232++"&=.'#"&=46;>7546+"&=32+546;2>7#"&=46;. g  g g  g Df  fD Df  f g g  g g ͨ  fD Df  fD Df?2".4>"2>4&"/"/&4?'&4?62762֛[[֛[[rrrr@||@||@||@||[֛[[֛;rrrZ@||@||@||@||02".4>"2>4&"/&4?62762֛[[֛[[rrrrjjO[֛[[֛;rrr}jjO!2".4>"&32>54֛[[֛[[KtrAKihstr[֛[[֛;rtxiKA>rtsS6!2#!'&4' &F   &S &5!"&=463!46 &U & U ## ] #!+"&5!"&762   && ]32!2"'&63!46&# U & U # &] &5>746 ^$,[~UU & U #$DuMiqF +!2/"/&4?'&6!"&546762R,^j^!^j^^j^P,^j^IIgg+#!"&546762!2/"/&4?'&6j^^ ,^j^`j^,^^j^/2".4>#";2676&#";26=4&֛[[֛[[:#6#:1  [֛[[֛.   IUaho276?67632;2+"!#!54&+"&=46;2654?67>;26/.'&;26!"&5)#!  &0  =  2 pp 2  =   353  X  v  v !{,  2  ,ԯ  2 0y    r w  +I6.'&&&547>7>'.>7>&67>7>7>-BlabD8=3*U  :1'Ra\{%&=>8\tYR-!q[Fak[)ȕX1 "@&J<7_?3J5%#/D &/q!!6ROg58<'([@1%@_U2]rO.>7'&767>.'&'.'&>77>.'&>' '8GB    `H  >JS>H7 '+" NA 5M[`/Pg!;('2"&"IbYCe\D9$ 886#1%)*J7gG:    8G\au9hoK$]54<&"&5476&2>76&'&6?6&'&'.{nO9:On{{nO:9On{FZ  2Z__Z2  Z# %8-#,- "F-I\b\I*I\b\I--I\b\I*I\b\I9>||;7Es1$F^D10E^E$1u$/D0 "%,I';L!#7.54>327377>76&'&%7.5476&6?'&'.P[vY,9On{R=A &/l'PjR.Mv&  6QFZ  *HLh5)k|# %8- ,- "xatzbI\b\I-yRU4Zrnc1?1FrEs11) ]@ @] )1ES>L'+/37;?CGKOSW[_c3232!546;546;2!546#!"&5353353353353353533533533533535335335335335Rd22ddddddddddd|ddddddddd|ddddddddd2222pddddddddddddddddddddddddddddddw%7&=#!"&=46;3546'#"&=463!&=#'73546oXz#z*dXzdM*zL!2#!#"&546d);;)d);;L;));,;)X);dL ?32!546!32!546".5!2>&54=(LffL(, '6B6'p)IjV\>((>\VjI), +'%! !%'*L 'L'a'M 7 Maa'aQd_)!232"/&6;!%+!!"&5#"&?62**p&032!2#!!2+"&=!"&=#"&/#"&468^&d,!02**6%%+*2222 *L !53463!2!!P;),);DPdd);;)L 3463!2!!;),*:,P, pX);;)dDEk+32"/&6;#"&?62{**YDk&=!/&4?6!546X`)  )   !.#!"!"3!26=4&53353$`$-);;));;ddd-(d;)d);;)d);dddddL #12"&54%##"+"&'=454>;%".=4>7i**d]&/T7 " LRQ  )2( Jf,53232#"./.46;7>7'&6327"&)^Sz?vdjO9t\U>/ v?zS$2451 7F8%M)(  ()GM~ 1==7'''7'7'7'77 N괴N--N괴N-N--N괴N--N괴d!-=32!2+"&/#"&54?>335!7532+"&5462(<H(<,F=-7` 1dd>2vddQ,}Q,d-!2$'$(ddw} L 0<32#!+"&/&546;632+"&546!#35'!5X,<(<(21 `7-=|dd_dd22L!-d,Qv,Q($'$dd dԯ}wdO7G%6!2+#!"&5467!>;26&#!*.'&?'32+"&546dkn  T.TlnTj:d%8   VOddip &yLN(  % H YS(22S dO6F#!"&'#"&463!'&6?6*#!32!7%32+"&546n jUmlT.U  nJ   %&jPddO (SNLy& pd(Y aL7G2#!"&/&?>454&/!7%.!2#!"&=46ސNS( % p &y22SY( nTjkn  T.T8   Vd% dd-I!26=4&#!""&5&/&7>3!2766=467%'^ NLy& p  (S22(SYLddjTnlT.T  nk V   8%d%2".4>%&!"3!7%64֛[[֛[[  [֛[[֛9   &%2".4> 6=!26=4&#!54&֛[[֛[[%  [֛[[֛ &   %2".4>&";;265326֛[[֛[[K &   [֛[[֛@  %2".4>#"#"276&+4&֛[[֛[[  & [֛[[֛  2".4>%&277>7.'.'"'&65.'6.'&767>'&>7>7&72267.'4>&'?6.'.'>72>՛\\՛\\d+: =?1 " "/ ?9 #hu!$ 0 E.(,3)  (     *!A 7 ,8 !?*  \՛\\՛  ' "r"v G  .&* r$>   #1    %  *  '"  $  g2( % 67'"/&47&6PM<;+oX"O\e~Y+" n+We`#'7;!2#!"&=46#3!2#!"&=46!!!2#!"&=46!!d);;));;);;));; );;));;,;)d);;)d);dd;)d);;)d);dd;)d);;)d);dddL !2#!"&46!|;**Dd%32!2!5#!463!54635#!"&=);,); ;),;);));;)d;)pdd);d);dddD);;)+AW!2"/&546)2/"/&4?'&6#!"&54676276#!"&?'&4?622,^j^5,^j^/j^^^^j^j^,^j^&j^,^^^j#;CK2".4>"2>4&$2"&4$2#"'"&546?&542"&4$2"&4ݟ__ݠ^^oooo-- - L- 73H3)z - - - - _ݠ^^ݟWooo -!!- -! $33$ 1~ - - - -Z[%676&'&#"3276'.#"&477>32#"&'&6767632'."[v_"A0?! -  Y7J3$$ )G"#A.,= # (wnkV8@Fv"0DG([kPHNg8B*[eb2!5(7>B3$$' )M"#!7)/c# *xnfL@9NDH7!$W]B$&dXDD>.54>"".#"2>767>54&0{xuX6Cy>>xC8Zvxy#!?2-*!')-?"CoA23:+1! "3)@ +)?jDH-Sv@9yUUy9@vS-H-&65&&56&oM8J41<*.0(@  )*D*2Om9w.2&/7'/&477"/&4?BB8"._{iBBi BBBBBB7._BB^*k"5._{jBBFi BBBBBB77/_2#!"&54>!"264d:;));XV==V=.2G);;)3-D=V==V "/''!'&462*$3, #**#4$*' 2@K#.'#5&'.'3'.54>75>4.&ER<, 3'@" MOW(kVMbO/9X6FpH*M6&+  4C4%dfJ2#4.#"3#>36327#".'>7>'#53&'.>761T^'<;%T)-6"b "S5268 jt&'V7  0 $ݦ -$aPN(?",9J0* d2>2 ""   7Gd/9+DAL!X32"/&6;3+##"&?62*Ȗ*,|%#5##!32"/&6;3353!57#5!ddd,*dc,dd|ddd!%32"/&6;33!57#5!#5##!35*X,ddd,d,ddPdddL32"/&6;3##53#5#!35*Xdddd,d, dPddL32"/&6;3#5#!35##53*d,ddd, ddd32"/&6;3#53!5!!5!!5!*d,dpd , 32"/&6;3!5!!5!!5!#53* dpd,d, LL!2#!"&546!"3!2654&^pg );;));;Lp;) );;));LL+!2#!"&546!"3!2654&&546^pd );;));;oLp;) );;)); $  LL+!2#!"&546!"3!2654&!2"/&6^pg );;));; $ Lp;) );;));LL+!2#!"&546!"3!2654&#!"&?62^pg );;));; p $Lp;) );;));L5!2#!"&=463!2654&#!"&=46&=#"&=46;546&p);;)>DLpd;));d&  #%2"+'&7>?!"'&766763 ,  P'' K    S#  nnV/L5!2#!"3!2#!"&546&=#"&=46;546^>);;)pDLd;) );d&  1!2/"/&47'&6#"3!26=7#!"&5463!m)8m);;));Ȼp,pm)8m;) );;)֥#2".4>"2>4&2"&4ٝ]]ٝ]]qqqq{rrr]ٝ]]ٝGqqqsrrrL#3232"'&6;46!2!54635 ' gdV^|d22L# ++"&=#"&7>!2!54635Gz " 'gdM !d22LK" 62"'&4?62!2!54635qgdq#d22L #'762'&476#"&?'7!2!54635*MMК=gdML*Л:d22L#'/'7'&6"/&4?!2!54635^WЛԛL*MgdКԚPM*MXd22% ! q3gqdL+!#"&546;!3#53LDdddp,E/'&"!#"&546;!3#53"/&4?6262L_  Ȗdddj\jO)_ p,j[jO) >'.!#"&546;!3#53"/"/&4?'&4?62762Lg%dddFF))FF))gp,F))FF))F/!"!#"&546;!3#533232"/&6;546L dddd*p,/'&"!#"&546;!3#53++"&=#"&?62L*ndddd*pp,L !2!546#!"&5!52LPdL&}-1;&=!5!546#"&=46;#5376!!/&4#5;2+p/22ddpddd33*ȖdȖ*yddQ%6+"&5.546%2+"&5.54>323<>3234>^%"% "  d d 1t5gD >?1) A..@  ^  ^ dL3"!5265!3!52>54&/5!"!4"2pK Kp"2KKL8 88 %v% 88 x88 %v% 8LL  $(4!2#5'!7!!2#!"&546!55%!5#!!'!73wipdw%,);;));;),p,ddibbd;) );;));dfdd&767>".'.7.wfw3 .1LOefx;JwF2 1vev/ 5Cc;J|sU@L#A2/.=& &=>2#!"&=46754>ud?,  1;ftpR&mm&L!((" """" '$+  222/2 ! '!'3353353!2+!7#"&46!2!546L J LP*dd*22dL #"!4&#"!4&!46;2d);,;gd);,;;)d);L;));;)D););;)L%)!2#!"&546!#3!535#!#33||D| ,dddL| |||Dddd,ddd,L%)!2#!"&546!#5##3353#33||D| dddddddddL| |||Dddd,L#!2#!"&546!#3!!#3!!||D| ,,L| |||DdddL!2#!"&546!- ||D| ,L| |||D ,L )!2#!"&546!!!#";32654&#||D|dDd&96) )69&L| |||DdVAAT,TAAVL%)!2#!"&546!#3!535#!##53#53||D| ,ddddL| |||Dddd, d dL#'!2#!"&546!3!3##5335#53||D|DdXddd,ddL| |||Dp ddL"&!2#!"&546!#575#5!##53#53||D| d,ddddL| |||Dp2Ȗd d d %2".4>"2>4&!!!'57!۞^^۞^^qqqql,dd,^۞^^۞Lqqqddd '+2".4>"2>4&#'##!35۞^^۞^^qqqql2dddd,^۞^^۞Lqqqd2d2dddddA 62632+54&#!"#"&5467&54>3232"/&6;46n,,.xxPpVAbz  & AwasOEkdb  A32632&"#"&5467&54>++"&5#"&76762n,+.yxZ % OqVAb   AwaxchsOEkdc  dLm%5!33 33!#"!54&#Ԫ2dd,,Md22y7/2#"'2!54635#"&547.546324&546X^Y{;2 iJ7--7Ji/9iJqYZ=gJi22iJX5Jit'*BJb{"&'&7>2"3276767>/&'&"327>7>/&'&&"267"327>76&/&"327>76&/&oOOoSSoOOoS=y" $GF`   Pu "Q9   ccccVQ:   Pu "GF`   y" $ooSWWSo++oSWW"y  `FG # uP  :Q # cccc:Q # uP  $`FG # "y  d "!#5!!463!#53'353!"&5+, ?,dԢdu       d !! 463!#5##5#7!"&=)+5, ?,>dԪ |  ^G |d 77 P#3!#732!!34>3!!ddԢ!,d!s, d,+$d$+ppLL293232#!"&=46;54652#!"'74633!265#535d22s);;);)X>,>XL2dd2;));FD);>XXԢddL6=3232#!"&=46;54652#3#!"&54633!265#535d22s);!);;)X>,>XL2dd2;) $+;) );>XXԢd  #!"&762#";2676&35} ,, }@D:#6#:&77&P'L. dd LL/?O_o32+"&=4632+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=4632+"&=46!32+"&=46!32+"&=46                  L                  )33#!2!&/&63!5#5353!2+!7#"&46!2!546dd^>1B)(()B1>^dd> J LPdO7S33S7Odd|*dd*22+52#4!!2!'&63!&54!2+!%5#"&46!2!5460P9<:H)"Z" )HJLP;))%&!!&**22$.2"&432!65463!2+!7#"&46!2!546 jjj."+''+# J LPjjj9:LkkL:9r*dd*22,62"&5477'632!65463!2+!7#"&46!2!546X/[3oo"o"."+''+# J LPk6NooN>Qo 9:LkkL:9r*dd*22",!!.54>7!2+!7#"&46!2!546X,%??M<=BmJ J LP9fQ?HSTTvK~*dd*22)2!546754!2#3#3#3#!"&546/R;.6p6.d6\uSpSuu;)N\6226\N)G6.dddddSuuSSudLL/3!2#!"&546!2#!"/!"&4?!"&=46!'|  % XW & dDdL D 2  % XX %  2 dddL#-7!2#4&+"#4&+"#546!2!46+"&=!+"&= Sud;));d;));du);P;ddLuS);;));;)Su ;),); 2222  !&4762 !2!546 'YV/ |UYY(n0U22!/.#!"3!26=326!546;546;33232!'p'q*}20/222,2 "!#!5463!#5!#!"&5463!#5,  w,, v  w, O,T    dGFV32676'&7>++"&?+"'+"&?&/.=46;67'&6;6#";26=4&KjI C   )V=>8'"d 1*) "dT,| -otE  GAkI ! "% ,=?W7|&F@Je5&2WO_e_ 2  2 ~ $4<Rb%6%32!2&'&#!"&=46#";2654&'&"2647>?&/&6%?6'.'.. +jCHf7" *:>XXP* @--@- -?0 !3P/|)( )f!% =  &* x"62&CX>>X83 D-@--@ۂ # =I+E( //}X&+ 5!H d9Q`o322#+"&=#+"&=#"&=46;#"&=46;546;23546!2>574.#!2>574.#q Oh ..40:*"6-@# d   KK   d)  )k)  ) m!mJ.M-(2N-;]<* K  KK  K X K  KK  "p "),!2#!"&'.546"!7.# Vz$RR(z }VG+0 )IU!zV`3BBWwvXZ3Vz&--% ,(1#32#!"&546+"&=ۖgT)>)TH66g )TT)g6633#!"&546+"&=`T)>)TH66B)TT)g66 %'5754&>?' %5%Ndd/\^^<ǔȖ  (Abd 2"&4$2"&4$2"&4|XX|X|XX|X|XX|X X|XX|XX|XX|XX|XX|L2"&42"&42"&4|XX|XX|XX|XX|XX|XLX|XX|X|XX|X|XX|ddLL/!2#!"&=46!2#!"&=46!2#!"&=46}  J    J    J L  p  p  /3!2#!"&546!"3!2654&!2#!"&546!5^ );;)X);; G ;));;)X);d,dddL;!2+32+32+32#!"&46;5#"&46;5#"&46;5#"&46222222222222L********, *.62"&%#462"&%#46"&=32W??WW??||||||*(CBB||||԰||||ӐB76+2+"47&"+".543#"&'&676/!'.6E*  '?) T 0I' *L #3{,# n  6F82 *5#"#!#4.+3#525#"#5!2 &2p"& 2D d 2d  dd R , W 22 L 05"'./#!5"&?!##!"&=463!2E  1;E%= !'y,2 " # 22+."A2VddGJ!2#!"&546#"3!26=4&#"'&?!#"3!26=4&'"'&'#&#2LFF &  7 ? 9   9 gLR   2 2  2 2 $ #'!5!!2#!"&546)2#!"&546!PpmpG,Ld|pd,#'!2#!"&546!2#!"&546!!5!2pmpG,P| pd,dd'+!235463!23##!"&=##!"&546!2dddpdp,d ,'3#3!2#!"&546!!2#!"&546dddpG,|dpd, pdL'+32+!2#!"&5463!5#"&546;53!X|^d,Lpdpdd,'!#3!2#!"&546!!2#!"&546ddvpG,|dpd, p,0o #"&54632a5*A2~ 6'&4O**{))*2A~ !2"'&6d)***2,~o #!"&762{))*a**( 5-5!5!Lc d 1#3!35#5!34>;!5".5323!,P2 &d2"d& 2dd,dd  dd & ,L%1#4.+!52>5#"#!#3!35#5! 2 &d2p"d& 2 ,, dd & ,dd,ddfrJ32 +"'&476 0  ) J 00   >fJ32+"&7 &6S )  0 J ))   fJr"'&=46 4 ))  w  )  0f>J ' &=4762j  00  )  0  =:#463267>"&#""'./.>'&6|Vd&O "(P3G*+*3M, :I G79_7&%*>7F1 ||5KmCKG\JBktl$#?hI7 !2+&5#"&546!5X,p dddL!2%!#4675'=DXDd dQ,[u}4]ddMo__<vsvsQQ(dpEHEd{ d&ndd ddddd5d!u ,d;I]ddQEJadd9'dddd dy'dddddddd,d,A22>ff****NNNNNNNNNNNNNN"~Fn2b\r bb 6 ( L 0  X * ^ h(T*v 8|t*<6`R.j(h6h^2Dl.vb F !2!v!"@""##"#8#z##$$0$^$$%4%`%&&~&'P''(4(p())*&*J*+ +z,,h,,---.(.f..//F/~//0>0011`112$2^223"3>3h344`445,556>6|677N7788B889 9J99::l::;;<:>>?(?n??@H@@AA~BBBCCBCvCCDD`DDEZEFFtFFG6GvGGHH2HNHjHHII8I^IIJJ.JR@. j (|  L 8 x6 6   $ $4 $X | 0 www.glyphicons.comCopyright 2014 by Jan Kovarik. All rights reserved.GLYPHICONS HalflingsRegular1.009;UKWN;GLYPHICONSHalflings-RegularGLYPHICONS Halflings RegularVersion 1.009;PS 001.009;hotconv 1.0.70;makeotf.lib2.5.58329GLYPHICONSHalflings-RegularJan KovarikJan Kovarikwww.glyphicons.comwww.glyphicons.comwww.glyphicons.comWebfont 1.0Wed Oct 29 06:36:07 2014Font Squirrel2       !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     glyph1glyph2uni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205FEurouni20BDuni231Buni25FCuni2601uni26FAuni2709uni270FuniE001uniE002uniE003uniE005uniE006uniE007uniE008uniE009uniE010uniE011uniE012uniE013uniE014uniE015uniE016uniE017uniE018uniE019uniE020uniE021uniE022uniE023uniE024uniE025uniE026uniE027uniE028uniE029uniE030uniE031uniE032uniE033uniE034uniE035uniE036uniE037uniE038uniE039uniE040uniE041uniE042uniE043uniE044uniE045uniE046uniE047uniE048uniE049uniE050uniE051uniE052uniE053uniE054uniE055uniE056uniE057uniE058uniE059uniE060uniE062uniE063uniE064uniE065uniE066uniE067uniE068uniE069uniE070uniE071uniE072uniE073uniE074uniE075uniE076uniE077uniE078uniE079uniE080uniE081uniE082uniE083uniE084uniE085uniE086uniE087uniE088uniE089uniE090uniE091uniE092uniE093uniE094uniE095uniE096uniE097uniE101uniE102uniE103uniE104uniE105uniE106uniE107uniE108uniE109uniE110uniE111uniE112uniE113uniE114uniE115uniE116uniE117uniE118uniE119uniE120uniE121uniE122uniE123uniE124uniE125uniE126uniE127uniE128uniE129uniE130uniE131uniE132uniE133uniE134uniE135uniE136uniE137uniE138uniE139uniE140uniE141uniE142uniE143uniE144uniE145uniE146uniE148uniE149uniE150uniE151uniE152uniE153uniE154uniE155uniE156uniE157uniE158uniE159uniE160uniE161uniE162uniE163uniE164uniE165uniE166uniE167uniE168uniE169uniE170uniE171uniE172uniE173uniE174uniE175uniE176uniE177uniE178uniE179uniE180uniE181uniE182uniE183uniE184uniE185uniE186uniE187uniE188uniE189uniE190uniE191uniE192uniE193uniE194uniE195uniE197uniE198uniE199uniE200uniE201uniE202uniE203uniE204uniE205uniE206uniE209uniE210uniE211uniE212uniE213uniE214uniE215uniE216uniE218uniE219uniE221uniE223uniE224uniE225uniE226uniE227uniE230uniE231uniE232uniE233uniE234uniE235uniE236uniE237uniE238uniE239uniE240uniE241uniE242uniE243uniE244uniE245uniE246uniE247uniE248uniE249uniE250uniE251uniE252uniE253uniE254uniE255uniE256uniE257uniE258uniE259uniE260uniF8FFu1F511u1F6AATPPK!{[[Gabilian/web/resources/bootstrap/fonts/glyphicons-halflings-regular.woffwOFF[\FFTMXm*GDEFt DOS/2E`gkcmaprڭcvt (gaspglyfM}]oheadQ46M/hheaQ$ DhmtxROt `locaS`'0omaxpU jnameU,postWH- Ѻ5webf[xTP=vuvsxc`d``b `b`d`d,`HJxc`fft! B3.a0b ?@u" @aF$% 1 x?hSAiSm߽44,qPK q XE](2 .ԩ] "ED i]DԡZJ\8wwV"FpUԯ.Χ(gK4O n;NR{g`'!PMUHEՠJʫ*Yq9c<U9!QIYׅ-KC+ դU)Q94JYp]Nq9.qyVV n)9[{vVכ־FWb++{>׍a|*gQ,K<'W@Ex̢D&Ud# & x Mx2c 5*.lN/h]GtT(xŽ |յ0>wm#Ye[%Y-YR'rYjD% ,@BKZjHڤ@b-R+nhK~룼$;h^fܹsn{ι ˴0 kb8Fd:%Lה"1AՔ AY>,ؔ#pZ4؟5made ?Ȝy=I:C D(nIxL .1!P'JDtHj@L4Ph' )b)vHX,f1c\'cGu>1 ~t?!xT_q?qBF#L%Dћ"?Yǯj??8>NSkemAYDb4 J);@jP$ 'qh8`;aX6CF*dYc"'?hLV㗌,>ce3eVh =C~xC\((qb@ 4xK&hׁ 4\2DZ6N1|-;j Yu@jѫxi䊧mK ٍDEwq3̷.cAw@4t.gkgr{~Wl~{lW2} 276a2\6oz@$HSH gbtX70Ktc1,7B oLƏ66[,%iZ ,l>TpKSGg\> #A#3Eyk6v;u3!ZI8Mk?8CWq{`C*h>H1_skh)ojOO' !~dXgB(0< kOYxeƧĭ5k =d ϧ> +tC-o Ǫ/_koܶs+fOztpu7-}d9 se \9.H4!0S\ ʱk2"?ip7\2zlްt=W\!KyOXimUnov 6: 2 LZkAA^qCޔ &PaFI0>&Q #FQl> A·q*OȦ_@27l,sf 6p7ܩ?M1vA2]$j";vlk~va0gjzRD:gc6yw%g(þ#'uB#=_@?>FVb0a!aL4tXv:Fh9j^xތz}Wn}7}jΚiHitKSaXEEbbBQ1ftxFȮ -"dqA\~F`6i䁕+ Ԣ^Ȳ}ש׆k&Ĺ<- \;g1>w00v^x 7l#Ot^5+xe.^]׼G8^ m(t1 sbfJ %<4H@e8C,5<(kc5YIA]|ךl6+=HVcbKՋB6i4 #_|&>NvQk#pW=u7HɰR$ [5싙 g %19}&@$&l=1RI}9#ςz??1z&ı_ac|PI[:u;l->k4GYm|Zw }HnR=-B ~m.ِ .Mz^,0%8EG**|sg|ozO֬0sz.WN^ yHk<v3t{8-|' ea~H94xA-@y bT4@0b#]DDljDSio:AgSP z:;-|yH"r {B{\5RLi6AAtM]taRKC!1CgC샂 +1EG!Xzٛnzv@x-#i^x*$)W=O\f[WX~V? `Lei::v4$?=Ra#c]8YFJb&'{%LCE Cf]^$/fߪM;À; 6CXV#X~ F< :vCcyBpLv1Fv#9 /8VF01_K?x>}#G7т\Wp!.@bwɡ+{o#ԍPQҮnī66 cZD(. u;nM}?vtxF{+` ="rPπlDV̶?Z@H䰅][35%O )\^ Z;>Ftf-IzӮ yu1uo<:oa:uqwykk ⋜}0?jvX+}VG$s ?26YI5c$Cfb!X*|F^$p7p55߶6[mjgl>* KO& 8ܝ:ǰokKm~oS-*4E}P/% k:e"1AJCAX8= LŢ>ܱav{|K.3 :\Bxwbeb>1ۿvH?f58 %6$ɲ'pL^HXbpIVqnA8Kg'i!UzSEI5N=hpV?(E Vr?޴7Vڋɿ.O;p 4NRZm.O> MuL'j5`;MtAQܶMyV<` $m)yڳXDa:݁q1JFq15-l\3~X-2pFDe/f!2i:=h{%{t^ *PBͽ]YD3jd *w|GLϽ}ˑk7Ç=06oz*zo1~Jw00SePw%#@BJB %+ ';%!& )Hq 7fqH.!Eǎf,9՚$9 H{~i Z)O|!"D.KQ a2 %2Wɂ\{*B{7,9.'ew U^W&$r9rcGBwll<ʷSQゅh! iѨvJ :Y?#_m4q[ },EA{VПP|Dg?9MId?{)/ /\[ Jҏ[f4G>QK^ m O -7w]„<U3jƏ,:Yq~0/mŵ@CCFq{,Θ쬷ΘQSo lsɿh?A2q`5Z&*X1L5:6ς+O]uej%?ۼ&aW?{2[}W?JbΙk-\b7sIkf&Λfx~nO-9V ~cW"ȗy)b\)2MrWf;MU7'[-c/.ؾuMl&.9) G!!W* 60Cф#qrqOKZOWq,8́/XpTȑg<>¤)[J8o` ;S\S%h~p|J˾F~K=E0NQX*8;D7Q1QC% *Eyy} UG?>I`>'6<+3IVgϮyOQ$WBvH v[Ϗ 2+ 'ø6N߆<ɕ 2S娚9X1\┣df>B~-t>W]pPrZ['+ƌl9]8qC!' @AAOuШ !?M\JMͭfǞ)ߕ=w?AN>¼}jQ<ǏpǠ^(}1+2q F4RiHďITr8^!gm>'ڸhE`s̊ol!(9~ o%#)~ƃj$@ՔLpGOa{߿fé)zؔY<~^cs潺ݴNRURTY%8Ks3qd]^QTb' zx)HFҩPmUZjQ&XƁo<0jYGz]$8c&hyݼwΞ{9^sf߹m[vӣ!(ZAsۧyB8RiԣBg6{UmtyW!bpǮd n/ŷʼ@v/%cxEn:4Y²,yZ-krcH&^ȩC'Ȯ'^T5r)((IJU&#݌! +YM.JEX^|Lw@ھZsgY洺\xԟxyLCyo?eV"_[Q/5Y|qI/\9diEBh$v wOL fpa ,?HgHf2RbL v >USo^1/,ēvcYGmŨ~Amz ?/40yj̸pk2H eERb/"M 75ul[drC&Y͐&I `!>p;J-b--.VM4>Fj/5σt5}>C*<'d?,cdGf2ҁ0w6Lh"fKζp;ǿ϶Pdc1EOi%Ř(DCWV2I)TiMFTz0U S7V mBW6;nYZUzSTg>(hF"޽T뽷R]L۶|Lx[s,'NU|E<4)Rp*vU#g*gjə*=~܃ASēA JHw3@NurbwȀʌx}[`7ZtPlh L.)NU}kq'vFQr׷{ˤS]ZL(@*Sf^+uPe_k#.8ɂ%ՠ,@TKх t`ߑXAD;b|pA7}q2 @Y`~iԬK0jY( R~^ҧ8>=F"˜A[DqvQCX|ZsO \/f.F;kPbdz7ԐeͶ-6bybaWjnh7YLF!4wssFCnh_0> MZ nC *#5/OUN\(3o@[7`Mg8xge;f\y|f֤ޑ]i5q5q&>'353kYꭑ=W7+΋yxIeOYǏs(p6[B/t爁*̠-n: <Ц) +ް~q_}oxt>LV FG@d9[2?2ȳ8笞={fgcsCmre#E>45qo:JX^ioP,xf:/yn9VѥS7=u-\%KϦUv,ⳀZ=vkN*+_.ڊ֞iڃ=w @lmr>Oo,VԲɝz &:'45!9pI 0@I[PU""sInvR>A9t$3/|k8yiE c8E!Q\ۂ} %Af4s*A8A΀>D=5uwjnG z?2Q/I=fH4n]澀YmG"2PEHfvZn<šPiA_q/PDտ $$~%NyhrOdM\-m(@\#ƼNJO>a+ uJ*(%¢FPJW,$))} B\_wV] 0TOCÊQ}5{Ho*;;葞rǨMc54S : M7(kY:z`gp Jstˉv'eG^~iD16dA @'N ֭N.?f…1bzJD V o@7R@6<%IF0mj= [}Nۊ57pyv4@<mЭ9Tp?R70қQG[jzib~/)wC? רa-/Cn.ĕH j63pKrhXIƎj o19 f\~:-ѓK47BY̆y%DC~em@]%rs4T G-Ug>HOpVB]{9&^6|m _PLLI7ǒi "'T }? 4|[Fǭtu/_y;Z?HK0Wzc#)~.rĥ+B&JG0[.ΡrOk;VCoX K۝S߳rt:zX\xmJhxNh5 K`;ydp.Ec4XD<-llip.^p: u/.Y[rl_4kz$~Dq]7/T_<菵4K$Ɩ &w S7|K^7MsMGhw㢴0]?fja5aiЦ6C2no• f=)d^v qNcԎl=u]?;f-E~nv}5%Oջd덿=Z%v  nKu ̓*J#1hu1Hr o}SZu=w;nϗU `FȶEn?߫k&l9YdgA8NSGD09MAK{ހK3݊[_]%W4zۈu9\~n3~zir X3k`Psn=m]ԃJksT9deYN`}/]U#b;Rt,lh*#JB+ (iGx\}~IֳFv@Tu֭J @-LwzYgw`wx-(d٢]F3_XcYmQԃWb-F K5d-0b球—֨T+_Zxcj*`}|x~LF*S*oMتAT1p71?R t>R'"Ey)oP7%$rv QeE+nzlVlFrkt''?R'ZCEIKy ga0^}pE;Kq{T/?i"%1ޒb-Ծqƛ˵+ 8]rIڣV{dȪ͜\AQvOS]0.NX9svb?OE~FPU}o[YKrA̓U%7Dw q b/h AhPbQؓJB8I ?I%=XtO;(PhLd S 'hݱ>|TV?,O"\`7.2>D fmg;-C'u, zA`-ټ$x vck2[xp\cbl΀ihsivaÛM,gĨlMz7JvˑVRWϋNo4(-XB^Cl&Vnnn D4[k6N&}f3YQw@$U$(Ǫo:-ZG#&/} ?N}ƥ7A!MhW>?iXprA١b?uϱι-h6;SB#/@ѿJ !%Q)Dq:{JI^ޑˡPY7UG(h?HmъvREH=N`P)QG9FMSMG@2E$Q $s~TkN"9Ն8cF^"?+G٠ ^*gUlFVxUpoC.XCƵ׵͉qK[k[K(l; ӡn%^Rj,$) 1n.G:Cf(,;ĴR—F_~^;իD;6|/jGGSSGGӎļDzbR/X?Up14u$`[ߜH477I~~Irߙs#6+heW6@wK̸h6, 1C"=meA =@z sls];kklr^"s青>&Մ-[{JiҴ9[ݵȩ-]dޢc An۹g}ꒇ6hTɖ?3s^kLcY 1Zn[bݴE߆դwk3f> fMDՠaD ~}&@5u gnOȢ<'` &bӬ-6;X"d*awYvtLXָkUߩa=HR_@+j2T*£%/͸oƤy 19/7 ~7_o+$DүsIH:r yiF:v(dO":omdM8 ;Z9uʩHCg\K/*ԙg*-I_ERqR'[f?GUAovb A$e]/Կo?|ԐQm4G7G833+ 74z*)$݋JpDNj5pqeDf/>%gW{U:g,nlU\t'%E}͝uCꘒܻߺp}U+^b'o(5gVBIOEm>5yzg}AP-P/ޫ6)x5/t;1p1L9Aܳ|)X]mkFEH/4}:,oLMo6]YM50u[yҫfVh?E-A_i﫝j . 6|5`#Z-svfqӟs͚>w7C{ A]Bz,iH'dv?`E x,mz`F[2avhp%(̒ʂ5Ԧ;Gюh\y";|"ٝʖrxzsPHCTvP$ly}iyhvMCr)#x-.(t%fu€(ۅeUUo pqeˡ啗syi Xk`>X@2P. 2͌>n|,/4} ?A&Jr+ɐCV]{Z0- A= F$+%UZyޗٲR B)wT8(aRΣ*-sr5v !^tZ:/K,'F  9=G<Cu"$-FS2(F 0Q+Xw,]=bh[qBQI ;)"Ō926r?}lV =b[j4AzKkQ?T[%$KQ-l_@l/ &;차Dr?P_dE1~z^I~breufP/պ# E+S\G-R4 SSV俑; *`G*5'dL ~ 5Fhb` ꁜ4[b$~GNAX$~ }[W}_z×6m&~O%j/r&|_Sy<-*Lϛ,JQzͤ𫷣|V|GVW~z  HE YnH4r7P?99ߡ|O-5 %4 dzO/4L_PsT>LQD( J8F+)jCb Mu2Xc8$t}&@Qr-֤U_o6q7P1ˤ+rc6I \ (*v24Uc(A ̣93]z;0'=*,e56Va,qh*P@wȬG/Oj|FIm #Pz;Jwʎ}< z Tt~`ȱGP%;? 5((u# vՊI#9,?Gb4K]Qgԟ]E[ phʯG+`Ęp?@>!}" ҽr=CD5 62ZY? iA T(E UJu;"}պ#LcӗVWO&CIԙu8*烞QaQ^*z(L|Jӏ^fp104~CUx*rV*N9π׳Pūsp_L3Z"}&rO|l~kC/Wj><SxMbSg(]J(Z#x\$OC68-f:{Sҳ蚨o4:)Wb"uiuh~d%BAM sWH.gv%4v+=¿ SGϋjWHWu>[B{[uɶs;laziW߭\zC|\fte&ߕ+Bk/t  CM /@S>Tm G`v`?G(,zb" eAAi7QR<"iX:I܋(aV;4R]}^1vԵ7=p|[Jοeµ{)e#ief0KJq"*F#(GjJFhX#шݍk5ERP΋ ^pCeoe:{6۬5͝sƙ8X K6V[=}V+hͧJlZZ5W;TeV-@HID<͙[)֐l^bXeNN"K]@b?.HH gzXaْA}MOeXHNrڟW;htgttOyu3=*פؿCFGsh9JͽZ-k]L-~hii.49Qr5I,Vݓ^jf_},Q6?5NV ޞˍYٜN%ezqƨ>Z Nt1 a %= yhޙ HJZ? hvrk@mY`^insF\*|Lz!/?)(0 MS4(ȗh{-'ho7cCҞ?6'|ubգ@!bÙf{tz1UA?=@ t%䕉iu[ NiD GT@:p<(cXUm2ϱ7zOM^FϴYUfwGs#t:/~Os]Fݑ((^?L$Sʽ WzT>m'_d:5Lh;H7WgzgZZb3{2d5Jj9c+\vqzDbbƶg "l@צpQBbS Q>+d p%}L!cdwHopx(Tpxp#:dvQ qdAQFdLKmPR pU?l zg-jPbGaR&^q>u8p&Ӯф `MGSܵaoWܛZaâٟݰV5Rs2NX qGB OKg BW)Sg\ӡl]z<߲o-_- AKMqӭ!æSigy۰]K;ST'kPqee7cZT{~*7b\H?jٵl3P оwT2jY;)l DueytOTjöUHXgɬ,WϢ^u![]vF| QGh`(# R'5XDQqM6gc'bu:'H( ?yյ6~.e[n *UyZst9R!GMM$xz$]{L<}4JZ~MVՕhy >@u +]2FqO8jѥWCQqrw.䄫ޥ\_y\On)IKGRHŁqI. d+u@ϴ kŤ}9Tv6*xge7?ì}S-AU OMlJ pժݧYwhi6\fAZc,rjFTMj8kO51TqW_n`7%KWsd0:`OXs$4?:SI1W-Pr}² 9.&P^f 8(WI``@5a}ziV pPԽ+:d\j"=aj)W$q{͜p)V|7hj$L֡9\ځn[ k{lG.m m~TEbȭm` wnyP&:PLJY_pNWzVS׃]7Ed%i癬| EWM7r HB6`UGZ 9N2l2ɅHY(ŗiwݓ[`cZR;Yz=TrvH9c. ֲG6*p΅'[:/ҪXCYхMt-']n,{@ cObIN.xN F9뛝NK[Xr=Wm ݏƦY+?sJgXuP%ȗV^[ W;W xvi/XS3ȼ2ԩZ f2/y?8M@Q*˄CXk?MzTy?ZYu׳)]͕1-a7j~ .d  'VztXK2k̹d?zzK.>,BZ`q'kHqy5j>a\C#H;#p7l4} IR7ފ0$=V#_.vs{g>h!Ab/p7=zmi%͟3)^Oj<_UNY63dsIr8EjU* 33|v ;OB@,,\cwd}6k.ukF9'26D]exGJK.׽}S$@ t";2ɩ*41_x7QbjX9Q;#{9eI -奐br B<9dpzIVQ:l+si #=T+R(MDC$ a̱ ONgj19gqXk}FdcG,&..^ɷwwc>E_]3U|t{Jf窂u_.\*W=}lNo+^Ṿ vP>~sTjWz~_ogS}-DTd -TAaYf3,PATcm ռ4g}mE$BwŪ8>9JW⁩O/9PJCXA{,@c,tEJTj98Q& HPl~K%ƞ1ѻ -eD zxNXuz.9}Mc&:Z5ә8% յսmomCB:l8~ܦEjTYHYvnV^IN]]ŽCXkg#s cSB$Ý=$k}cG&/z}_v6<7IVGGg*l\RXST)šE%Yu~Q~>XЅ`9Wk*@_ՊpM]0*%a3X팁KM|{FԔ 췾d7[nlͬD@m8e cż#gHdd@~.jllɛeRcxE(( Km¼GXA7S@[l.%գnMDs]n_Q 5i?zGTG3T@e i,r O2<l+/,%m ۚXn|E]lí[m<|#z+5 7&\5S-{AE^tK M^rq]FmC%2vJ)W-}OM"`9l+=%"T'8zH3QҐѩYP~VزNi 7ۛ ?w1xc`d```d?oAePBYt?;"@.Hc xc`d`` &]aA_x}SJAS<` b)6 >@D"X\o!ι{,_oggg #JVYp>uC4&*<=$g9W@.0q- ;:pt"HUe5 Vg([Ax9!޴EMߗ4N&ӞwjtԞeσLp>w>Gpfz`|^aż>)o oMg+RmRq,RJ1XTN7t{IE\F8U mb:fN&j9Yxc``ЂM /^0Kؘژ0=avcca>bĒIJk ."/ I888qqpnǥ5w)^-8 ||||[5? JPKLpPa) "Z"WDmDWc3K O~/cLuNN+9K8;99/p>"k676-nܷ0h8)iʋK+s9@.xڭNAwh /"TD#J$rqr|!'O3XFާ0wY 1fg;73;3xE0C q=qX4GA$x ZB8ڃ Dw!IaSX w.0?oN؍gڍ@\A`sb k`sݡ},0Ya DȵȵMyFMvYdS20~>/qJG i<#c0C~G9ee Kvв[ڷ{&V(Ө1j1MZqr7,gKܥX0QY{ MYжz=a:[jEݢ BZZ=ns`+ȍxmUSgFB]9I$uw-J;mPwwwwwwwwlޕ]<3)e׿7R^ VV_@$zГ^З~g`0m[czf`(3233 23s2s32  eD*954XXeXX14i++ kk [[ ۲3Qfvd ;1qgg& nLdOboa_c@`PpHhXxNDNdNarsgrgsrsrs rsWrWs rs7r7s rswrwsrOO // oo __ ?? f,˺eݳYϬW;MelP68s䘉GE{RαM 7nܺp;ڛZ[ݛƵ? ѵֵykx~yj?\3V+wE5=QMjzTӣ(vN؉k/셽d/Kd/Kdbbbbbbbbbbjjjjjjjjjj/r{^n/+v ;NaS)ԼffffffffnnnnnnnnnnaaaaaaaChQN-ܩ?C?C?C?C?݇C}>t݇C}C?C?C?C?vNjHMp[qn???????>>=<<<<<:::::::U>::::::::=;;;;;;;;;;;;}VhSoTPPK!valFlFHabilian/web/resources/bootstrap/fonts/glyphicons-halflings-regular.woff2wOF2Fl\F M?FFTM `r $e6$t 0 "Q?webfe5옏@? t,3+2q FYO&>bm5ZH$Y{H jd Չ %٧y"+@]e{vNc)n?~?萤h_&iѝ?>^K v-cۍ12Ky,'n(3EwiB& Tlh0M҆dYrﲬnti]yurVXsjgMnәHW r2>iT`V7R(+o6'cB4ι㿚T ]a[Qd<3wq8,rTI80>E?*E痦#7'S ocʷ_7&#*+)+4aA6cy٣f(bF$;{ YA1vP-tG"Cf- WԙuKְK#*K< (Z`٫ [%YT{%Ɋ$s{oջvt"p4`ߩϤ}o `'ne> G5sz_N PKӦvmU ɾ{z"3`l W#Ԑ^@+,ckoAOpnuzzJ)Υ1}O=xR`J`qUs/+kv1xljlEl\nDƶVjg{Zdz7 5!xm5o[u&1ڂHBkAqrR (\gh7Ҋy=HZUPh$8RgzgͭN:1u$܅>R]"f7 K^'3+E/^YU5]NB.ʋ8+͏8,|{M|Aua|a˅՝% lKGP,Nukc8mX@d̘?Y&{?P(G]Or-\LF9,&y8r3ܟ?p>~sDz1?\U5q=tzԒ&Znj%mM"}tkDwh-=mB76&:һqt" 1:Еu;"K_/Jdc0l0'^B8VCzg[ ;d Ybȃuu;@*}y| .'C>\g=9VŐ[o|g^ >d 9 *E|A*M[[*mOQz?Pn?R)YoT&[U*5S MB [ oYDh{,}1f?NN ]O/^;\J BEsJrĚ'g/B%o Cn7:|yKt&$s|wP\i]$Z@+ Հ90x]r%+RUEm+ܰ;wu9/I77զQlu\yWN)8ܰvY*umm( fEG8 j#IRz #q߷ )Y$ Лc_%m-{!0-` ;公hyV]Hv! ta\K[1{"j 6@3T0%Θ"ԙZIGS.ΣpӬS1eٓ؛ Yv8d\BlSR)ӆ {Iӆ%>0Ўڦ\'cg2%4QD 0͒3B"MՎ&ۊhIڧRgME I(5UD] }b8$8>X h"l΀j.%ۀHH- Iݸ#1C4Y7YݖV o>P]6O47f ~AJdYF€.oy) 8l 22e1H[t@!ȅ 2\@5ٓ%Zkޒa@.`n3OFR(󅥶ZkLkF HWjY I5*6eSbk.5F,.N0ԙ|V||~N( 4],Jp|~xeA5/ڻSvy?'_v|rXHQēB@= XB94TBBcHP+_YH#$`FB;+BPR4̼ t:t"ZEJ^!XǓq4_dTW(5܀IUŇAz@U6n.WGXHRK&'swMjʎ<3)`#F@  F Ԣvob$x +u&}|X&[٪8F-E&/>/G.az^/})'x$O=<zoA9M؝&~3r3g'8ң\-MDzk5A G9|1-! 87[,mRu|57 =X,aJ^tN4\fЄ]AzH^7F&k"LU>}>rBX(ۂT% JdhKPKTFaA3HHC[r;ad54 lLkjG{8h~ fR@9wB0 zS'a7@@Nƹlbj3hNXF/es'DsQjw}Jz^:V.:ڋ{ͼ(ȲBɦx<Db#"S{PHuN/{r6;wUsPО p8+6g_2lΡ6H džH: dBtGNmx@j |{s9=wR/oDJs5z>;'xEq^r^=G?9AA_K%Dɮ:uikjkIeG՝#*)jm|t}`JZ؈H=4{g߁)qXMA,H71V"o,Y#hݨS_;a_ԗZ^cn4HE?} ȝ٤=}BWvުUehGF;@2S@f n2#fY:]JyH]-G׌wgv'|0e _7Ґn+fٸY<( ?y%wm+j&&!c^u'b&hm6¤*2 ?AIƲ5FWؙ[ƜBUzIE!m:xheǮnz|]% mrUFگ1 };!n F&gP;&$$F).tBQ3(C=Xes;iي@~NΡE SRh\BeobTnΒju g@'qQ딎nx.u6bVU& ];!C_  5*zɺmRQuqPZ0}mn^nOrT:U'h0nZp^R|DF_b\@mDE8{oGM᠜q}Sd C,iܚE/Ë[d8],MCI_u,]Vc"pg@`"y),;B^el2'.(Ęy>-|hw;jՍiԽ_o|!@)ɢ=̌SPz*!z})|ƧT}jEtCZný*՞4ۆ׽[ 9Юݓz`Wmeo|j8j59@.EV/ZW@|f_\"${v/;a:Sei3TG*]ơ/h2C32$1}DNXt?Fϝ~n,Pj9.>ף{ 9EN-v|3hCиE XT;P$=J-gݕigz~q(A<:h193N̽Q}CLWߧ׎~ b"|4u}cy62[ \d,ҎճbkD%0Tx{=;Է(i LS13Nh/6?'E^~P{sZZKĞB{Dt&z)Uoa5Q3ȗr~ F]$<tm(} MB@[GxFh8#},#u Laz(Qh4%xm`Uչ.Ev1a4_'/[d{FxI59 D<&8VEFg 芘#I䟍2S_]QqAn_Q>bޘ4g-0&E#ci8 vR/4rP7KsOWN3ՏvE\bqQ5ZڽVy5]h/ i)-/kNю#e)"P {KSQx>a&, _g-mc<n]Ч-52cz 7d PzVOPvfR Rఓ9Z -dC`,at=k?v4#P Bإ/[s.-bH)ɺz '}׶w!rXZ .:Vn;->: 6rUcs4kVW{#5ߑ0B`ܝ0u".QdB0Cr]#Q9lqN^ֳh~NU\ 16 ~SnTl\THҲڛ-~G~)$oQ7-C}q%/avO|[q4~Bc-$N76w{V餃.&(o*n NeRi4!3R"4nbm-y[X."!QKE\N4gՠםaNp >k)90BZBs yrer)vDtrv\v[>rJm a̼~uՏ>rMZcB<`)\yt|ۍr'<>[Îh7Z8caI! p⢟̮,G k5@`iw nО8pv *'O A[.rhT pR?+;\*HsLqUf:ql-ć *6!h+ˬ{h- jgkMMP#:}{/VŶC]옙&[W$ګ^#4fWa\ 5躺M[6)T3~ :. Z`si(RQ|/` il^L#f-;-C;_*{@EMCooÂ_7TrqzF%ׯ|UEƫUs^ݜv{fQ<ĐVPTfͦ?mpP*&QG{cJEPe2)xP0AMɪZHj"׻"AC+zqmVzᖞU%C:@1W [y)J@ob% jA>)Nǀi$At`>?f0gH36p6D|M 4N 4JJڃ jƇ\ p38Я6pV?:$sDNƹ2n,HO\[ոK-)W~im?T:޺UeY-#dJe)Z5?$\dW<,Ɇ;ط5SոTT̄f(PYv=Q ~DX*8辩s- ˨΀55 XRl QC l|5{ӦT\t꼕+en۸Psl3UO[ZS3*,:ÛZLS'̵**@ı~xgno2- WV;pZ9?~$6҄xJ>\QA_Cihbl] 64*A˯ɰqX7YX.-ոaɇVhiKgqNRĆN(r']%٘@3̀jZJ.;nm,S0xͻOF33ҧ<$'GE+}'1f3y5/&Z\RB7dm]8\3߂Ȫ@oT3eu^W@e7l!B,s1$Z&?dC (YЦSm>J"&pt܈P㇄BF4G5 t^Ć$j-a㠍g^ʐCAsT=kTS,|r9IBϘЬ'vGA@thQNj&T=xt;2]P|T- LÞe1ݽWZŚ*MrH5?=o"9K5='k-*AE| qҔ_?\7%|M6f++S*}W_]3fmܮ˳m w!.R#鬪;qq71$•ݙկ_iK&JάMemV5P0> Q5WHIh&4ҍIlE7}sm[cȾ|d^ %Uv1D>.T7*=tZ_㟾1Х:=0pZ6ҋNt(uƝ; B]$kڌ.{F*/UZN砦|oqKG;^侞9NexK \wh~ZpHb䉸 [k8k.bX.QXpxYa^"#Bwnbum5F~>8bN:p4 [gv^ BFUz)?60F8/2C8>N8G%l%5FH{46h4%# 7x oN t\'Ȩ E0#jNãVӹd?WlcW žֵu-}22EN}#䵵2H^a3rqs-S3&f퇣fwl.=W8,cHjcTWנs90ZDMC2ZMdjt"8:g{.Ʊ1Fb618"yԦ> W9 V `jT򔔑r,ni d qN .g+ S Q KaB?_QE rjh>Eӛ;C׭7^q `Ue#-;oJċԝ>) ;Jg׭9R;OgiI7}8Kہqjeؓ+ٗ'nϷk3eFρ0V#pMAzb^PVu~1uғwn ^.II_vdW[Q,+Lbćq 9V} ΏVw4qU3&jıHYb ttT7ρarBwP9?)uT/aA19kM \Psq+=[5͔?9W+^o^E8s)f 2aQxi& NE>"^Naa;f9]NE& t^CLz'e8ZRs&67_ãcyJ1 @TZ?SD2 |POӌ\dR7zH9iQ#zrc.4GR4qx<2~Xhnੳ2auBNC+kX0 aj5n>މe3vާ<>_ uH:XR%~9!4oѼ38? 1d#A&{A!i6 /Xa㇤=W;|) g~ ?*悽 }ڧKt>5|E.A Q6 (6 6є7<9_C f1Ўi8, V4$uti,.`v6r P gFBɎ t C3; ,oÂx| /KMp1S_X.fV#U>Ȓ#B] AIVoІϵGTV1nr+OXS% ³fOZ[_9P߰ {Gln%#hdwH= ye/W>,IP,*MV~ºK&eċM콣=)qFS"GTF*LX,h[wweWQEx ?{^چExhiׂJH|^͓e*^Я.uxEb#;ԝ<]z]\wNhochqE=4Q17W̓lÕ6᧿HE_̣qy YR۫9~l4sVy`Uߛ,#_u+DeM~hq벇#Yz$; 5ͯ9$ z> *jO$$O/xRtf-}*oɦ|3M;xިUl/.~XǎY4x3&x";$KI5dڭ ~w[M9O%4Q}S^t@w[Y;-s;bwH-* imI-1e/~TNN.p)H$W~ƦO (9, ]gM6r+#%/swA$q4O> d9}+$s?0a,>yڈs<=,c_*\D}2MT8/4g'ڦ8'}"C*\9#Y>z$7c[s|"$} ymzQx 5%o$jkp)x-:И|?ofgFr2SZq}q o,wyOgCF1l'L5T33yM92"s5uD6-JUbs O)wR -2/5frϛf@=BFCB&'F}@&yubC?'S49+ÓCIî+f/RU C Fu:C*} T:}{ݽⲷue[!>? ڸ"M 8gz0\HkZ:h~@+#N fjyio!B R'5>`[!T`mC Iѝ}n >W!M}Uav43)!kcȂm? dwv!ה;Xϡۨ}8vt"Ӽ# kvXJ[l[ZݙMÀXC3l[ TaVjʻѬ"œ t:(<cZveQTqHi{銀Q埓'ÖiP■mKAIBF =Tᅽ(&TS?/؁A:ַОV(@wFa^]o]*99Ri_2vM`Pf{QYH#V7v7Ұq>@~uɘ׆Ax/xB3Ġtyb0nG` EDٍA: PwI7nW2ED}.(h"U]9Ih_V@GZ0C pb :L 3tN*N 2!3 Cayn.ɋW`̳}QBCi 8*{57O#aTBUoi0 _^ ChrU}~rL 1z>..=%GG o EuPPsؘ޸8Pu&;*|i&Pbțh;[|y*cVhҼ(~_AqU2GIQ3`^v=@K'ЇZ#4sJ=:sY sڥbyj S_E܃"@~>86#y[cSŬ#SJGZyvvSя扝pwaT/, 9'Jkv%%.~o[ 衧RBjSȀ*$'腁pçSu +9\_f+8u\,tpэkخJ0h(]NQvW7 86:ݣ WcY_i>"R(e]6RA%U6&F]7@̳k3X h?KQ2Bk[?..KKAb65ke+]FeWHU0Oק5 e3Hco>l]02cH9{Z {sO!A,7?ŷ3w俎A Fj8B&8U$G$Y5FL5n1> q2.6e +@/kb{(7i={l͍݂濦81g(%h/EfMҍt5̼vgo ~ਜ਼WKi父UأݖwRSEFT% `=|*=1*SX^w)lfQH(YSSˌK1W]f7ך^&p@T'.%3 5zaTf6A5LX̡|L-ηTg{A)F."hjA;.~o% G#}&]׾c`ChH9xnNY lc\+v\EƧ1D9KX)2b.NWQש$/|6tð32ԛ72иyu0e)Nuh'd~xY ># b"k3 :9v$ПC:)H> զz;ed\jmfOa%9cKxۥ!k%HDn{Y"{n_} )9= _/Z(>lYVgQ#߭:Qbw$zwٮ#U?|Ghz{o$wϜ)|Vh? ZV7%Go/׆E"KӲlp76-z !l4n>$\zV?szqejQ]m^=^ !lHB4sL i9}2^K5OB)O v^~݀xrm\K&G^5CL}&FB]Kn3|sGjykObsܽaW?R6Jfh2 lBS\=jV*Y^˺^E)*\ rr(a@6nԌ?}dLgIvqNcaƮkmLcA!hdVwc=憖s_:җsLg>1*4-%&0Ub)Eܬ*b51 ++;<`!qfM*,[/GK+{,>CLR%%c~'EGAG=h䟔8:IDN)W̻AF)ucw'qhXèL@a~6Pc2L"A2bU & 9A#QLO:E9kfKFb93tL$cˬpLz5dp۰>$`.~X=?NͰ/LPNo0p b8AR4r Jj} Ӳ04ˋquۏAFP 'HfXDIVTM7Lv\(N,/ʪnڮi^m?~ QU Ӳ04ˋquۏb$tV&gϖr> (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var that = this if ($next.hasClass('active')) return (this.sliding = false) var relatedTarget = $next[0] var slideEvent = $.Event('slide.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) this.$element.trigger(slideEvent) if (slideEvent.isDefaultPrevented()) return this.sliding = true isCycling && this.pause() if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) $nextIndicator && $nextIndicator.addClass('active') } var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" if ($.support.transition && this.$element.hasClass('slide')) { $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) $active .one('bsTransitionEnd', function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger(slidEvent) }, 0) }) .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger(slidEvent) } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } var old = $.fn.carousel $.fn.carousel = Plugin $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= var clickHandler = function (e) { var href var $this = $(this) var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 if (!$target.hasClass('carousel')) return var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false Plugin.call($target, options) if (slideIndex) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() } $(document) .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) Plugin.call($carousel, $carousel.data()) }) }) }(jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.3.4 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + '[data-toggle="collapse"][data-target="#' + element.id + '"]') this.transitioning = null if (this.options.parent) { this.$parent = this.getParent() } else { this.addAriaAndCollapsedClass(this.$element, this.$trigger) } if (this.options.toggle) this.toggle() } Collapse.VERSION = '3.3.4' Collapse.TRANSITION_DURATION = 350 Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var activesData var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') if (actives && actives.length) { activesData = actives.data('bs.collapse') if (activesData && activesData.transitioning) return } var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return if (actives && actives.length) { Plugin.call(actives, 'hide') activesData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing')[dimension](0) .attr('aria-expanded', true) this.$trigger .removeClass('collapsed') .attr('aria-expanded', true) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('collapse in')[dimension]('') this.transitioning = 0 this.$element .trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element[dimension](this.$element[dimension]())[0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse in') .attr('aria-expanded', false) this.$trigger .addClass('collapsed') .attr('aria-expanded', false) this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .removeClass('collapsing') .addClass('collapse') .trigger('hidden.bs.collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one('bsTransitionEnd', $.proxy(complete, this)) .emulateTransitionEnd(Collapse.TRANSITION_DURATION) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } Collapse.prototype.getParent = function () { return $(this.options.parent) .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') .each($.proxy(function (i, element) { var $element = $(element) this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) }, this)) .end() } Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { var isOpen = $element.hasClass('in') $element.attr('aria-expanded', isOpen) $trigger .toggleClass('collapsed', !isOpen) .attr('aria-expanded', isOpen) } function getTargetFromTrigger($trigger) { var href var target = $trigger.attr('data-target') || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 return $(target) } // COLLAPSE PLUGIN DEFINITION // ========================== function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } var old = $.fn.collapse $.fn.collapse = Plugin $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { var $this = $(this) if (!$this.attr('data-target')) e.preventDefault() var $target = getTargetFromTrigger($this) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() Plugin.call($target, option) }) }(jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.3.4 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ +function ($) { 'use strict'; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle="dropdown"]' var Dropdown = function (element) { $(element).on('click.bs.dropdown', this.toggle) } Dropdown.VERSION = '3.3.4' Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we use a backdrop because click events don't delegate $('")});this._.element.on("keydown",i)},onHide:function(){this._.element.removeListener("keydown",i)}}})})();PK! Eabilian/web/resources/ckeditor/plugins/templates/templates/default.js/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ CKEDITOR.addTemplates("default",{imagesPath:CKEDITOR.getUrl(CKEDITOR.plugins.getPath("templates")+"templates/images/"),templates:[{title:"Image and Title",image:"template1.gif",description:"One main image with a title and text that surround the image.",html:'

    Type the title here

    Type the text here

    '},{title:"Strange Template",image:"template2.gif",description:"A template that defines two colums, each one with a title, and some text.", html:'

    Title 1

    Title 2

    Text 1Text 2

    More text goes here.

    '},{title:"Text and Table",image:"template3.gif",description:"A title with some text and a table.",html:'

    Title goes here

    Table title
       
       
       

    Type the text here

    '}]});PK!WwwOabilian/web/resources/ckeditor/plugins/templates/templates/images/template1.gifGIF89adF!,dF ޼Hbʪh r-Γz j~" (̦4ʁj&)ɮR?d\ ի4nwS8285PGhS(xaA&JөAgꃚ*f{k*;k,ڊ멻;J<-] *Jf݌ 3, r̨}-~I/9RowLgmmcP „E2 a}+ZL'Q!H@"r㌐"񸳈ƒ7A$2MbʝVI̛B-jRA:t(TZ5;PK!sGJMMOabilian/web/resources/ckeditor/plugins/templates/templates/images/template2.gifGIF89adF!,dF ޼Hbʪh r-Γz j~"hLƐ JJALW{ ܃=c#9gHhpY'vՖH7 3JzTx:gJ JgJz+[d ;j%;l$l+}]R ]J4Nr}Α>4 /ގI_nn?]N 2 NÈ j C7#HڕTw\JrZ| 3̙ ;PK!ͦOabilian/web/resources/ckeditor/plugins/templates/templates/images/template3.gifGIF89adF!,dF ޼Hbʪh r-Γz j~"hLƐ JԪ0ܮ> l׸ gtm 2Th08rxrפ!xy99#Gg aJ"j9z*)BKk :++{zXL4]M-mL>N ^-MmNQzm^ܞM]

    PK!ۓtCabilian/web/resources/ckeditor/plugins/wsc/dialogs/tmpFrameset.html PK!1fq:abilian/web/resources/ckeditor/plugins/wsc/dialogs/wsc.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ html, body { background-color: transparent; margin: 0px; padding: 0px; } body { padding: 10px; } body, td, input, select, textarea { font-size: 11px; font-family: 'Microsoft Sans Serif' , Arial, Helvetica, Verdana; } .midtext { padding:0px; margin:10px; } .midtext p { padding:0px; margin:10px; } .Button { border: #737357 1px solid; color: #3b3b1f; background-color: #c7c78f; } .PopupTabArea { color: #737357; background-color: #e3e3c7; } .PopupTitleBorder { border-bottom: #d5d59d 1px solid; } .PopupTabEmptyArea { padding-left: 10px; border-bottom: #d5d59d 1px solid; } .PopupTab, .PopupTabSelected { border-right: #d5d59d 1px solid; border-top: #d5d59d 1px solid; border-left: #d5d59d 1px solid; padding: 3px 5px 3px 5px; color: #737357; } .PopupTab { margin-top: 1px; border-bottom: #d5d59d 1px solid; cursor: pointer; } .PopupTabSelected { font-weight: bold; cursor: default; padding-top: 4px; border-bottom: #f1f1e3 1px solid; background-color: #f1f1e3; } PK!,Z>LL9abilian/web/resources/ckeditor/plugins/wsc/dialogs/wsc.js/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.html or http://ckeditor.com/license */ (function(){function v(a){return a&&a.domId&&a.getInputElement().$?a.getInputElement():a&&a.$?a:!1}function E(a){if(!a)throw"Languages-by-groups list are required for construct selectbox";var c=[],d="",e;for(e in a)for(var f in a[e]){var g=a[e][f];"en_US"==g?d=g:c.push(g)}c.sort();d&&c.unshift(d);return{getCurrentLangGroup:function(c){a:{for(var d in a)for(var e in a[d])if(e.toUpperCase()===c.toUpperCase()){c=d;break a}c=""}return c},setLangList:function(){var c={},d;for(d in a)for(var e in a[d])c[a[d][e]]= e;return c}()}}var h=function(){var a=function(a,b,e){var e=e||{},f=e.expires;if("number"==typeof f&&f){var g=new Date;g.setTime(g.getTime()+1E3*f);f=e.expires=g}f&&f.toUTCString&&(e.expires=f.toUTCString());var b=encodeURIComponent(b),a=a+"="+b,i;for(i in e)b=e[i],a+="; "+i,!0!==b&&(a+="="+b);document.cookie=a};return{postMessage:{init:function(a){window.addEventListener?window.addEventListener("message",a,!1):window.attachEvent("onmessage",a)},send:function(a){var b=Object.prototype.toString,e= a.fn||null,f=a.id||"",g=a.target||window,i=a.message||{id:f};a.message&&"[object Object]"==b.call(a.message)&&(a.message.id||(a.message.id=f),i=a.message);a=window.JSON.stringify(i,e);g.postMessage(a,"*")},unbindHandler:function(a){window.removeEventListener?window.removeEventListener("message",a,!1):window.detachEvent("onmessage",a)}},hash:{create:function(){},parse:function(){}},cookie:{set:a,get:function(a){return(a=document.cookie.match(RegExp("(?:^|; )"+a.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, "\\$1")+"=([^;]*)")))?decodeURIComponent(a[1]):void 0},remove:function(c){a(c,"",{expires:-1})}},misc:{findFocusable:function(a){var b=null;a&&(b=a.find("a[href], area[href], input, select, textarea, button, *[tabindex], *[contenteditable]"));return b},isVisible:function(a){return!(0===a.offsetWidth||0==a.offsetHeight||"none"===(document.defaultView&&document.defaultView.getComputedStyle?document.defaultView.getComputedStyle(a,null).display:a.currentStyle?a.currentStyle.display:a.style.display))}, hasClass:function(a,b){return!(!a.className||!a.className.match(RegExp("(\\s|^)"+b+"(\\s|$)")))}}}}(),a=a||{};a.TextAreaNumber=null;a.load=!0;a.cmd={SpellTab:"spell",Thesaurus:"thes",GrammTab:"grammar"};a.dialog=null;a.optionNode=null;a.selectNode=null;a.grammerSuggest=null;a.textNode={};a.iframeMain=null;a.dataTemp="";a.div_overlay=null;a.textNodeInfo={};a.selectNode={};a.selectNodeResponce={};a.langList=null;a.langSelectbox=null;a.banner="";a.show_grammar=null;a.div_overlay_no_check=null;a.targetFromFrame= {};a.onLoadOverlay=null;a.LocalizationComing={};a.OverlayPlace=null;a.sessionid="";a.LocalizationButton={ChangeTo_button:{instance:null,text:"Change to",localizationID:"ChangeTo"},ChangeAll:{instance:null,text:"Change All"},IgnoreWord:{instance:null,text:"Ignore word"},IgnoreAllWords:{instance:null,text:"Ignore all words"},Options:{instance:null,text:"Options",optionsDialog:{instance:null}},AddWord:{instance:null,text:"Add word"},FinishChecking_button:{instance:null,text:"Finish Checking",localizationID:"FinishChecking"}, FinishChecking_button_block:{instance:null,text:"Finish Checking",localizationID:"FinishChecking"}};a.LocalizationLabel={ChangeTo_label:{instance:null,text:"Change to",localizationID:"ChangeTo"},Suggestions:{instance:null,text:"Suggestions"},Categories:{instance:null,text:"Categories"},Synonyms:{instance:null,text:"Synonyms"}};var F=function(b){var c,d,e;for(e in b)c=(c=a.dialog.getContentElement(a.dialog._.currentTabId,e))?c.getElement():b[e].instance.getElement().getFirst()||b[e].instance.getElement(), d=b[e].localizationID||e,c.setText(a.LocalizationComing[d])},G=function(b){var c,d,e;for(e in b)if(c=a.dialog.getContentElement(a.dialog._.currentTabId,e),c||(c=b[e].instance),c.setLabel)d=b[e].localizationID||e,c.setLabel(a.LocalizationComing[d]+":")},n,w;a.framesetHtml=function(b){return"'};a.setIframe=function(b,c){var d; d=a.framesetHtml(c);var e=a.iframeNumber+"_"+c;b.getElement().setHtml(d);d=document.getElementById(e);d=d.contentWindow?d.contentWindow:d.contentDocument.document?d.contentDocument.document:d.contentDocument;d.document.open();d.document.write('iframe

    Congratulations!

    If you can see CKEditor below, it means that the installation succeeded. You can now try out your new editor version, see its features, and when you are ready to move on, check some of the most useful resources recommended below.

    Hello world!

    I'm an instance of CKEditor.

    Customize Your Editor

    Modular build and numerous configuration options give you nearly endless possibilities to customize CKEditor. Replace the content of your config.js file with the following code and refresh this page (remember to clear the browser cache)!

    CKEDITOR.editorConfig = function( config ) {
    	config.language = 'es';
    	config.uiColor = '#F7B42C';
    	config.height = 300;
    	config.toolbarCanCollapse = true;
    };

    Toolbar Configuration

    If you want to reorder toolbar buttons or remove some of them, check this handy tool!

    More Samples!

    Visit the CKEditor SDK for a huge collection of samples showcasing editor features, with source code readily available to copy and use in your own implementation.

    Developer's Guide

    The most important resource for all developers working with CKEditor, integrating it with their websites and applications, and customizing to their needs. You can start from here:

    • Getting Started – Explains most crucial editor concepts and practices as well as the installation process and integration with your website.
    • Advanced Installation Concepts – Describes how to upgrade, install additional components (plugins, skins), or create a custom build.

    When you have the basics sorted out, feel free to browse some more advanced sections like:

    CKEditor JavaScript API

    CKEditor boasts a rich JavaScript API that you can use to adjust the editor to your needs and integrate it with your website or application.

    CKEditor – The text editor for the Internet – http://ckeditor.com

    Copyright © 2003-2015, CKSource – Frederico Knabben. All rights reserved.

    PK!7&&3abilian/web/resources/ckeditor/samples/js/sample.js/** * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/license */ /* exported initSample */ if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) CKEDITOR.tools.enableHtml5Elements( document ); // The trick to keep the editor in the sample quite small // unless user specified own height. CKEDITOR.config.height = 150; CKEDITOR.config.width = 'auto'; var initSample = ( function() { var wysiwygareaAvailable = isWysiwygareaAvailable(), isBBCodeBuiltIn = !!CKEDITOR.plugins.get( 'bbcode' ); return function() { var editorElement = CKEDITOR.document.getById( 'editor' ); // :((( if ( isBBCodeBuiltIn ) { editorElement.setHtml( 'Hello world!\n\n' + 'I\'m an instance of [url=http://ckeditor.com]CKEditor[/url].' ); } // Depending on the wysiwygare plugin availability initialize classic or inline editor. if ( wysiwygareaAvailable ) { CKEDITOR.replace( 'editor' ); } else { editorElement.setAttribute( 'contenteditable', 'true' ); CKEDITOR.inline( 'editor' ); // TODO we can consider displaying some info box that // without wysiwygarea the classic editor may not work. } }; function isWysiwygareaAvailable() { // If in development mode, then the wysiwygarea must be available. // Split REV into two strings so builder does not replace it :D. if ( CKEDITOR.revision == ( '%RE' + 'V%' ) ) { return true; } return !!CKEDITOR.plugins.get( 'wysiwygarea' ); } } )(); PK!U/abilian/web/resources/ckeditor/samples/js/sf.js/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ var SF=function(){function d(a){return(a=a.attributes?a.attributes.getNamedItem("class"):null)?a.value.split(" "):[]}function c(a){var e=document.createAttribute("class");e.value=a.join(" ");return e}var b={attachListener:function(a,e,b){if(a.addEventListener)a.addEventListener(e,b,!1);else if(a.attachEvent)a.attachEvent("on"+e,function(){b.apply(a,arguments)});else throw Error("Could not attach event.");}};b.indexOf=function(){var a=Array.prototype.indexOf;return"function"===a?function(e,b){return a.call(e, b)}:function(a,b){for(var c=a.length,d=0;d Ajax — CKEditor Sample

    CKEditor Samples » Create and Destroy Editor Instances for Ajax Applications

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how to create and destroy CKEditor instances on the fly. After the removal of CKEditor the content created inside the editing area will be displayed in a <div> element.

    For details of how to create this setup check the source code of this sample page for JavaScript code responsible for the creation and destruction of a CKEditor instance.

    Click the buttons to create and remove a CKEditor instance.

    PK!N%\  3abilian/web/resources/ckeditor/samples/old/api.html API Usage — CKEditor Sample

    CKEditor Samples » Using CKEditor JavaScript API

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how to use the CKEditor JavaScript API to interact with the editor at runtime.

    For details on how to create this setup check the source code of this sample page.

    PK!8abilian/web/resources/ckeditor/samples/old/appendto.html Append To Page Element Using JavaScript Code — CKEditor Sample

    CKEditor Samples » Append To Page Element Using JavaScript Code

    This sample is not maintained anymore. Check out the brand new samples in CKEditor SDK.

    The CKEDITOR.appendTo() method serves to to place editors inside existing DOM elements. Unlike CKEDITOR.replace(), a target container to be replaced is no longer necessary. A new editor instance is inserted directly wherever it is desired.

    CKEDITOR.appendTo( 'container_id',
    	{ /* Configuration options to be used. */ }
    	'Editor content to be used.'
    );

    PK!ofDabilian/web/resources/ckeditor/samples/old/assets/inlineall/logo.pngPNG  IHDR?MO2IDATxtIR̖ cZ7<g1̼1 z3aҎlfʸ|ZyݒK<{ŋ,誶utddf""ȆȀmdd62LAeYn5.yB/ 6ReѴqp{Sފ m F߈]@@ x"%J/F%Dv}NQPatPny3}ED"( {m)7S{K:!x!V"Y xlmOZ%_tȀ#dTlz2%d@ xS-#c)V ,|}+ ZL-\A93{E&(SpՋ޽\F&b3F[Qrg!A& Pt@]Hp Kl  88Xp+AM~*|uU(pm!aI/e/9q 8i cnG8\g۠{xTNOQ|QFFv'б?y-Җ my~D>˷s^O4+ڰ#G u ?ŋh"2`7Y(; y'lcU8r% ^˹:?NG;FXTE>NMD\OȕMXX;`u#9^}H!!E1JIt )O/Vx𣵅'0l7I2嚐#slW=m!wfJx܇XIcEQWתU rE;;еapAS_S3wN [FDPH{9!We#׳.S񽳺*@E^ 02|\)-U-6í0(y^[Fl ZQڋ9ϯQ;AA>̔9h?B[} pKc֜~z9&"3^ xUǒQa}ڶ0Υǐ$|F\4Y9J՝z2.r0r $z':K/|@'XAp{;X0J֍*V7ܰqzį Yw}alђ>|(ou ȼuux8UTG! \CYFpAn? [dtNP+]\}F#n>BYkr~ tC] 6W2ȧ> +g& Ve0},"l?żyXQ(EnW0rT<É-h)YڜeԾa{:win-zxx[YC"$ưALj}SCN9ԏDce>ȫyOq YzމFZG39(<O$(?jZ,OvMlᅭ!) }ud? gjpZ`+ sifJC7.b e:"G߿͎t3H<<^b`|Xn{(PǂAmd˔}}Y.Gd1WxIN܋aܒV?ϡj;ZC $獼.⢎%MQⶠ01bo&4Ņ 6×r >R3z'~ ]|>:s{Ҥڥa9`Cq%^w⃋Zpь$v$wiŸtc x[aIH[+ 2׬}! tJTl]@ zS>vn՗ifŸ/1fh=\)~TwGPS9{–P驈8d (7!;lq2.noKgJ70P&>vlbQ)Yѯ{5 zό?(ZYTؕsQֹMup˜xg[掤_9}lLGv uwhU76VcP q tO~7&ٮ~g+Q aw-Qb|dI ZKO(k~J"f\7GN%LuV}1? ݓ>U\Vm9 \<,b}SjQk>&^yWƼg~ VrpnKP^) Nx44sQc+pvs4'M&~+u`=es\ d|^ͺp_&jNo#vYm"Z> Fԛw Ȃyg5{Ν%8W:o<f}sHʠ1_HʲVsøAFn$% # %D8~٦nU$D+@0.ac3ՂAIt S+: op^K6tוSo1 xnm2yE f-yrOM ɢLnP n>1 S/05 Z9{lWDe#e86#p3lgY +_\ϥhulipEi-E 6C1Y2ER usDI॔wb[|pRcK\1g2roWڎ6O=5~}?=lj u6% M Ϟ}|슀#CʼqS~Y.Q|ԏ:6}q0]4-i'vkZ{u94@8J02w*Z˅GQ59}xq3ǐ )J!Us*)I(~u gFuI[ `HBѺq~߫ Eq&}F&a~zG"f,RL -/h*lBX5f~5" څ2מ lA*{"qeOF3"cEmR;|q-0`['^{d"6KX*ǚ"E$=22U >Zlj6u%@&b,جOD SۺY {ˀcΣf**m]TųI mFF8 Yz{ ءx]TÄѨ`;߮aj;gn~Xi, TXrR^kU(9 Gd[mjc&lFF ,xMc^Աddtu(,,IENDB`PK!A__Mabilian/web/resources/ckeditor/samples/old/assets/outputxhtml/outputxhtml.css/* * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/license * * Styles used by the XHTML 1.1 sample page (xhtml.html). */ /** * Basic definitions for the editing area. */ body { font-family: Arial, Verdana, sans-serif; font-size: 80%; color: #000000; background-color: #ffffff; padding: 5px; margin: 0px; } /** * Core styles. */ .Bold { font-weight: bold; } .Italic { font-style: italic; } .Underline { text-decoration: underline; } .StrikeThrough { text-decoration: line-through; } .Subscript { vertical-align: sub; font-size: smaller; } .Superscript { vertical-align: super; font-size: smaller; } /** * Font faces. */ .FontComic { font-family: 'Comic Sans MS'; } .FontCourier { font-family: 'Courier New'; } .FontTimes { font-family: 'Times New Roman'; } /** * Font sizes. */ .FontSmaller { font-size: smaller; } .FontLarger { font-size: larger; } .FontSmall { font-size: 8pt; } .FontBig { font-size: 14pt; } .FontDouble { font-size: 200%; } /** * Font colors. */ .FontColor1 { color: #ff9900; } .FontColor2 { color: #0066cc; } .FontColor3 { color: #ff0000; } .FontColor1BG { background-color: #ff9900; } .FontColor2BG { background-color: #0066cc; } .FontColor3BG { background-color: #ff0000; } /** * Indentation. */ .Indent1 { margin-left: 40px; } .Indent2 { margin-left: 80px; } .Indent3 { margin-left: 120px; } /** * Alignment. */ .JustifyLeft { text-align: left; } .JustifyRight { text-align: right; } .JustifyCenter { text-align: center; } .JustifyFull { text-align: justify; } /** * Other. */ code { font-family: courier, monospace; background-color: #eeeeee; padding-left: 1px; padding-right: 1px; border: #c0c0c0 1px solid; } kbd { padding: 0px 1px 0px 1px; border-width: 1px 2px 2px 1px; border-style: solid; } blockquote { color: #808080; } PK!vf@abilian/web/resources/ckeditor/samples/old/assets/posteddata.php Sample — CKEditor

    CKEditor — Posted Data

    $value ) { if ( ( !is_string($value) && !is_numeric($value) ) || !is_string($key) ) continue; if ( get_magic_quotes_gpc() ) $value = htmlspecialchars( stripslashes((string)$value) ); else $value = htmlspecialchars( (string)$value ); ?>
    Field Name Value
    PK!tȡq8q8<abilian/web/resources/ckeditor/samples/old/assets/sample.jpgJFIF,,C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((( itwQ˪NDp`gU̥<՛ !rqmX7{=͍bfbfVa+z{.㡨"Y>%JB22ū?A1$E}XuJ{|OK7,|{jOs4sOWs3]a3YDxfz"Lh$h{Wڦu;Z3--yÎri+z#iTd35VHnUKtSDe=f!ќlZR]MF9ͣiʛVp:Sd͠6%<̚vZˠ][gtSEd=l4ؤxDjxy^/>*Q8‹J9z$4ϒ8d/:{ּζǘ}2bsɠg==٣ҔGy!~s& wyK)0i'ش7^jqH,}F:T3әv':4<-@tX8_Lоt>#K 2B+!"#12 3$5AB7M'K=} LSɒ5ggR6;Vv, a7X+%c;a7a|L*N\]K9بKfTńmC}Kq݀,&П/e Z ?+{~BXQ Z:'UƄeqQ Pc`Y֝ܪcsU.hZIi zQ J)_ q ,2˰hud\[hPkg)Y3s I>T~+}KmD*"E%}f& Ck` 8djyVήo$>Wu*ɬZεJfM&ɏXL_+On.ZGPkjAV.7MXOVWLe^>߸u? iW Cqߒ3! j^UJNOif5zr5UUZ[3 q| !Y3 ha5N?亄@r.x KV9Xї\rV8J2hGKg_ t6 kXByYVَhOs,*Sr~uܼ]~Nəg5CbZLkKo0lߋĬBzcvVRكi9%A\L.pL[Qf-?V d ,#]iV Y^^vAS vZ+tB@ȻJ]1jj*ؗS?YX~[kVuOʮ&tk@ O%t<J}̬{];=sz+z'a}[rڟ6WRҰВT!@d]Հr&nYJJ}߻f؏ZaO8¿[]l=kcX|o?g3R:-Qzݜ`{-!o,ۑbSvL FaU7<6ǿ"jfl>i5]kźc{w]bex稷̞2 k1ӭVV82^5L[.ܯmnS[ps?,!1A"2Q Ba#3R?eG%85Em{k{  QģRJ(oe38 <"ٖ4jGfh#4sfŵ%p=4=/GPE !+D(h 0$PXh(h{2C[GMy8PĨjƬq$28P (M2**'"% Kh"HR\z(pzȿhrb"YTN"(:[7"9Q=&ݒU {GyeБ!gr$iɓZ01Kjgnĉe,=Q Y%c-'oږRbY+4rLvkjdv"LB-oO20fH!Q} ]YE{=,ly:D*xT6Nl2YԌTb _,.$ KӨY:!9E%8 N$cy$Cnmq;)4.EJ3Q5r"4kivEffxID̲Ec~dEвg1d9"3ƼOԨ'cf?ibdYlo[:%;2R.ȳ܉e:yNlr%ddCtatFDEY7蔆wfd-N6ro,e:$L$я7c>}$}4dTݜY=#*C,Ye,G,kd9ҍYg#/ "?L1rZ$cɤb9Heֆt6EPcڱvY ZSC$szؑN(oEђN&G:u"'gL&nD/¯_%&13db}chdQ/q'  1ʴ8ˈrd#0 +v%F:kĐݳ.׌j+piL5'}V8"+#+D$>̒Gd\hS#ƹIFiވV"*#FNHt oT{n?fKBb6bw- HH4N4c~^R壣l QЄ/R>|˱NZgbEbF?#ؚc/j膾'/vճ$Q[>^iEtqtqMZI+2%Q,ʬg*51qĆ.=.4]ZďpԭH~KBĔlI|볍= !1AQ"2aq #3BRrCbs%0S?]l6@.k5 ܫ|W\?2*jpZw71«5 AEw9IaSJf|߲z~JNlJ`BiI  ;O "VP\Lq,[uV HQ[ˮwϹ\6~+JpFVH[%6{zm(R湿 d£GJɍu.桱 h-`DWUWGhe-^{$l.] cpqXe(TC]d˺Y arEgaD:R.TZ0'@gϪغȻ7AnWvscӽ^\S:N]2Ɖp(?57{j3&҄.+RH9pr L; 0U,fop6 Mr6OR?%LS2CsNXKzto4,.ʩN;O RIa sy艐Dt}Y|討VQcmwB܁.c'sܩS&J]ʨٻ]qt.NS&.uQ=uQ\z ? 13e 3w]38A>1A3.0xQN $4ܙFHpjULHUH Cpm:RN|u_'cEJkXNrsMPPwjS fe h3\|n&7 PP7Φ|M'u_pEY= 0_R%W|]E o<>îK=y/v)ɓJAԤ\wXQMO"QLs~u.E`[fX;K"XRLߘ4a,_ hqJF@>IkBE_`wآau6ǰZb j'XU{X]G_($EӢgpz#?̙){(7W.2, )ܩRpsC3.>"u;cTTe${8p]DԘr^߬qQJ+70h!KsoY YI X6Ee4 ]4E>*d-9zVJ j Hu՜$> nW%$dh 48S&S.Xc& .JpKRtb]w.JuM L5=/c]SJB Y(_{Krbg(d ڭ䔐 {`NJmeP1Yn%5r,<7 l홺<alRۣ97Nx㯙0[l0+Es«UV6|\j c}ˑ /I.O;ePu.tJ1`/b x _:@ES֟DO) "z[9kg/XIWo&o>~Xu c0$7]u1ꙶ/}B<^'Õb= 1*wBvޥD%D1wee!/4>B؛{L-,_B:hDX+bõ9u ,L;5Yzu)VNy% |=`K׶)ۗ&NYe~*\}ϼ0xoكDݻ"ѷpHKhF7}b}{iNJ©dW Am-Mݺ{V~n0_d☌@1fR2#^Ub'%D4tOe s\Eiv8*40zjEsK_`n 0p٣sʎfk?k'L2Xc־Q˪d*zo_Gsgl4%O7X"tsN{V` rǦVIn.1sQᱳ+e/Ic ieתx5/oxf]F'pSU>[ܠ˃?:U2 b !'SP85EUlF;Pu޷\<C>k^o0,CܥR rbvu~fFU1G`T(" xcZkVn[~Jbm?@6XefzpÓ mO[׹(-ݞ{FM>}>T?1 =2Վ#+ ?!.-o; śUu6(9iy(2G>""m|WZgU'uȺmA ߇K>XLl\ l uׯ?;FP>MlwL\>%WT jk^aCS i=&=NNU_=#J7 #W0[;Z Ǐ&!1AQaqѡ?n$fS`$ҢcIq; JX6)c-P<$‘HaDGN%U/#yRU1ͳ̶cv o 4)ԳS8&pe3 Hn/j 3(;a!r2- !fr#'DF% m5aB.+>[J`(N H][Ddmde!1Gܧ krp mxp+1 /ܥ8ě3D%Bs-<+t]GUBDkFx!ĬڙK(DYJg4Ɗ _ ʲ )s a]@˗b2"(A),Y`TT@L ix2C& C>L+ iWg]0DOD89?c̼+~FɣRg!]%y||M㜦\0j <=J^R[1vRTY2]w?&!1AQaq?0Ne XjX *[;'+Jc$Caˊ\\0X.e'zEkK&G$hԪWF CLa n'`mm{Z B-yʂw `ea+X@[j%5~<7UQˈ;"fF#d 2z`B .\ GD18V', 6ǽEeD*4haRȪpFziY" +u2b#0&Xw*ȊweK1d0s*@˙KC!MDaMI.7",{Kܪx,\?AEa6+j5) y_C|5r!&CSD࿠80Dv xwvZ i?؆3 3*7hؖP t(-;L" n:BۘI3"Kc9M΍3 v*,"Sx1e[ |6%Hۉ j*pVu "5gO}xq}#T3 0a/9\K ~u (heF* K/} 1 ]wyV'A;8T#7(7(ճ')zE.'BRQ- ksf9랍$D%2Y5}_+^~J001wЖx5  :y&^q丣Qt" 5?_2w)bp_Rd*N}짌"*Ym80E Au5e!>\ArX'!-Ax\#K.P#蘥iz|ho>* ܳ/ 2|b/#}?>f;2+^yqU|ŗ;|13B2x.S%!1AQaq?T]ސX[au\PU* L+n#>;ɑ4< 8YD bT}@ r ްUzŻ@I5ɑhZo o9tDZ-:2㋖:!kK(7yiqʂƆ;пSl1#]bۖ|5ڙ f:7y8hlӍj&f,rxC_y]C)B{/b#$ʻFXAB^5WNswm^8 8|ݺ+եQEJl8sFiD/ErB%BycyE+'-Su-vj?.~ ;"/Qb#&*ہ3 aFr$?Qׁ!`sDŧ(;_n_ =>H_-7R=|gy&3ejiUܥj~\௎W& ehpcщ*f\ !k"!>3˻;(s| ۩qGUJ#DbpY` ֧|a֤;x mj:LAGRSS$_h0 qӸ"a 2K̀sǷT]Tcf{D Bco~@ {~}nkYFִ*ze7 ;=?,D8 ?MWlڽёޟGY9,"O)].yl@CxE[ڜa6Kz 0?Qy!j@5q,D?%ģC)t!̺ٔ4{~2UO_Ás~9WbaY;( pt:wW8@b^Xa7 {lsYG6#ÁTEƃA hN fȲ/{Vը}4WG0ıaM3q~39h.1@Vӌ&'4QJ H _xI|xrz cho|L\ 6 4P A}aPN4eT5Tk8FZr)Rz`yE~|[HaEe!;&"a-;1R!O>V-" y}?HT]~08Gq Fh7ӬHC[5*ݻxnok,6/9J`.& (Iӆ$Y2klĵN]d>'=$쎿8l9E[z0uMoEi u;H""y<rMRe.lKxלsݧLv&v0@5+yq8Gz∀\1TQ:4ZqtʤE +54Q E[[H^PS_է"-"oh.8lԂAnL$k×AM EoK5]/{&ymjn^& D(5G 5|CK0F"#+9P 5)]Z a8ϙxLD70NP 0s[*v*V-&,xp$Pӓh`޵C_.5CB4[]@ #?ʇy+ ze;I#SBQoQ fv%m(@ysF´yѧwv܍A&e#`Vj& Er)47q_1؈üFଆȜ0Pm<0hÛjr}`'|JޏKbQ>C TJFQXd5 d,Vi!ploa tfG :w"^؂|FNرRfov~1y [PTZ`Py"h d,f uvNœ BMx :]qU򈿼)l bdtƈw'~W\EF6:ՃEj{C8vS%PCMzw+̫de5Y!JzԃMa$@D| 9PSdR 'xmט =~&P CzAbz :kKMZPV0aw+ Ď4B%!*ki9eʧ&ڦ7Jb@Ggl뚆R GŃHVTÞ^p%u;0"ʵ7 lq, e\ZlF`4Sߌr(۫r%W|G;Fjk. @w^]PLC4݀6<>4 k`|٦*sByL9ADKD8 U޸602] .^=!'Pmmq&ȑ_ |p\PK!KKJabilian/web/resources/ckeditor/samples/old/assets/uilanguages/languages.js/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ var CKEDITOR_LANGS=function(){var c={af:"Afrikaans",ar:"Arabic",bg:"Bulgarian",bn:"Bengali/Bangla",bs:"Bosnian",ca:"Catalan",cs:"Czech",cy:"Welsh",da:"Danish",de:"German",el:"Greek",en:"English","en-au":"English (Australia)","en-ca":"English (Canadian)","en-gb":"English (United Kingdom)",eo:"Esperanto",es:"Spanish",et:"Estonian",eu:"Basque",fa:"Persian",fi:"Finnish",fo:"Faroese",fr:"French","fr-ca":"French (Canada)",gl:"Galician",gu:"Gujarati",he:"Hebrew",hi:"Hindi",hr:"Croatian",hu:"Hungarian",id:"Indonesian", is:"Icelandic",it:"Italian",ja:"Japanese",ka:"Georgian",km:"Khmer",ko:"Korean",ku:"Kurdish",lt:"Lithuanian",lv:"Latvian",mk:"Macedonian",mn:"Mongolian",ms:"Malay",nb:"Norwegian Bokmal",nl:"Dutch",no:"Norwegian",pl:"Polish",pt:"Portuguese (Portugal)","pt-br":"Portuguese (Brazil)",ro:"Romanian",ru:"Russian",si:"Sinhala",sk:"Slovak",sq:"Albanian",sl:"Slovenian",sr:"Serbian (Cyrillic)","sr-latn":"Serbian (Latin)",sv:"Swedish",th:"Thai",tr:"Turkish",tt:"Tatar",ug:"Uighur",uk:"Ukrainian",vi:"Vietnamese", zh:"Chinese Traditional","zh-cn":"Chinese Simplified"},b=[],a;for(a in CKEDITOR.lang.languages)b.push({code:a,name:c[a]||a});b.sort(function(a,b){return a.name Data Filtering — CKEditor Sample

    CKEditor Samples » Data Filtering and Features Activation

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample page demonstrates the idea of Advanced Content Filter (ACF), a sophisticated tool that takes control over what kind of data is accepted by the editor and what kind of output is produced.

    When and what is being filtered?

    ACF controls every single source of data that comes to the editor. It process both HTML that is inserted manually (i.e. pasted by the user) and programmatically like:

    editor.setData( '<p>Hello world!</p>' );
    

    ACF discards invalid, useless HTML tags and attributes so the editor remains "clean" during runtime. ACF behaviour can be configured and adjusted for a particular case to prevent the output HTML (i.e. in CMS systems) from being polluted. This kind of filtering is a first, client-side line of defense against "tag soups", the tool that precisely restricts which tags, attributes and styles are allowed (desired). When properly configured, ACF is an easy and fast way to produce a high-quality, intentionally filtered HTML.

    How to configure or disable ACF?

    Advanced Content Filter is enabled by default, working in "automatic mode", yet it provides a set of easy rules that allow adjusting filtering rules and disabling the entire feature when necessary. The config property responsible for this feature is config.allowedContent.

    By "automatic mode" is meant that loaded plugins decide which kind of content is enabled and which is not. For example, if the link plugin is loaded it implies that <a> tag is automatically allowed. Each plugin is given a set of predefined ACF rules that control the editor until config.allowedContent is defined manually.

    Let's assume our intention is to restrict the editor to accept (produce) paragraphs only: no attributes, no styles, no other tags. With ACF this is very simple. Basically set config.allowedContent to 'p':

    var editor = CKEDITOR.replace( textarea_id, {
    	allowedContent: 'p'
    } );
    

    Now try to play with allowed content:

    // Trying to insert disallowed tag and attribute.
    editor.setData( '<p style="color: red">Hello <em>world</em>!</p>' );
    alert( editor.getData() );
    
    // Filtered data is returned.
    "<p>Hello world!</p>"
    

    What happened? Since config.allowedContent: 'p' is set the editor assumes that only plain <p> are accepted. Nothing more. This is why style attribute and <em> tag are gone. The same filtering would happen if we pasted disallowed HTML into this editor.

    This is just a small sample of what ACF can do. To know more, please refer to the sample section below and the official Advanced Content Filter guide.

    You may, of course, want CKEditor to avoid filtering of any kind. To get rid of ACF, basically set config.allowedContent to true like this:

    CKEDITOR.replace( textarea_id, {
    	allowedContent: true
    } );
    

    Beyond data flow: Features activation

    ACF is far more than I/O control: the entire UI of the editor is adjusted to what filters restrict. For example: if <a> tag is disallowed by ACF, then accordingly link command, toolbar button and link dialog are also disabled. Editor is smart: it knows which features must be removed from the interface to match filtering rules.

    CKEditor can be far more specific. If <a> tag is allowed by filtering rules to be used but it is restricted to have only one attribute (href) config.allowedContent = 'a[!href]', then "Target" tab of the link dialog is automatically disabled as target attribute isn't included in ACF rules for <a>. This behaviour applies to dialog fields, context menus and toolbar buttons.

    Sample configurations

    There are several editor instances below that present different ACF setups. All of them, except the inline instance, share the same HTML content to visualize how different filtering rules affect the same input data.

    This editor is using default configuration ("automatic mode"). It means that config.allowedContent is defined by loaded plugins. Each plugin extends filtering rules to make it's own associated content available for the user.


    This editor is using a custom configuration for ACF:

    CKEDITOR.replace( 'editor2', {
    	allowedContent:
    		'h1 h2 h3 p blockquote strong em;' +
    		'a[!href];' +
    		'img(left,right)[!src,alt,width,height];' +
    		'table tr th td caption;' +
    		'span{!font-family};' +'
    		'span{!color};' +
    		'span(!marker);' +
    		'del ins'
    } );
    

    The following rules may require additional explanation:

    • h1 h2 h3 p blockquote strong em - These tags are accepted by the editor. Any tag attributes will be discarded.
    • a[!href] - href attribute is obligatory for <a> tag. Tags without this attribute are disarded. No other attribute will be accepted.
    • img(left,right)[!src,alt,width,height] - src attribute is obligatory for <img> tag. alt, width, height and class attributes are accepted but class must be either class="left" or class="right"
    • table tr th td caption - These tags are accepted by the editor. Any tag attributes will be discarded.
    • span{!font-family}, span{!color}, span(!marker) - <span> tags will be accepted if either font-family or color style is set or class="marker" is present.
    • del ins - These tags are accepted by the editor. Any tag attributes will be discarded.

    Please note that UI of the editor is different. It's a response to what happened to the filters. Since text-align isn't allowed, the align toolbar is gone. The same thing happened to subscript/superscript, strike, underline (<u>, <sub>, <sup> are disallowed by config.allowedContent) and many other buttons.


    This editor is using a custom configuration for ACF. Note that filters can be configured as an object literal as an alternative to a string-based definition.

    CKEDITOR.replace( 'editor3', {
    	allowedContent: {
    		'b i ul ol big small': true,
    		'h1 h2 h3 p blockquote li': {
    			styles: 'text-align'
    		},
    		a: { attributes: '!href,target' },
    		img: {
    			attributes: '!src,alt',
    			styles: 'width,height',
    			classes: 'left,right'
    		}
    	}
    } );
    

    This editor is using a custom set of plugins and buttons.

    CKEDITOR.replace( 'editor4', {
    	removePlugins: 'bidi,font,forms,flash,horizontalrule,iframe,justify,table,tabletools,smiley',
    	removeButtons: 'Anchor,Underline,Strike,Subscript,Superscript,Image',
    	format_tags: 'p;h1;h2;h3;pre;address'
    } );
    

    As you can see, removing plugins and buttons implies filtering. Several tags are not allowed in the editor because there's no plugin/button that is responsible for creating and editing this kind of content (for example: the image is missing because of removeButtons: 'Image'). The conclusion is that ACF works "backwards" as well: modifying UI elements is changing allowed content rules.


    This editor is built on editable <h1> element. ACF takes care of what can be included in <h1>. Note that there are no block styles in Styles combo. Also why lists, indentation, blockquote, div, form and other buttons are missing.

    ACF makes sure that no disallowed tags will come to <h1> so the final markup is valid. If the user tried to paste some invalid HTML into this editor (let's say a list), it would be automatically converted into plain text.

    Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC.


    This editor is using a custom configuration for ACF. It's using the Disallowed Content property of the filter to eliminate all title attributes.

    CKEDITOR.replace( 'editor6', {
    	allowedContent: {
    		'b i ul ol big small': true,
    		'h1 h2 h3 p blockquote li': {
    			styles: 'text-align'
    		},
    		a: {attributes: '!href,target'},
    		img: {
    			attributes: '!src,alt',
    			styles: 'width,height',
    			classes: 'left,right'
    		}
    	},
    	disallowedContent: '*{title*}'
    } );
    

    This editor is using a custom configuration for ACF. It's using the Disallowed Content property of the filter to eliminate all a and img tags, while allowing all other tags.

    CKEDITOR.replace( 'editor7', {
    	allowedContent: {
    		// Allow all content.
    		$1: {
    			elements: CKEDITOR.dtd,
    			attributes: true,
    			styles: true,
    			classes: true
    		}
    	},
    	disallowedContent: 'img a'
    } );
    
    PK!s mmEabilian/web/resources/ckeditor/samples/old/dialog/assets/my_dialog.js/** * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/license */ CKEDITOR.dialog.add( 'myDialog', function() { return { title: 'My Dialog', minWidth: 400, minHeight: 200, contents: [ { id: 'tab1', label: 'First Tab', title: 'First Tab', elements: [ { id: 'input1', type: 'text', label: 'Text Field' }, { id: 'select1', type: 'select', label: 'Select Field', items: [ [ 'option1', 'value1' ], [ 'option2', 'value2' ] ] } ] }, { id: 'tab2', label: 'Second Tab', title: 'Second Tab', elements: [ { id: 'button1', type: 'button', label: 'Button Field' } ] } ] }; } ); PK!3=abilian/web/resources/ckeditor/samples/old/dialog/dialog.html Using API to Customize Dialog Windows — CKEditor Sample

    CKEditor Samples » Using CKEditor Dialog API

    This sample is not maintained anymore. Check out the brand new samples in CKEditor SDK.

    This sample shows how to use the CKEditor Dialog API to customize CKEditor dialog windows without changing the original editor code. The following customizations are being done in the example below:

    For details on how to create this setup check the source code of this sample page.

    A custom dialog is added to the editors using the pluginsLoaded event, from an external dialog definition file:

    1. Creating a custom dialog window – "My Dialog" dialog window opened with the "My Dialog" toolbar button.
    2. Creating a custom button – Add button to open the dialog with "My Dialog" toolbar button.

    The below editor modify the dialog definition of the above added dialog using the dialogDefinition event:

    1. Adding dialog tab – Add new tab "My Tab" to dialog window.
    2. Removing a dialog window tab – Remove "Second Tab" page from the dialog window.
    3. Adding dialog window fields – Add "My Custom Field" to the dialog window.
    4. Removing dialog window field – Remove "Select Field" selection field from the dialog window.
    5. Setting default values for dialog window fields – Set default value of "Text Field" text field.
    6. Setup initial focus for dialog window – Put initial focus on "My Custom Field" text field.
    PK!,'>>:abilian/web/resources/ckeditor/samples/old/divreplace.html Replace DIV — CKEditor Sample

    CKEditor Samples » Replace DIV with CKEditor on the Fly

    This sample is not maintained anymore. Check out the brand new samples in CKEditor SDK.

    This sample shows how to automatically replace <div> elements with a CKEditor instance on the fly, following user's doubleclick. The content that was previously placed inside the <div> element will now be moved into CKEditor editing area.

    For details on how to create this setup check the source code of this sample page.

    Double-click any of the following <div> elements to transform them into editor instances.

    Part 1

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.

    Part 2

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.

    Donec velit. Mauris massa. Vestibulum non nulla. Nam suscipit arcu nec elit. Phasellus sollicitudin iaculis ante. Ut non mauris et sapien tincidunt adipiscing. Vestibulum vitae leo. Suspendisse nec mi tristique nulla laoreet vulputate.

    Part 3

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Cras et ipsum quis mi semper accumsan. Integer pretium dui id massa. Suspendisse in nisl sit amet urna rutrum imperdiet. Nulla eu tellus. Donec ante nisi, ullamcorper quis, fringilla nec, sagittis eleifend, pede. Nulla commodo interdum massa. Donec id metus. Fusce eu ipsum. Suspendisse auctor. Phasellus fermentum porttitor risus.

    PK!_ Aabilian/web/resources/ckeditor/samples/old/enterkey/enterkey.html ENTER Key Configuration — CKEditor Sample

    CKEditor Samples » ENTER Key Configuration

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how to configure the Enter and Shift+Enter keys to perform actions specified in the enterMode and shiftEnterMode parameters, respectively. You can choose from the following options:

    • ENTER_P – new <p> paragraphs are created;
    • ENTER_BR – lines are broken with <br> elements;
    • ENTER_DIV – new <div> blocks are created.

    The sample code below shows how to configure CKEditor to create a <div> block when Enter key is pressed.

    CKEDITOR.replace( 'textarea_id', {
    	enterMode: CKEDITOR.ENTER_DIV
    });

    Note that textarea_id in the code above is the id attribute of the <textarea> element to be replaced.

    When Enter is pressed:
    When Shift+Enter is pressed:


    PK! NN^abilian/web/resources/ckeditor/samples/old/htmlwriter/assets/outputforflash/outputforflash.flaࡱ> qRoot Entryp|YrRASH>ޱ3q@ContentsLyFP 1 1212997365AS 1 1216047046,(Root Entry5HZEޱ-3q Contentsr9fP 1 1212997365!S 1 1216047046,( -./0123456789:;<=>?@BCDEFGHIJKMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnoM 1 1287673773O= x] tEK ʀ . `PG(#;&gQt2-*a=,N<8ΝQi%%A$]鮪ֽ'O< סԘqRZN*c&=S{~@LݦI1#Ǥv͂ﬕoIɵ ꭅrտyyy퐆?g2 yB8!2Kǥ7XXQt\Pjbt{oo\u_$)aN``18 ptc74{ɚ'bE$u5.m7n)sNS2`_,#ɍ{N`q p8> > >D鲩 tk0 Layer 1OO?mimport flash.external.ExternalInterface; FCKTextArea.htmlText = ""; function setData(htData) { FCKTextArea.htmlText = htData; } ExternalInterface.addCallback("setData", this, setData);  Actions3import flash.ext{@|>x,δ2h<<<|F:tF;-Ĥ>{XnuOlj':D呤7ګ~m9vMXgBYp?~N+<'Oȯɉwڜsp-Wnp:'w'8pjRWbcRo]X^+ ,0 ;YVXW./aHLNCuu~Rz\g%D@7<1'`vyQR{^EG0s/'ɦM͔1%,&慠ڨ~ėp<88TN ܽn{lo K'.09 ?ӋW|eʫ!g3 {dx%\\A+ /yƒ/#'¾"8b*kI u r"핹BO]9=#NT{Ň_]tK9Dyrmn|$WVIF|ՇC>+k>qc`G/m 1gjpaz67[͕krVW? 0'J.pl{eE+>D9_l]y8qi0^ϭY(-7$W2XkB6}8_Ɯ1grpĜɉ9o9sQӴW8F$ñ8};/ljyBNiyvUF@J9]Ù? [~mƜr"0:3XX}YqĜ>-nɉb6oHJ >w_+ }8DƜ_~f?pH>v|Eu{OZugsMmGO(br|`s}/g1͛mӶ]q\ 3su^l4:Zܼg_רQc]o9S/x]du:vds uZ4lp͔xk蛲$~mrƜO|ps6h̙sdYDƜM|v̹:z=l#+c>ϒflƇU%;b0g\T(G](XQ~}3Zjm"qH|.۴/=hĮ^G> ̨=zߺ=?}IJwL#L9gt0gp~Qq3vɉiohfr4[uP?=Ѹ[_ù=8@|E3 x}MֲbuM| >|qI\X{V.][<>Ų`1? ò۰Swy89s]k?\1=^qD]K)b>g`p#`X4}8]3S|WC?'JO?gLCF=8tP``:Edd$ǘ o6=,FDHq^s[ޘ/vT`9 ^|v@7[7@>E{}ʉ=QϾ^V8.ro^3z?\3oߘߛ4sSQL?ZG #Ok&1ˬӶyfgp#+gkT'_1 NytbZiXgFK7_D`q4pW)oJ&M"A;:6+M,{ob(\,_^b:)斊9'Ek;cvH)N/ѱιT̙im Nd|6 K4X|X\urĘ[EcGgdt,G)/ۚ$6,ip:&=m߁YWx%}]=HClPḍɉ7l9,g }c!'&lטeJ)NXܖqt#[㶷|}r>Fvpo>"=!%2D5ɉYgXɉRmWh=Hb5MS>կ=iDžcbO c"Ӱv؟{cYˇcñ9q+N{E"/q/bژFMj7+K  u[wι\8cö89Wy8.X{ČѵRsbzO^@`M_uֺL+ p>X`3b&'eCz^qӸC^/Ñ@zE/ۃ_ 5}TCfD>,{#b ^#I~(uΆR3^[Iu=޴2:Lc_&cl`3us^Ӣ_85p9T^ݚ%vi[co>{:s݀ߤ7Frv%Qm**#Fܫ.>Niplo_JګRN 53%E $G$#K/‘W֓'O< T^uD]zQ\27c@qp 9ΜzY3e ,>7}Rq# C1F\DnGVGi s39 XYr g9ܨb8Uz0jh"U-A(%bq5trr_~s^Y*d 8%><%'xxj`.tbB7<OFLw7pH$OoMd?oGF M$džK~{b:EJ$o3&mdbc]{Ƀ?A&aSbc6f!VYf4ÚYglmwgY /y$I@"G4#PublishGifProperties::PaletteOption"PublishPNGProperties::DitherOption0PublishFormatProperties::projectorMacDefaultName1'PublishFormatProperties::pngDefaultName1-PublishFormatProperties::projectorWinFileN "#$%&'()*p-./0123456789:;<=>?@stuvwxyz{|}~M 1 1287673773OS 2 1287674123QM 3 1287674134O= x] tEK ʀ . `PG(#;&gQt2-*a=,N<8ΝQi%%A$]鮪ֽ'O< סԘqRZN*c&=S{~@LݦI1#Ǥv͂ﬕoIɵ ꭅrտyyy퐆?g2 yB8!2Kǥ7XXQt\Pjbt{oo\u_$)aN``18 ptc74{ɚ'bE$u5.m7n)sNS2`_,#ɍ{N`q p8> > >D鲩 tk0x,δ2h<<<|F:tF;-Ĥ>{XnuOlj':D呤7ګ~m9vMXgBYp?~N+<'Oȯɉwڜsp-Wnp:'w'8pjRWbcRo]X^+ ,0 ;YVXW./aHLNCuu~Rz\g%D@7<1'`vyQR{^EG0s/'ɦM͔1%,&慠ڨ~ėp<88TN ܽn{lo K'.09 ?ӋW|eʫ!g3 {dx%\\A+ /yƒ/#'¾"8b*kI u r"핹BO]9=#NT{Ň_]tK9Dyrmn|$WVIF|ՇC>+k>qc`G/m 1gjpaz67[͕krVW? 0'J.pl{eE+>D9_l]y8qi0^ϭY(-7$W2XkB6}8_Ɯ1grpĜɉ9o9sQӴW8F$ñ8};/ljyBNiyvUF@J9]Ù? [~mƜr"0:3XX}YqĜ>-nɉb6oHJ >w_+ }8DƜ_~f?pH>v|Eu{OZugsMmGO(br|`s}/g1͛mӶ]q\ 3su^l4:Zܼg_רQc]o9S/x]du:vds uZ4lp͔xk蛲$~mrƜO|ps6h̙sdYDƜM|v̹:z=l#+c>ϒflƇU%;b0g\T(G](XQ~}3Zjm"qH|.۴/=hĮ^G> ̨=zߺ=?}IJwL#L9gt0gp~Qq3vɉiohfr4[uP?=Ѹ[_ù=8@|E3 x}MֲbuM| >|qI\X{V.][<>Ų`1? ò۰Swy89s]k?\1=^qD]K)b>g`p#`X4}8]3S|WC?'JO?gLCF=8tP``:Edd$ǘ o6=,FDHq^s[ޘ/vT`9 ^|v@7[7@>E{}ʉ=QϾ^V8.ro^3z?\3oߘߛ4sSQL?ZG #Ok&1ˬӶyfgp#+gkT'_1 NytbZiXgFK7_D`q4pW)oJ&M"A;:6+M,{ob(\,_^b:)斊9'Ek;cvH)N/ѱιT̙im Nd|6 K4X|X\urĘ[EcGgdt,G)/ۚ$6,ip:&=m߁YWx%}]=HClPḍɉ7l9,g }c!'&lטeJ)NXܖqt#[㶷|}r>Fvpo>"=!%2D5ɉYgXɉRmWh=Hb5MS>կ=iDžcbO c"Ӱv؟{cYˇcñ9q+N{E"/q/bژFMj7+K  u[wι\8cö89Wy8.X{ČѵRsbzO^@`M_uֺL+ p>X`3b&'eCz^qӸC^/Ñ@zE/ۃ_ 5}TCfD>,{#b ^#I~(uΆR3^[Iu=޴2:Lc_&cl`3us^Ӣ_85p9T^ݚ%vi[co>{:s݀ߤ7Frv%Qm**#Fܫ.>Niplo_JګRN 53%E $G$#K/‘W֓'O< T^uD]zQ\27c@qp 9ΜzY3e ,>7}Rq# C1F\DnGVGi s39 XYr g9ܨb8Uz0jh"U-A(%bq5trr_~s^Y*d 8%><%'xxj`.tbB7<OFLw7pH$OoMd?oGF M$džK~{b:EJ$o3&mdbc]{Ƀ?A&aSbc6f!VYf4ÚYglmwgY /y$I@"G4ntrollerOption0"PublishQTProperties::PausedAtStart0 CColorDef3PfP0PHP`Px333(3f<03CH3F`3Hxf0f30ff(0f5HCPicPage CPicLayer CPicFrame CPicBitmap&? Layer 1OO Layer 1OOCPicPage CPicLayer CPicFrameCPicText X2ArialArialMT@"(The following text has been produced with CKEditor XhArial Arial-BoldMT@"(Flash Output Sample CPicSymbol????K29g&f0'&44 l< #PaaaDDDDdrrD]grrrrrprrprpppp |nnn_XvXQnXXQXQXQXXXQXXX55X555555555XX5XXXXwXwXXwXwXwaaXwa+%&%aDj""&&f<a%8d&6#8' zz[,zzeO,,, bSS,n_S S,S,SYfzzS,SOadozzzzzzzz;.L'l..7.&L))))m -HM)0.0F1 '  EEDBEEBnBBBBuBn1h tl DDDBDDDEEDE8B - ]0>H H H rH H H H XH XH H XrH XH XH XXXH XXoH XXXXX:CPicText (  Myriad-RomanxEthe text editor for Internet?\ Logo FCKeditor.aiOOCPicPage CPicLayer CPicFrameCPicText  X3 Arial(The following text has been produced with FCKeditor CPicSymbol h  X hArial(Flash Output SampleK29g&f0'&44 l<  <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:12:18 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/"> <xmp:CreatorTool>Adobe Flash CS4 Professional</xmp:CreatorTool> <xmp:CreateDate>2010-10-21T17:08:13+02:00</xmp:CreateDate> <xmp:MetadataDate>2010-10-21T17:18:13+02:00</xmp:MetadataDate> <xmp:ModifyDate>2010-10-21T17:18:13+02:00</xmp:ModifyDate> </rdf:Description> <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/"> <dc:format>application/vnd.adobe.fla</dc:format> </rdf:Description> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"> <xmpMM:DerivedFrom rdf:parseType="Resource"/> <xmpMM:DocumentID>xmp.did:97FEEC6B26DDDF119CC2FB8A8AACE65D</xmpMM:DocumentID> <xmpMM:InstanceID>xmp.iid:97FEEC6B26DDDF119CC2FB8A8AACE65D</xmpMM:InstanceID> <xmpMM:OriginalDocumentID>xmp.did:97FEEC6B26DDDF119CC2FB8A8AACE65D</xmpMM:OriginalDocumentID> <xmpMM:History> <rdf:Seq> <rdf:li rdf:parseType="Resource"> <stEvt:action>saved</stEvt:action> <stEvt:instanceID>xmp.iid:97FEEC6B26DDDF119CC2FB8A8AACE65D</stEvt:instanceID> <stEvt:when>2010-10-21T17:18:13+02:00</stEvt:when> <stEvt:softwareAgent>Adobe Flash CS4 Professional</stEvt:softwareAgent> <stEvt:changed>/</stEvt:changed> </rdf:li> </rdf:Seq> </xmpMM:History> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="w"?> CSaved by Adobe Flash Windows 10.0 build 544 timecount = 1287674293K@|PK!!(<<^abilian/web/resources/ckeditor/samples/old/htmlwriter/assets/outputforflash/outputforflash.swfFWS<x_ DC?^ FCKTextAreahtmlTextFCETextAreasetDatathisflashexternalExternalInterfaceaddCallbacksetData*htDataOO NN RxT txRo!=wLfqbEaXdz:pn~hoQ_z~Ro4 :>Xa`T!'l=z=2J0iH4:?cͯՌ2+"K:Qie4 ު\Qf>VGB Ed u(B̿|W7 Arial24%B3>WnTmG  5zWgP(Wv8UaF|/X.7 TlҤʙ!S%d3hwR#'?wX* p0Im& Y匪24UTjN"exʤ~+%< x*FT XמZ:[ g1^tDŽ ^)z#(l/J Xם)7#R74dQe<9'{P$=l _iLz-dl/ CYAtC` =qi J4xWp*L2+:= EWdGYhsK߫D' 8* .>Sz *xn;yT,DڝQj"tuH!Њ*RԊ=T(%@9`  P&.t]aD@\ea`BUuAAƁDhd`52:ԀD8<4 WRʱ|U r ^c^t8G#57PRp2c (cP#`UVU].OQP;*d ʠwb5*I[*I5/ J_"0ۀd @j0@ 8gzPsUMkH!U 4w|4^ TGUQWIlIʴ6"aT&̕J:-Jl䏀 =J\< !pfʨ)J$j]@ zkbX (/sQ*-DlP&jJSBMNQf]@(:'D}Lʣ\?$ p *3L6D|*ˌ 8RkP> k9Rz sU kG U$cv4^ V GGhRQUYQT#P@tU)R `iѼ*+t5 2Ϫ>en [Q mrRA*"UW$$R{Ɉs f`ՅzXWzWz  ozRQ.U$@T@UJ>TAU+twr3^3 T DQW j%H!:&"tC>zܬ a*$X bp nꭻ)R0@\NuPC>F|x &F%TiPCRaY5VxZeU XםeII$0Rَa|f  x2Tu=Vl3TCIM:3[QcUڅ ⵗD| T'i{o菀XZ=TtG <Xם> ZН ҼՒK%H/2K *ARd`U qx3bTiO.W`Sy50\fmUGD| TVz3F*Ud{ +qh++qe*.rI+n(H+P5M9UVP?F~J)V7'd6U YU]CY ~@  F74C4t%)k-Qms2J W ^TBI P2([dTW]YYS:Д -犆] gԨϏQ'\ƥ@^,* 8.@ dZН UeLR4v']hjkfzd1QhpCtV> vzwEA,dGUA&pTKJX@R,UtwRGU1LS+ tRE%# IKkR9#>'R AM1RuLˍ*4`{jf&Wbq"u8Z*wa/Jw\)5ɰ9@ šǀyﲓ% Psm mMS TM0e^I@54tVMDt)GmnvĺU;XB0 7'-7* " (K zg"* )c=^Js/:#p*`zKQ1e@T6fceYN-0 =TtM 4НiGyj{N:1HIGR^yf3Gw芀 )`8yNew2n9 Ml.X e؆o8'};.o$7F^ CEKTabcdefghilnoprstuwxlH` D9\5\50,,(,,D,,,,,(D,9(A L P T Y         F,P,T,V,W,Y,r,v,w,y,,,,,,,,<,< ,",#,`3,44@4 B4XC4XD44M44N44555 5|"5x#5152535475:5B5C5E5F5I5M5!6#6X-6162656>6A6B6C6N67#7x07174273757477:7<7>7@7E7F7M78x"8|#8h#9X":|#:h;;x;";h#;$;X-;X.;h1;h2; 3;45;X7;:;>;4@;DB;4C;4D;4M;4N;4<<x"<|#<h-<.<1<42<C<N<=x#=h>>>> >|">#>%>2>3>47>:>;>A>B>C>E>F>I>M>"?|#?h@x"@x#@hC@AA"Ax#A1A2A3A47A:ABACAEAFAB4BX0B42B45BX:B>B4@B4DB4EBLBMB4NB4CC4CCCCCC"Cx%C4)C0C1C42C45C6C7C:C<C>C@CBCDCICD1D2D7DCDEDEE"E|#Eh1EX5E4>E@EMENE#FhGXG!G0G41GX2Gh5GX6G7GX;G4>G4@G4AGDG4EG4LGNG4#Hh"I|#Ih1JX2JX4J46J7J4Kx"K|Lx"L|MM M41M4M:MAMCMNx"N|#NhOO OX"Ox#O-O1O42O3O@OCODOMO 4 4" 4#  4  A L f |r      x* ,   @=3Bz6BV6B>B*?B6B2B.?Bh2B6BA?B)6>B6B3B(6>B82%?B 6B 6B3B6B6>B3B3B?ArialTypeface © The Monotype Corporation plc. Data © The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reservedqp  2"MT@CQW \5֍^Z:҅0؅*g̅J(W@CE!P無P֍hCb0FVhCE P`-Arial @tZl ? XמлSa"wkcM,+vQ Gq@*K6l2JZ Pjh ññ& t ;`;`Tq쑪VU#7PT@Y V ne]UFU@t ^ ` rZtT TdQQBK, <& mM1N#yUi];eRUWViP]@aD텉aU%74VU+r]3w +Nb2ǀ &!*qQT rFCC "j 8$CnQ2DD!ʬ(+ 4] ]ooY FY`T5Z9Y8`TsK7YT.EPMLШ# z %>Ktv > SL+½S0bVCXR#ᮨt4uFЋi=G`p 5e\WT  e9poɂ(yۃn nц bP)_Y`Ojݦ eU oUUu.^ V EՕD>iBVEYV1FOxIP'E*)Y<J LRp .y{J6bR c@ z) G +^|UT')؀ah )0K*0eXV7B{QGӅNfVxSQ*ݢ]U*dvT5b |XםrP` ;+B{=ҵU+t<R4Hx*W2K*ˎ`T@eCK*:AT$EP 7eAhJ'SҜj& Z)+ʼhwB2BA6>BN6B3>B6BN6Bx6B06>B?Arial BoldTypeface © The Monotype Corporation plc. Data © The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved;hЀ @hqD2(cpBF0ܱM7,x2!@qE2 PװA C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((( }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzJFIFC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((=" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?R4S%1:}냂 \+ |#]V}6RK&hV` PO3zRZۢ<x {"d0[(^^* iў|ʹ+> i66^?uDKO+.dmח"O'TBxZhHKuf1\~l7FwSЧ߯c]S^QI>9_ 궃N22THrU>k>:i‹rS9 )_ʾuJQ{.X$e7y+zX(=p(((((((ٿ\7~#fM:lP4"?_0ZQi؎zW}%IP~kyZuew׷|ьGui/]&Fm"<I tcjt-r{f2@6}3 E'NIzHS}b.-ңc+FLZ?Ǫ޻sw_&J?v}_r?txeǓtu܇RU =}6^5џe߈:o5(Tb7OL?y Z?}QU9M;lK%n b>˩@>5)^kC>W}i`@m}A;YJJɳ~|銫]57Zx1T?s@udnnd%Zڰ-}_<]7 5fhԬ`2j?A~[ hڬ2T3p~u[#܃ǽzkRu}q$9S=.i6lK\ m/$"8R̀Fp?Z/bɳɺ }\Oq#>$fd==%/l[+XQ'!NԈ/]Eq![(dMm#TZDžtXSX&3#3`}+:k!;mI=#Ry[{;1Hn08y}6ƛM-l;n1LَH\j3Z-v-L9 MU{ TĞ+{x"AX.]tX8aqָ(l-ޯ}n`D Vb]eH8>SƗe'5_i)ϗe!Y|@ο[֢ռ?ͺ8Rp#XGB((1?i%y@" 2+ѧZ<"ռEjۿu+B'8+&(8S5 (((((((((x홻v@g$&ql.nb[QZRY[avcDwRD@w|?x:6*|6L_t'$m.0j YJo{mֲl:fm#&1!qqq\}$l> "ig-4 "ہjssx#e[|RЅs&q^ ED:Е`?Jač|UDMۇѠm#}tKw`r!O<}ݧ<4PB9 Ά( n/&z΍ -MtU( ΍dMMpPFԉ#j} /-ADid~Q0E&\ Ш8fDhF8R (p#E4-KD--c5$9@DfTD"Gef _4 {Q6HF""DJqEMEqJ-j. $#(e@6Q'6a (XKDZ#(S?thO:x]YU<í[@mTDޔyq@.c0/%՘zk-WNKUMFh ,ݓ1@۵ԿM'ٔw!ۭ]kz0nf#oJlc6KKtg?5ng#a|l?.Bĕ+*װ|Z)s\e3,鲗"W֮Vk]jԯ• ,#lTF|fs%>=y?{OχNٸƔ< B[{{}qڷȑj/2(ҥrvDZvulԯZy]ds<*q2+q\-o;EC3dճ>ΓC@C@ L7d:l󱗝)G 3w"(

     H&jT`FCKTextArea@PK!9,##Xabilian/web/resources/ckeditor/samples/old/htmlwriter/assets/outputforflash/swfobject.jsvar swfobject=function(){function u(){if(!s){try{var a=d.getElementsByTagName("body")[0].appendChild(d.createElement("span"));a.parentNode.removeChild(a)}catch(b){return}s=!0;for(var a=x.length,c=0;cf){f++;setTimeout(arguments.callee,10);return}a.removeChild(b);c=null;D()})()}else D()}function D(){var a=p.length;if(0e.wk))t(c,!0),f&&(g.success=!0,g.ref=E(c),f(g));else if(p[b].expressInstall&&F()){g={};g.data=p[b].expressInstall;g.width=d.getAttribute("width")||"0";g.height=d.getAttribute("height")||"0";d.getAttribute("class")&&(g.styleclass=d.getAttribute("class"));d.getAttribute("align")&&(g.align=d.getAttribute("align"));for(var h={},d=d.getElementsByTagName("param"),j=d.length,k=0;ke.wk)}function G(a,b,c,f){A=!0;H=f||null;N={success:!1,id:c};var g=n(c);if(g){"OBJECT"==g.nodeName?(w=I(g),B=null):(w=g,B=c);a.id= O;if(typeof a.width==i||!/%$/.test(a.width)&&310>parseInt(a.width,10))a.width="310";if(typeof a.height==i||!/%$/.test(a.height)&&137>parseInt(a.height,10))a.height="137";d.title=d.title.slice(0,47)+" - Flash Player Installation";f=e.ie&&e.win?"ActiveX":"PlugIn";f="MMredirectURL="+m.location.toString().replace(/&/g,"%26")+"&MMplayerType="+f+"&MMdoctitle="+d.title;b.flashvars=typeof b.flashvars!=i?b.flashvars+("&"+f):f;e.ie&&(e.win&&4!=g.readyState)&&(f=d.createElement("div"),c+="SWFObjectNew",f.setAttribute("id", c),g.parentNode.insertBefore(f,g),g.style.display="none",function(){g.readyState==4?g.parentNode.removeChild(g):setTimeout(arguments.callee,10)}());J(a,b,c)}}function W(a){if(e.ie&&e.win&&4!=a.readyState){var b=d.createElement("div");a.parentNode.insertBefore(b,a);b.parentNode.replaceChild(I(a),b);a.style.display="none";(function(){4==a.readyState?a.parentNode.removeChild(a):setTimeout(arguments.callee,10)})()}else a.parentNode.replaceChild(I(a),a)}function I(a){var b=d.createElement("div");if(e.win&& e.ie)b.innerHTML=a.innerHTML;else if(a=a.getElementsByTagName(r)[0])if(a=a.childNodes)for(var c=a.length,f=0;fe.wk)return f;if(g)if(typeof a.id==i&&(a.id=c),e.ie&&e.win){var o="",h;for(h in a)a[h]!=Object.prototype[h]&&("data"==h.toLowerCase()?b.movie=a[h]:"styleclass"==h.toLowerCase()?o+=' class="'+a[h]+'"':"classid"!=h.toLowerCase()&&(o+=" "+ h+'="'+a[h]+'"'));h="";for(var j in b)b[j]!=Object.prototype[j]&&(h+='');g.outerHTML='"+h+"";C[C.length]=a.id;f=n(a.id)}else{j=d.createElement(r);j.setAttribute("type",y);for(var k in a)a[k]!=Object.prototype[k]&&("styleclass"==k.toLowerCase()?j.setAttribute("class",a[k]):"classid"!=k.toLowerCase()&&j.setAttribute(k,a[k]));for(o in b)b[o]!=Object.prototype[o]&&"movie"!=o.toLowerCase()&& (a=j,h=o,k=b[o],c=d.createElement("param"),c.setAttribute("name",h),c.setAttribute("value",k),a.appendChild(c));g.parentNode.replaceChild(j,g);f=j}return f}function P(a){var b=n(a);b&&"OBJECT"==b.nodeName&&(e.ie&&e.win?(b.style.display="none",function(){if(4==b.readyState){var c=n(a);if(c){for(var f in c)"function"==typeof c[f]&&(c[f]=null);c.parentNode.removeChild(c)}}else setTimeout(arguments.callee,10)}()):b.parentNode.removeChild(b))}function n(a){var b=null;try{b=d.getElementById(a)}catch(c){}return b} function U(a,b,c){a.attachEvent(b,c);v[v.length]=[a,b,c]}function z(a){var b=e.pv,a=a.split(".");a[0]=parseInt(a[0],10);a[1]=parseInt(a[1],10)||0;a[2]=parseInt(a[2],10)||0;return b[0]>a[0]||b[0]==a[0]&&b[1]>a[1]||b[0]==a[0]&&b[1]==a[1]&&b[2]>=a[2]?!0:!1}function Q(a,b,c,f){if(!e.ie||!e.mac){var g=d.getElementsByTagName("head")[0];if(g){c=c&&"string"==typeof c?c:"screen";f&&(K=l=null);if(!l||K!=c)f=d.createElement("style"),f.setAttribute("type","text/css"),f.setAttribute("media",c),l=g.appendChild(f), e.ie&&(e.win&&typeof d.styleSheets!=i&&0\.;]/.exec(a)&&typeof encodeURIComponent!=i?encodeURIComponent(a):a}var i="undefined",r="object",y="application/x-shockwave-flash", O="SWFObjectExprInst",m=window,d=document,q=navigator,T=!1,x=[function(){T?V():D()}],p=[],C=[],v=[],w,B,H,N,s=!1,A=!1,l,K,R=!0,e=function(){var a=typeof d.getElementById!=i&&typeof d.getElementsByTagName!=i&&typeof d.createElement!=i,b=q.userAgent.toLowerCase(),c=q.platform.toLowerCase(),f=c?/win/.test(c):/win/.test(b),c=c?/mac/.test(c):/mac/.test(b),b=/webkit/.test(b)?parseFloat(b.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):!1,g=!+"\v1",e=[0,0,0],h=null;if(typeof q.plugins!=i&&typeof q.plugins["Shockwave Flash"]== r){if((h=q.plugins["Shockwave Flash"].description)&&!(typeof q.mimeTypes!=i&&q.mimeTypes[y]&&!q.mimeTypes[y].enabledPlugin))T=!0,g=!1,h=h.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),e[0]=parseInt(h.replace(/^(.*)\..*$/,"$1"),10),e[1]=parseInt(h.replace(/^.*\.(.*)\s.*$/,"$1"),10),e[2]=/[a-zA-Z]/.test(h)?parseInt(h.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}else if(typeof m.ActiveXObject!=i)try{var j=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");if(j&&(h=j.GetVariable("$version")))g=!0,h=h.split(" ")[1].split(","), e=[parseInt(h[0],10),parseInt(h[1],10),parseInt(h[2],10)]}catch(k){}return{w3:a,pv:e,wk:b,ie:g,win:f,mac:c}}();(function(){e.w3&&((typeof d.readyState!=i&&"complete"==d.readyState||typeof d.readyState==i&&(d.getElementsByTagName("body")[0]||d.body))&&u(),s||(typeof d.addEventListener!=i&&d.addEventListener("DOMContentLoaded",u,!1),e.ie&&e.win&&(d.attachEvent("onreadystatechange",function(){"complete"==d.readyState&&(d.detachEvent("onreadystatechange",arguments.callee),u())}),m==top&&function(){if(!s){try{d.documentElement.doScroll("left")}catch(a){setTimeout(arguments.callee, 0);return}u()}}()),e.wk&&function(){s||(/loaded|complete/.test(d.readyState)?u():setTimeout(arguments.callee,0))}(),M(u)))})();(function(){e.ie&&e.win&&window.attachEvent("onunload",function(){for(var a=v.length,b=0;be.wk)&&a&&b&&c&&d&&g?(t(b,!1),L(function(){c+="";d+="";var e={};if(k&&typeof k===r)for(var l in k)e[l]=k[l];e.data=a;e.width=c;e.height=d;l={};if(j&&typeof j===r)for(var p in j)l[p]=j[p];if(h&&typeof h===r)for(var q in h)l.flashvars=typeof l.flashvars!=i?l.flashvars+("&"+q+"="+h[q]):q+"="+h[q];if(z(g))p=J(e,l,b),e.id== b&&t(b,!0),n.success=!0,n.ref=p;else{if(o&&F()){e.data=o;G(e,l,b,m);return}t(b,!0)}m&&m(n)})):m&&m(n)},switchOffAutoHideShow:function(){R=!1},ua:e,getFlashPlayerVersion:function(){return{major:e.pv[0],minor:e.pv[1],release:e.pv[2]}},hasFlashPlayerVersion:z,createSWF:function(a,b,c){if(e.w3)return J(a,b,c)},showExpressInstall:function(a,b,c,d){e.w3&&F()&&G(a,b,c,d)},removeSWF:function(a){e.w3&&P(a)},createCSS:function(a,b,c,d){e.w3&&Q(a,b,c,d)},addDomLoadEvent:L,addLoadEvent:M,getQueryParamValue:function(a){var b= d.location.search||d.location.hash;if(b){/\?/.test(b)&&(b=b.split("?")[1]);if(null==a)return S(b);for(var b=b.split("&"),c=0;c Output for Flash — CKEditor Sample

    CKEditor Samples » Producing Flash Compliant HTML Output

    This sample is not maintained anymore. Check out the brand new samples in CKEditor SDK.

    This sample shows how to configure CKEditor to output HTML code that can be used with Adobe Flash. The code will contain a subset of standard HTML elements like <b>, <i>, and <p> as well as HTML attributes.

    To add a CKEditor instance outputting Flash compliant HTML code, load the editor using a standard JavaScript call, and define CKEditor features to use HTML elements and attributes.

    For details on how to create this setup check the source code of this sample page.

    To see how it works, create some content in the editing area of CKEditor on the left and send it to the Flash object on the right side of the page by using the Send to Flash button.

    PK!{Eabilian/web/resources/ckeditor/samples/old/htmlwriter/outputhtml.html HTML Compliant Output — CKEditor Sample

    CKEditor Samples » Producing HTML Compliant Output

    This sample is not maintained anymore. Check out the brand new samples in CKEditor SDK.

    This sample shows how to configure CKEditor to output valid HTML 4.01 code. Traditional HTML elements like <b>, <i>, and <font> are used in place of <strong>, <em>, and CSS styles.

    To add a CKEditor instance outputting legacy HTML 4.01 code, load the editor using a standard JavaScript call, and define CKEditor features to use the HTML compliant elements and attributes.

    A snippet of the configuration code can be seen below; check the source of this page for full definition:

    CKEDITOR.replace( 'textarea_id', {
    	coreStyles_bold: { element: 'b' },
    	coreStyles_italic: { element: 'i' },
    
    	fontSize_style: {
    		element: 'font',
    		attributes: { 'size': '#(size)' }
    	}
    
    	...
    });

    PK!ې~~5abilian/web/resources/ckeditor/samples/old/index.html CKEditor Samples

    CKEditor Samples

    These samples are not maintained anymore. Check out the brand new samples in CKEditor SDK.

    Basic Samples

    Replace textarea elements by class name
    Automatic replacement of all textarea elements of a given class with a CKEditor instance.
    Replace textarea elements by code
    Replacement of textarea elements with CKEditor instances by using a JavaScript call.
    Create editors with jQuery
    Creating standard and inline CKEditor instances with jQuery adapter.

    Basic Customization

    User Interface color
    Changing CKEditor User Interface color and adding a toolbar button that lets the user set the UI color.
    User Interface languages
    Changing CKEditor User Interface language and adding a drop-down list that lets the user choose the UI language.

    Plugins

    Magicline plugin
    Using the Magicline plugin to access difficult focus spaces.
    Full page support
    CKEditor inserted with a JavaScript call and used to edit the whole page from <html> to </html>.

    Inline Editing

    Massive inline editor creation
    Turn all elements with contentEditable = true attribute into inline editors.
    Convert element into an inline editor by code
    Conversion of DOM elements into inline CKEditor instances by using a JavaScript call.
    Replace textarea with inline editor New!
    A form with a textarea that is replaced by an inline editor at runtime.

    Advanced Samples

    Data filtering and features activation New!
    Data filtering and automatic features activation basing on configuration.
    Replace DIV elements on the fly
    Transforming a div element into an instance of CKEditor with a mouse click.
    Append editor instances
    Appending editor instances to existing DOM elements.
    Create and destroy editor instances for Ajax applications
    Creating and destroying CKEditor instances on the fly and saving the contents entered into the editor window.
    Basic usage of the API
    Using the CKEditor JavaScript API to interact with the editor at runtime.
    XHTML-compliant style
    Configuring CKEditor to produce XHTML 1.1 compliant attributes and styles.
    Read-only mode
    Using the readOnly API to block introducing changes to the editor contents.
    "Tab" key-based navigation
    Navigating among editor instances with tab key.
    Using the JavaScript API to customize dialog windows
    Using the dialog windows API to customize dialog windows without changing the original editor code.
    Using the "Enter" key in CKEditor
    Configuring the behavior of Enter and Shift+Enter keys.
    Output for Flash
    Configuring CKEditor to produce HTML code that can be used with Adobe Flash.
    Output HTML
    Configuring CKEditor to produce legacy HTML 4 code.
    Toolbar Configurations
    Configuring CKEditor to display full or custom toolbar layout.
    PK!T''9abilian/web/resources/ckeditor/samples/old/inlineall.html Massive inline editing — CKEditor Sample

    CKEditor Samples » Massive inline editing

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample page demonstrates the inline editing feature - CKEditor instances will be created automatically from page elements with contentEditable attribute set to value true:

    <div contenteditable="true" > ... </div>

    Click inside of any element below to start editing.

    Fusce vitae porttitor

    Lorem ipsum dolor sit amet dolor. Duis blandit vestibulum faucibus a, tortor.

    Proin nunc justo felis mollis tincidunt, risus risus pede, posuere cubilia Curae, Nullam euismod, enim. Etiam nibh ultricies dolor ac dignissim erat volutpat. Vivamus fermentum nisl nulla sem in metus. Maecenas wisi. Donec nec erat volutpat.

    Fusce vitae porttitor a, euismod convallis nisl, blandit risus tortor, pretium. Vehicula vitae, imperdiet vel, ornare enim vel sodales rutrum

    Libero nunc, rhoncus ante ipsum non ipsum. Nunc eleifend pede turpis id sollicitudin fringilla. Phasellus ultrices, velit ac arcu.

    Pellentesque nunc. Donec suscipit erat. Pellentesque habitant morbi tristique ullamcorper.

    Mauris mattis feugiat lectus nec mauris. Nullam vitae ante.

    Integer condimentum sit amet

    Aenean nonummy a, mattis varius. Cras aliquet. Praesent magna non mattis ac, rhoncus nunc, rhoncus eget, cursus pulvinar mollis.

    Proin id nibh. Sed eu libero posuere sed, lectus. Phasellus dui gravida gravida feugiat mattis ac, felis.

    Integer condimentum sit amet, tempor elit odio, a dolor non ante at sapien. Sed ac lectus. Nulla ligula quis eleifend mi, id leo velit pede cursus arcu id nulla ac lectus. Phasellus vestibulum. Nunc viverra enim quis diam.

    Praesent wisi accumsan sit amet nibh

    Donec ullamcorper, risus tortor, pretium porttitor. Morbi quam quis lectus non leo.

    Integer faucibus scelerisque. Proin faucibus at, aliquet vulputate, odio at eros. Fusce gravida, erat vitae augue. Fusce urna fringilla gravida.

    In hac habitasse platea dictumst. Praesent wisi accumsan sit amet nibh. Maecenas orci luctus a, lacinia quam sem, posuere commodo, odio condimentum tempor, pede semper risus. Suspendisse pede. In hac habitasse platea dictumst. Nam sed laoreet sit amet erat. Integer.

    CKEditor logo

    Quisque justo neque, mattis sed, fermentum ultrices posuere cubilia Curae, Vestibulum elit metus, quis placerat ut, lectus. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi.

    Nullam laoreet vel consectetuer tellus suscipit

    • Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis.
    • Fusce porttitor, nulla quis turpis. Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi.
    • Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.

    Quisque justo neque, mattis sed, fermentum ultrices posuere cubilia Curae, Vestibulum elit metus, quis placerat ut, lectus.

    Nullam laoreet vel, consectetuer tellus suscipit ultricies, hendrerit wisi. Ut sagittis, nunc libero, egestas consequat lobortis velit rutrum ut, faucibus turpis. Fusce porttitor, nulla quis turpis.

    Donec odio nec velit ac nunc sit amet, accumsan cursus aliquet. Vestibulum ante sit amet sagittis mi. Sed in nonummy faucibus turpis. Mauris eget tellus. Donec non felis. Nam eget dolor. Vestibulum enim. Donec.

    Tags of this article:

    inline, editing, floating, CKEditor

    PK!ն..<abilian/web/resources/ckeditor/samples/old/inlinebycode.html Inline Editing by Code — CKEditor Sample

    CKEditor Samples » Inline Editing by Code

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how to create an inline editor instance of CKEditor. It is created with a JavaScript call using the following code:

    // This property tells CKEditor to not activate every element with contenteditable=true element.
    CKEDITOR.disableAutoInline = true;
    
    var editor = CKEDITOR.inline( document.getElementById( 'editable' ) );
    

    Note that editable in the code above is the id attribute of the <div> element to be converted into an inline instance.

    Saturn V carrying Apollo 11 Apollo 11

    Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.

    Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

    Broadcasting and quotes

    Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

    One small step for [a] man, one giant leap for mankind.

    Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

    [...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.

    Technical details

    Mission crew
    Position Astronaut
    Commander Neil A. Armstrong
    Command Module Pilot Michael Collins
    Lunar Module Pilot Edwin "Buzz" E. Aldrin, Jr.

    Launched by a Saturn V rocket from Kennedy Space Center in Merritt Island, Florida on July 16, Apollo 11 was the fifth manned mission of NASA's Apollo program. The Apollo spacecraft had three parts:

    1. Command Module with a cabin for the three astronauts which was the only part which landed back on Earth
    2. Service Module which supported the Command Module with propulsion, electrical power, oxygen and water
    3. Lunar Module for landing on the Moon.

    After being sent to the Moon by the Saturn V's upper stage, the astronauts separated the spacecraft from it and travelled for three days until they entered into lunar orbit. Armstrong and Aldrin then moved into the Lunar Module and landed in the Sea of Tranquility. They stayed a total of about 21 and a half hours on the lunar surface. After lifting off in the upper part of the Lunar Module and rejoining Collins in the Command Module, they returned to Earth and landed in the Pacific Ocean on July 24.


    Source: Wikipedia.org

    PK!Z^88>abilian/web/resources/ckeditor/samples/old/inlinetextarea.html Replace Textarea with Inline Editor — CKEditor Sample

    CKEditor Samples » Replace Textarea with Inline Editor

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    You can also create an inline editor from a textarea element. In this case the textarea will be replaced by a div element with inline editing enabled.

    // "article-body" is the name of a textarea element.
    var editor = CKEDITOR.inline( 'article-body' );
    

    This is a sample form with some fields

    Title:

    Article Body (Textarea converted to CKEditor):

    PK!)/WW6abilian/web/resources/ckeditor/samples/old/jquery.html jQuery Adapter — CKEditor Sample

    CKEditor Samples » Create Editors with jQuery

    This sample is not maintained anymore. Check out the brand new samples in CKEditor SDK.

    This sample shows how to use the jQuery adapter. Note that you have to include both CKEditor and jQuery scripts before including the adapter.

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script src="/ckedit../../ckeditor.js"></script>
    <script src="/ckeditor/adapters/jquery.js"></script>
    

    Then you can replace HTML elements with a CKEditor instance using the ckeditor() method.

    $( document ).ready( function() {
    	$( 'textarea#editor1' ).ckeditor();
    } );
    

    Inline Example

    Saturn V carrying Apollo 11Apollo 11 was the spaceflight that landed the first humans, Americans Neil Armstrong and Buzz Aldrin, on the Moon on July 20, 1969, at 20:18 UTC. Armstrong became the first to step onto the lunar surface 6 hours later on July 21 at 02:56 UTC.

    Armstrong spent about three and a half two and a half hours outside the spacecraft, Aldrin slightly less; and together they collected 47.5 pounds (21.5 kg) of lunar material for return to Earth. A third member of the mission, Michael Collins, piloted the command spacecraft alone in lunar orbit until Armstrong and Aldrin returned to it for the trip back to Earth.

    Broadcast on live TV to a world-wide audience, Armstrong stepped onto the lunar surface and described the event as:

    One small step for [a] man, one giant leap for mankind.

    Apollo 11 effectively ended the Space Race and fulfilled a national goal proposed in 1961 by the late U.S. President John F. Kennedy in a speech before the United States Congress:

    [...] before this decade is out, of landing a man on the Moon and returning him safely to the Earth.


    Classic (iframe-based) Example

    PK!Y Cabilian/web/resources/ckeditor/samples/old/magicline/magicline.html Using Magicline plugin — CKEditor Sample

    CKEditor Samples » Using Magicline plugin

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows the advantages of Magicline plugin which is to enhance the editing process. Thanks to this plugin, a number of difficult focus spaces which are inaccessible due to browser issues can now be focused.

    Magicline plugin shows a red line with a handler which, when clicked, inserts a paragraph and allows typing. To see this, focus an editor and move your mouse above the focus space you want to access. The plugin is enabled by default so no additional configuration is necessary.

    This editor uses a default Magicline setup.


    This editor is using a blue line.

    CKEDITOR.replace( 'editor2', {
    	magicline_color: 'blue'
    });
    PK!w3~F F 8abilian/web/resources/ckeditor/samples/old/readonly.html Using the CKEditor Read-Only API — CKEditor Sample

    CKEditor Samples » Using the CKEditor Read-Only API

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how to use the setReadOnly API to put editor into the read-only state that makes it impossible for users to change the editor contents.

    For details on how to create this setup check the source code of this sample page.

    PK!cc>abilian/web/resources/ckeditor/samples/old/replacebyclass.html Replace Textareas by Class Name — CKEditor Sample

    CKEditor Samples » Replace Textarea Elements by Class Name

    This sample is not maintained anymore. Check out the brand new samples in CKEditor SDK.

    This sample shows how to automatically replace all <textarea> elements of a given class with a CKEditor instance.

    To replace a <textarea> element, simply assign it the ckeditor class, as in the code below:

    <textarea class="ckeditor" name="editor1"></textarea>
    

    Note that other <textarea> attributes (like id or name) need to be adjusted to your document.

    PK!ޛ)=abilian/web/resources/ckeditor/samples/old/replacebycode.html Replace Textarea by Code — CKEditor Sample

    CKEditor Samples » Replace Textarea Elements Using JavaScript Code

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This editor is using an <iframe> element-based editing area, provided by the Wysiwygarea plugin.

    CKEDITOR.replace( 'textarea_id' )
    

    PK!"`5abilian/web/resources/ckeditor/samples/old/sample.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ html, body, h1, h2, h3, h4, h5, h6, div, span, blockquote, p, address, form, fieldset, img, ul, ol, dl, dt, dd, li, hr, table, td, th, strong, em, sup, sub, dfn, ins, del, q, cite, var, samp, code, kbd, tt, pre { line-height: 1.5; } body { padding: 10px 30px; } input, textarea, select, option, optgroup, button, td, th { font-size: 100%; } pre { -moz-tab-size: 4; tab-size: 4; } pre, code, kbd, samp, tt { font-family: monospace,monospace; font-size: 1em; } body { width: 960px; margin: 0 auto; } code { background: #f3f3f3; border: 1px solid #ddd; padding: 1px 4px; border-radius: 3px; } abbr { border-bottom: 1px dotted #555; cursor: pointer; } .new, .beta { text-transform: uppercase; font-size: 10px; font-weight: bold; padding: 1px 4px; margin: 0 0 0 5px; color: #fff; float: right; border-radius: 3px; } .new { background: #FF7E00; border: 1px solid #DA8028; text-shadow: 0 1px 0 #C97626; box-shadow: 0 2px 3px 0 #FFA54E inset; } .beta { background: #18C0DF; border: 1px solid #19AAD8; text-shadow: 0 1px 0 #048CAD; font-style: italic; box-shadow: 0 2px 3px 0 #50D4FD inset; } h1.samples { color: #0782C1; font-size: 200%; font-weight: normal; margin: 0; padding: 0; } h1.samples a { color: #0782C1; text-decoration: none; border-bottom: 1px dotted #0782C1; } .samples a:hover { border-bottom: 1px dotted #0782C1; } h2.samples { color: #000000; font-size: 130%; margin: 15px 0 0 0; padding: 0; } p, blockquote, address, form, pre, dl, h1.samples, h2.samples { margin-bottom: 15px; } ul.samples { margin-bottom: 15px; } .clear { clear: both; } fieldset { margin: 0; padding: 10px; } body, input, textarea { color: #333333; font-family: Arial, Helvetica, sans-serif; } body { font-size: 75%; } a.samples { color: #189DE1; text-decoration: none; } form { margin: 0; padding: 0; } pre.samples { background-color: #F7F7F7; border: 1px solid #D7D7D7; overflow: auto; padding: 0.25em; white-space: pre-wrap; /* CSS 2.1 */ word-wrap: break-word; /* IE7 */ } #footer { clear: both; padding-top: 10px; } #footer hr { margin: 10px 0 15px 0; height: 1px; border: solid 1px gray; border-bottom: none; } #footer p { margin: 0 10px 10px 10px; float: left; } #footer #copy { float: right; } #outputSample { width: 100%; table-layout: fixed; } #outputSample thead th { color: #dddddd; background-color: #999999; padding: 4px; white-space: nowrap; } #outputSample tbody th { vertical-align: top; text-align: left; } #outputSample pre { margin: 0; padding: 0; } .description { border: 1px dotted #B7B7B7; margin-bottom: 10px; padding: 10px 10px 0; overflow: hidden; } label { display: block; margin-bottom: 6px; } /** * CKEditor editables are automatically set with the "cke_editable" class * plus cke_editable_(inline|themed) depending on the editor type. */ /* Style a bit the inline editables. */ .cke_editable.cke_editable_inline { cursor: pointer; } /* Once an editable element gets focused, the "cke_focus" class is added to it, so we can style it differently. */ .cke_editable.cke_editable_inline.cke_focus { box-shadow: inset 0px 0px 20px 3px #ddd, inset 0 0 1px #000; outline: none; background: #eee; cursor: text; } /* Avoid pre-formatted overflows inline editable. */ .cke_editable_inline pre { white-space: pre-wrap; word-wrap: break-word; } /** * Samples index styles. */ .twoColumns, .twoColumnsLeft, .twoColumnsRight { overflow: hidden; } .twoColumnsLeft, .twoColumnsRight { width: 45%; } .twoColumnsLeft { float: left; } .twoColumnsRight { float: right; } dl.samples { padding: 0 0 0 40px; } dl.samples > dt { display: list-item; list-style-type: disc; list-style-position: outside; margin: 0 0 3px; } dl.samples > dd { margin: 0 0 3px; } .warning { color: #ff0000; background-color: #FFCCBA; border: 2px dotted #ff0000; padding: 15px 10px; margin: 10px 0; } .warning.deprecated { font-size: 1.3em; } /* Used on inline samples */ blockquote { font-style: italic; font-family: Georgia, Times, "Times New Roman", serif; padding: 2px 0; border-style: solid; border-color: #ccc; border-width: 0; } .cke_contents_ltr blockquote { padding-left: 20px; padding-right: 8px; border-left-width: 5px; } .cke_contents_rtl blockquote { padding-left: 8px; padding-right: 20px; border-right-width: 5px; } img.right { border: 1px solid #ccc; float: right; margin-left: 15px; padding: 5px; } img.left { border: 1px solid #ccc; float: left; margin-right: 15px; padding: 5px; } .marker { background-color: Yellow; } PK!hMŋ4abilian/web/resources/ckeditor/samples/old/sample.js/** * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/license */ // Tool scripts for the sample pages. // This file can be ignored and is not required to make use of CKEditor. ( function() { CKEDITOR.on( 'instanceReady', function( ev ) { // Check for sample compliance. var editor = ev.editor, meta = CKEDITOR.document.$.getElementsByName( 'ckeditor-sample-required-plugins' ), requires = meta.length ? CKEDITOR.dom.element.get( meta[ 0 ] ).getAttribute( 'content' ).split( ',' ) : [], missing = [], i; if ( requires.length ) { for ( i = 0; i < requires.length; i++ ) { if ( !editor.plugins[ requires[ i ] ] ) missing.push( '' + requires[ i ] + '' ); } if ( missing.length ) { var warn = CKEDITOR.dom.element.createFromHtml( '
    ' + 'To fully experience this demo, the ' + missing.join( ', ' ) + ' plugin' + ( missing.length > 1 ? 's are' : ' is' ) + ' required.' + '
    ' ); warn.insertBefore( editor.container ); } } // Set icons. var doc = new CKEDITOR.dom.document( document ), icons = doc.find( '.button_icon' ); for ( i = 0; i < icons.count(); i++ ) { var icon = icons.getItem( i ), name = icon.getAttribute( 'data-icon' ), style = CKEDITOR.skin.getIconStyle( name, ( CKEDITOR.lang.dir == 'rtl' ) ); icon.addClass( 'cke_button_icon' ); icon.addClass( 'cke_button__' + name + '_icon' ); icon.setAttribute( 'style', style ); icon.setStyle( 'float', 'none' ); } } ); } )(); PK!}^f??@abilian/web/resources/ckeditor/samples/old/sample_posteddata.php
    
    -------------------------------------------------------------------------------------------
      CKEditor - Posted Data
    
      We are sorry, but your Web server does not support the PHP language used in this script.
    
      Please note that CKEditor can be used with any other server-side language than just PHP.
      To save the content created with CKEditor you need to read the POST data on the server
      side and write it to a file or the database.
    
      Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
      For licensing, see LICENSE.md or http://ckeditor.com/license
    -------------------------------------------------------------------------------------------
    
    
    */ include "assets/posteddata.php"; ?> PK!pn|d d 8abilian/web/resources/ckeditor/samples/old/tabindex.html TAB Key-Based Navigation — CKEditor Sample

    CKEditor Samples » TAB Key-Based Navigation

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how tab key navigation among editor instances is affected by the tabIndex attribute from the original page element. Use TAB key to move between the editors.

    PK!Zu""?abilian/web/resources/ckeditor/samples/old/toolbar/toolbar.html Toolbar Configuration — CKEditor Sample

    CKEditor Samples » Toolbar Configuration

    This sample is not maintained anymore. Check out the brand new CKEditor Toolbar Configurator.

    This sample page demonstrates editor with loaded full toolbar (all registered buttons) and, if current editor's configuration modifies default settings, also editor with modified toolbar.

    Since CKEditor 4 there are two ways to configure toolbar buttons.

    By config.toolbar

    You can explicitly define which buttons are displayed in which groups and in which order. This is the more precise setting, but less flexible. If newly added plugin adds its own button you'll have to add it manually to your config.toolbar setting as well.

    To add a CKEditor instance with custom toolbar setting, insert the following JavaScript call to your code:

    CKEDITOR.replace( 'textarea_id', {
    	toolbar: [
    		{ name: 'document', items: [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ] },	// Defines toolbar group with name (used to create voice label) and items in 3 subgroups.
    		[ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ],			// Defines toolbar group without name.
    		'/',																					// Line break - next group will be placed in new line.
    		{ name: 'basicstyles', items: [ 'Bold', 'Italic' ] }
    	]
    });

    By config.toolbarGroups

    You can define which groups of buttons (like e.g. basicstyles, clipboard and forms) are displayed and in which order. Registered buttons are associated with toolbar groups by toolbar property in their definition. This setting's advantage is that you don't have to modify toolbar configuration when adding/removing plugins which register their own buttons.

    To add a CKEditor instance with custom toolbar groups setting, insert the following JavaScript call to your code:

    CKEDITOR.replace( 'textarea_id', {
    	toolbarGroups: [
    		{ name: 'document',	   groups: [ 'mode', 'document' ] },			// Displays document group with its two subgroups.
     		{ name: 'clipboard',   groups: [ 'clipboard', 'undo' ] },			// Group's name will be used to create voice label.
     		'/',																// Line break - next group will be placed in new line.
     		{ name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
     		{ name: 'links' }
    	]
    
    	// NOTE: Remember to leave 'toolbar' property with the default value (null).
    });

    Full toolbar configuration

    Below you can see editor with full toolbar, generated automatically by the editor.

    Note: To create editor instance with full toolbar you don't have to set anything. Just leave toolbar and toolbarGroups with the default, null values.

    
    	
    PK!t, , 7abilian/web/resources/ckeditor/samples/old/uicolor.html UI Color Picker — CKEditor Sample

    CKEditor Samples » UI Color

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how to automatically replace <textarea> elements with a CKEditor instance with an option to change the color of its user interface.
    Note:The UI skin color feature depends on the CKEditor skin compatibility. The Moono and Kama skins are examples of skins that work with it.

    This editor instance has a UI color value defined in configuration to change the skin color, To specify the color of the user interface, set the uiColor property:

    CKEDITOR.replace( 'textarea_id', {
    	uiColor: '#14B8C4'
    });

    Note that textarea_id in the code above is the id attribute of the <textarea> element to be replaced.

    PK!)JՏ;abilian/web/resources/ckeditor/samples/old/uilanguages.html User Interface Globalization — CKEditor Sample

    CKEditor Samples » User Interface Languages

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how to automatically replace <textarea> elements with a CKEditor instance with an option to change the language of its user interface.

    It pulls the language list from CKEditor _languages.js file that contains the list of supported languages and creates a drop-down list that lets the user change the UI language.

    By default, CKEditor automatically localizes the editor to the language of the user. The UI language can be controlled with two configuration options: language and defaultLanguage. The defaultLanguage setting specifies the default CKEditor language to be used when a localization suitable for user's settings is not available.

    To specify the user interface language that will be used no matter what language is specified in user's browser or operating system, set the language property:

    CKEDITOR.replace( 'textarea_id', {
    	// Load the German interface.
    	language: 'de'
    });

    Note that textarea_id in the code above is the id attribute of the <textarea> element to be replaced.

    Available languages ( languages!):

    (You may see strange characters if your system does not support the selected language)

    PK!5'Dabilian/web/resources/ckeditor/samples/old/wysiwygarea/fullpage.html Full Page Editing — CKEditor Sample

    CKEditor Samples » Full Page Editing

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how to configure CKEditor to edit entire HTML pages, from the <html> tag to the </html> tag.

    The CKEditor instance below is inserted with a JavaScript call using the following code:

    CKEDITOR.replace( 'textarea_id', {
    	fullPage: true,
    	allowedContent: true
    });
    

    Note that textarea_id in the code above is the id attribute of the <textarea> element to be replaced.

    The allowedContent in the code above is set to true to disable content filtering. Setting this option is not obligatory, but in full page mode there is a strong chance that one may want be able to freely enter any HTML content in source mode without any limitations.

    PK!{m-ss:abilian/web/resources/ckeditor/samples/old/xhtmlstyle.html XHTML Compliant Output — CKEditor Sample

    CKEditor Samples » Producing XHTML Compliant Output

    This sample is not maintained anymore. Check out its brand new version in CKEditor SDK.

    This sample shows how to configure CKEditor to output valid XHTML 1.1 code. Deprecated elements (<font>, <u>) or attributes (size, face) will be replaced with XHTML compliant code.

    To add a CKEditor instance outputting valid XHTML code, load the editor using a standard JavaScript call and define CKEditor features to use the XHTML compliant elements and styles.

    A snippet of the configuration code can be seen below; check the source of this page for full definition:

    CKEDITOR.replace( 'textarea_id', {
    	contentsCss: 'assets/outputxhtml.css',
    
    	coreStyles_bold: {
    		element: 'span',
    		attributes: { 'class': 'Bold' }
    	},
    	coreStyles_italic: {
    		element: 'span',
    		attributes: { 'class': 'Italic' }
    	},
    
    	...
    });

    PK! ?Kabilian/web/resources/ckeditor/samples/toolbarconfigurator/css/fontello.css@font-face { font-family: 'fontello'; src: url('../font/fontello.eot?89024372'); src: url('../font/fontello.eot?89024372#iefix') format('embedded-opentype'), url('../font/fontello.woff?89024372') format('woff'), url('../font/fontello.ttf?89024372') format('truetype'), url('../font/fontello.svg?89024372#fontello') format('svg'); font-weight: normal; font-style: normal; } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ /* @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; src: url('../font/fontello.svg?89024372#fontello') format('svg'); } } */ [class^="icon-"]:before, [class*=" icon-"]:before { font-family: "fontello"; font-style: normal; font-weight: normal; speak: none; display: inline-block; text-decoration: inherit; width: 1em; margin-right: .2em; text-align: center; /* opacity: .8; */ /* For safety - reset parent styles, that can break glyph codes*/ font-variant: normal; text-transform: none; /* fix buttons height, for twitter bootstrap */ line-height: 1em; /* Animation center compensation - margins should be symmetric */ /* remove if not needed */ margin-left: .2em; /* you can be more comfortable with increased icons size */ /* font-size: 120%; */ /* Uncomment for 3D effect */ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ } .icon-trash:before { content: '\e802'; } /* '' */ .icon-down-big:before { content: '\e800'; } /* '' */ .icon-up-big:before { content: '\e801'; } /* '' */ PK!iZKabilian/web/resources/ckeditor/samples/toolbarconfigurator/font/LICENSE.txtFont license info ## Font Awesome Copyright (C) 2012 by Dave Gandy Author: Dave Gandy License: SIL () Homepage: http://fortawesome.github.com/Font-Awesome/ PK!#--Kabilian/web/resources/ckeditor/samples/toolbarconfigurator/font/config.json{ "name": "", "css_prefix_text": "icon-", "css_use_suffix": false, "hinting": true, "units_per_em": 1000, "ascent": 850, "glyphs": [ { "uid": "f48ae54adfb27d8ada53d0fd9e34ee10", "css": "trash-empty", "code": 59392, "src": "fontawesome" }, { "uid": "1c4068ed75209e21af36017df8871802", "css": "down-big", "code": 59393, "src": "fontawesome" }, { "uid": "95376bf082bfec6ce06ea1cda7bd7ead", "css": "up-big", "code": 59394, "src": "fontawesome" } ] }PK!wG||Labilian/web/resources/ckeditor/samples/toolbarconfigurator/font/fontello.eot|LP:)sfontelloRegularVersion 1.0fontello`OS/2=HVcmapDJcvt Ifpgm x; gaspglyf head,6hhea2VP$hmtx9tloca maxp ( name̝post%/Bprep|Vzz1PfEd@RjZ OD( $@!BhS D5+"'&4?6246732762:):*G*;*l;)*,w*$@!BhS D5+"/#"&5"/&4762*;(G*<*k<k4*w$&*;k /;CgI@F  [[ S C S Dfda^[YTROLIGA@4555553++"&546;2+"&546;2+"&546;2!3!2>3'&'#+#!"&'#"&=46;7>73232 $ $ $ $ $ $ H  64%0%45 ' ,,'  A  A  A d  eAS$ .DB. $ ]] s):_< DDq RjZFCh -nZ 55=DL T_ +g  j   - = M c Vs &Copyright (C) 2014 by original authors @ fontello.comfontelloRegularfontellofontelloVersion 1.0fontelloGenerated by svg2ttf from Fontello project.http://fontello.comCopyright (C) 2014 by original authors @ fontello.comfontelloRegularfontellofontelloVersion 1.0fontelloGenerated by svg2ttf from Fontello project.http://fontello.com down-bigup-bigtrash22  , `f-, d P&ZE[X!#!X PPX!@Y 8PX!8YY Ead(PX! E 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B *! C +0%QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Bab`*-, E EcEb`D`-, E +#%` E#a d PX!0PX @YY#PXeY%#aDD`-,EaD- ,` CJPX #BY CJRX #BY- , b c#a C` ` #B#- ,KTXDY$ e#x- ,KQXKSXDY!Y$e#x- , CUX CaB +YC%B %B %B# %PXC`%B #a *!#a #a *!C`%B%a *!Y CG CG`b EcEb`#DC>C`B-,ETX #B `a  BB` +m+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-,+ETX #B `a  BB` +m+"Y-,+-,+-,+-,+-,+-,+- ,+-!,+-",+-#, +-$, <`-%, ` ` C#`C%a`$*!-&,%+%*-', G EcEb`#a8# UX G EcEb`#a8!Y-(,ETX'*0"Y-),+ETX'*0"Y-*, 5`-+,EcEb+EcEb+D>#8**-,, < G EcEb`Ca8--,.<-., < G EcEb`CaCc8-/,% . G#B%IG#G#a Xb!Y#B.*-0,%%G#G#aE+e.# <8-1,%% .G#G#a #BE+ `PX @QX  &YBB# C #G#G#a#F`Cb` + a C`d#CadPXCaC`Y%ba# &#Fa8#CF%CG#G#a` Cb`# +#C`+%a%b&a %`d#%`dPX!#!Y# &#Fa8Y-2, & .G#G#a#<8-3, #B F#G+#a8-4,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%aEc# Xb!YcEb`#.# <8#!Y-5, C .G#G#a ` `fb# <8-6,# .F%FRX ,1+!# <#B#8&+C.&+-?, G#B.,*-@, G#B.,*-A,-*-B,/*-C,E# . F#a8&+-D,#BC+-E,<+-F,<+-G,<+-H,<+-I,=+-J,=+-K,=+-L,=+-M,9+-N,9+-O,9+-P,9+-Q,;+-R,;+-S,;+-T,;+-U,>+-V,>+-W,>+-X,>+-Y,:+-Z,:+-[,:+-\,:+-],2+.&+-^,2+6+-_,2+7+-`,2+8+-a,3+.&+-b,3+6+-c,3+7+-d,3+8+-e,4+.&+-f,4+6+-g,4+7+-h,4+8+-i,5+.&+-j,5+6+-k,5+7+-l,5+8+-m,+e$Px0-KRXYc #D#p( ERD *D$QX@XD&QXXDYYYYDPK! Labilian/web/resources/ckeditor/samples/toolbarconfigurator/font/fontello.svg Copyright (C) 2014 by original authors @ fontello.com PK!V*Labilian/web/resources/ckeditor/samples/toolbarconfigurator/font/fontello.ttf`OS/2=HVcmapDJcvt Ifpgm x; gaspglyf head,6hhea2VP$hmtx9tloca maxp ( name̝post%/Bprep|Vzz1PfEd@RjZ OD( $@!BhS D5+"'&4?6246732762:):*G*;*l;)*,w*$@!BhS D5+"/#"&5"/&4762*;(G*<*k<k4*w$&*;k /;CgI@F  [[ S C S Dfda^[YTROLIGA@4555553++"&546;2+"&546;2+"&546;2!3!2>3'&'#+#!"&'#"&=46;7>73232 $ $ $ $ $ $ H  64%0%45 ' ,,'  A  A  A d  eAS$ .DB. $ ]] s):_< DDq RjZFCh -nZ 55=DL T_ +g  j   - = M c Vs &Copyright (C) 2014 by original authors @ fontello.comfontelloRegularfontellofontelloVersion 1.0fontelloGenerated by svg2ttf from Fontello project.http://fontello.comCopyright (C) 2014 by original authors @ fontello.comfontelloRegularfontellofontelloVersion 1.0fontelloGenerated by svg2ttf from Fontello project.http://fontello.com down-bigup-bigtrash22  , `f-, d P&ZE[X!#!X PPX!@Y 8PX!8YY Ead(PX! E 0PX!0Y PX f a PX` PX! ` 6PX!6``YYY+YY#PXeYY-, E %ad CPX#B#B!!Y`-,#!#! dbB #B *! C +0%QX`PaRYX#Y! @SX+!@Y#PXeY-,C+C`B-,#B# #Bab`*-, E EcEb`D`-, E +#%` E#a d PX!0PX @YY#PXeY%#aDD`-,EaD- ,` CJPX #BY CJRX #BY- , b c#a C` ` #B#- ,KTXDY$ e#x- ,KQXKSXDY!Y$e#x- , CUX CaB +YC%B %B %B# %PXC`%B #a *!#a #a *!C`%B%a *!Y CG CG`b EcEb`#DC>C`B-,ETX #B `a  BB` +m+"Y-,+-,+-,+-,+-,+-,+-,+-,+-,+-, +-,+ETX #B `a  BB` +m+"Y-,+-,+-,+-,+-,+-,+- ,+-!,+-",+-#, +-$, <`-%, ` ` C#`C%a`$*!-&,%+%*-', G EcEb`#a8# UX G EcEb`#a8!Y-(,ETX'*0"Y-),+ETX'*0"Y-*, 5`-+,EcEb+EcEb+D>#8**-,, < G EcEb`Ca8--,.<-., < G EcEb`CaCc8-/,% . G#B%IG#G#a Xb!Y#B.*-0,%%G#G#aE+e.# <8-1,%% .G#G#a #BE+ `PX @QX  &YBB# C #G#G#a#F`Cb` + a C`d#CadPXCaC`Y%ba# &#Fa8#CF%CG#G#a` Cb`# +#C`+%a%b&a %`d#%`dPX!#!Y# &#Fa8Y-2, & .G#G#a#<8-3, #B F#G+#a8-4,%%G#G#aTX. <#!%%G#G#a %%G#G#a%%I%aEc# Xb!YcEb`#.# <8#!Y-5, C .G#G#a ` `fb# <8-6,# .F%FRX ,1+!# <#B#8&+C.&+-?, G#B.,*-@, G#B.,*-A,-*-B,/*-C,E# . F#a8&+-D,#BC+-E,<+-F,<+-G,<+-H,<+-I,=+-J,=+-K,=+-L,=+-M,9+-N,9+-O,9+-P,9+-Q,;+-R,;+-S,;+-T,;+-U,>+-V,>+-W,>+-X,>+-Y,:+-Z,:+-[,:+-\,:+-],2+.&+-^,2+6+-_,2+7+-`,2+8+-a,3+.&+-b,3+6+-c,3+7+-d,3+8+-e,4+.&+-f,4+6+-g,4+7+-h,4+8+-i,5+.&+-j,5+6+-k,5+7+-l,5+8+-m,+e$Px0-KRXYc #D#p( ERD *D$QX@XD&QXXDYYYYDPK!X X Mabilian/web/resources/ckeditor/samples/toolbarconfigurator/font/fontello.woffwOFF XOS/2DDV=Hcmap:Jcvt Ifpgm x;gaspglyf head46,hhea $2Vhmtx 9loca , maxp 8 (name Xw̝post /B%/prep VVxc`dcTŴB3>`0ddb``b`ef \S^0`bf2 7xc```f`Fp| ^0RDK0B#Èfxc`@F F70xUvVkBV}=$t,ϾG[g:F#*}kԡ=JI\u/ q]OI$JjP.X*Y'X' VOUg eIDD&I'g%I %PB5RաLЫq@FuXTC'5ԬF*W9F/{:1x~*?vJNTqԡV0_L*@bEt1=t:.JF((ST]q@f \JltD&RN5G\BPj~"N$FXqW B1 S9tEf]1Ja= ~ N$+gQHcugPK;2C" 3a U_4g@4K)JoLh T]6)iϚbSҞ32]}iGnV!7mi/ 7FnU:viRA4aV@֌4|i`.bDGu ri".><FݰƑ0FzYM.22L e@: `\xJCT;y_9.\wy Y rcRd-T'G+'UkC*({(^瓐=B[a#Li%^S(=RC,o)< Zĸujkz !pH)]ߴwkzr*QTFڼf2)UOQYiT49Okto8h=T|4A#U5(c45t1V~hb=OUK഻*[Fm䊟#1- ;bd ; Y&wmm?&߆ErW;yՓQ%wMvYף6GN-7r,`A1wiQetm8Wvͱtz.A #.}rv!ȹ99_C0 `;!xH9!!Hȹ '|M7FNd΢@8dFM` Fxc`d``f `FCh -nZ xuj@ҋB[Z足*Ji`7 Xtn-1$32_ЇKY(Mw9sd\đ 8Errb*,п[*n thOWrrrܳ\ƭx|BY`"RU܋ZmuFun:r*JXk*ʾqO-3bYE(}90kDJL7SlxZp׮Ku%1 Toolbar Configurator

    Toolbar Configurator Help

    Select configurator type

    What Am I Doing Here?

    Arrange toolbar groups, toggle button visibility according to your needs and get your toolbar configuration.

    You can replace the content of the config.js file with the generated configuration. If you already set some configuration options you will need to merge both configurations.

    Read more about different ways of setting configuration and do not forget about clearing browser cache.

    Arranging toolbar groups is the recommended way of configuring the toolbar, but if you need more freedom you can use the advanced configurator.

    CKEditor – The text editor for the Internet – http://ckeditor.com

    Copyright © 2003-2015, CKSource – Frederico Knabben. All rights reserved.

    PK!`_Z??Xabilian/web/resources/ckeditor/samples/toolbarconfigurator/js/abstracttoolbarmodifier.js"function"!=typeof Object.create&&function(){var b=function(){};Object.create=function(a){if(1
    ');b.ui.space("contents").append(c);c=b.editable(c);c.detach=CKEDITOR.tools.override(c.detach,function(a){return function(){a.apply(this,arguments);this.remove()}});b.setData(b.getData(1),a);b.fire("contentDom")});b.dataProcessor.toHtml=function(a){return a};b.dataProcessor.toDataFormat=function(a){return a}}}); Object.keys||(Object.keys=function(){var b=Object.prototype.hasOwnProperty,a=!{toString:null}.propertyIsEnumerable("toString"),c="toString toLocaleString valueOf hasOwnProperty isPrototypeOf propertyIsEnumerable constructor".split(" "),e=c.length;return function(d){if("object"!==typeof d&&("function"!==typeof d||null===d))throw new TypeError("Object.keys called on non-object");var g=[],f;for(f in d)b.call(d,f)&&g.push(f);if(a)for(f=0;fconfig',group:"edit",position:"right",cssClass:"button-a-background icon-pos-left icon-download",clickCallback:function(){this.state="config";this._showConfig();this.showToolbarBtnsByGroupName(this.state)}}];this.cachedActiveElement=null}var j=ToolbarConfigurator.AbstractToolbarModifier;ToolbarConfigurator.ToolbarModifier= d;d.prototype=Object.create(ToolbarConfigurator.AbstractToolbarModifier.prototype);d.prototype.getActualConfig=function(){var a=j.prototype.getActualConfig.call(this);if(a.toolbarGroups)for(var b=a.toolbarGroups.length,c=0;cCKEDITOR.editorConfig = function( config ) {\n",b?"\tconfig.toolbarGroups = ["+b+"\n\t];":"",c?"\n\n":"",c?"\tconfig.removeButtons = '"+c+"';":"","\n};"].join("");this.modifyContainer.addClass("hidden");this.configContainer.removeClass("hidden");this.configContainer.setHtml(a)};d.prototype._toggleVisibilityEmptyElements=function(){this.modifyContainer.hasClass("empty-visible")? (this.modifyContainer.removeClass("empty-visible"),this.emptyVisible=!1):(this.modifyContainer.addClass("empty-visible"),this.emptyVisible=!0);this._refreshMoveBtnsAvalibility()};d.prototype._createModifier=function(){function a(){b._highlightGroup(this.data("name"))}var b=this;j.prototype._createModifier.call(this);this.modifyContainer.setHtml(this._toolbarConfigToListString());var c=this.modifyContainer.find('li[data-type="group"]');this.modifyContainer.on("mouseleave",function(){this._dehighlightActiveToolGroup()}, this);for(var e=c.count(),f=0;f p > span > button.move.disabled"),e=c.count(),d=0;d li > ul"))}; d.prototype._refreshBtnTabIndexes=function(){for(var a=this.mainContainer.find('[data-tab="true"]'),b=a.count(),c=0;c")};d.prototype._getToolbarGroupString=function(a){var b=a.groups,c;c=""+['
  • "].join("");c+=d.getToolbarElementPreString(a)+"
      ";for(var a=b.length,e=0;e"};d.getToolbarSeparatorString=function(a){return['
    • ',d.getToolbarElementPreString("row separator"),"
    • "].join("")};d.getToolbarHeaderString=function(){return'
      • Toolbars

        • Toolbar groups

          Toolbar group items

      '};d.getFirstAncestor=function(a,b){for(var c=a.getParents(),d=c.length;d--;)if(b(c[d]))return c[d];return null};d.getFirstElementIndexWith= function(a,b,c,d){for(;"up"===c?b--:++b"].join("");c+=d.getToolbarElementPreString(a.name);c+="
        ";for(var e=b?b.length:0,f=0;f"};d.prototype._getConfigButtonName=function(a){var b=this.fullToolbarEditor.editorInstance.ui.items,c;for(c in b)if(b[c].name==a)return c;return null};d.prototype.isButtonRemoved=function(a){return-1!=CKEDITOR.tools.indexOf(this.removedButtons,this._getConfigButtonName(a))}; d.prototype.getButtonString=function(a){var b=this.isButtonRemoved(a.name)?"":'checked="checked"';return['
      • "].join("")};d.getToolbarElementPreString=function(a){a=a.name?a.name:a;return['

        ', "row separator"==a?'':"",a,"

        "].join("")};d.evaluateToolbarGroupsConfig=function(a){return a=function(a){var c={},d;try{d=eval("("+a+")")}catch(f){try{d=eval(a)}catch(g){return null}}return c.toolbarGroups&&"number"===typeof c.toolbarGroups.length?JSON.stringify(c):d&&"number"===typeof d.length?JSON.stringify({toolbarGroups:d}):d&&d.toolbarGroups?JSON.stringify(d):null}(a)};return d})();PK!)DDTabilian/web/resources/ckeditor/samples/toolbarconfigurator/js/toolbartextmodifier.js(function(){function e(a){j.call(this,a);this.hintContainer=this.codeContainer=null}var j=ToolbarConfigurator.AbstractToolbarModifier,g=ToolbarConfigurator.FullToolbarEditor;ToolbarConfigurator.ToolbarTextModifier=e;e.prototype=Object.create(j.prototype);e.prototype._onInit=function(a,d){j.prototype._onInit.call(this,void 0,d);this._createModifier(d?this.actualConfig:void 0);"function"===typeof a&&a(this.mainContainer)};e.prototype._createModifier=function(a){function d(a){var b=c(a);if(null!==b.charsBetween){var d= i.getUnusedButtonsArray(i.actualConfig.toolbar,!0,b.charsBetween),e=a.getCursor(),b=CodeMirror.Pos(e.line,e.ch-b.charsBetween.length),h=a.getTokenAt(e);"{"===a.getTokenAt({line:e.line,ch:h.start}).string&&(d=["name"]);if(0!==d.length)return new f(b,e,d)}}function f(a,c,b){this.from=a;this.to=c;this.list=b;this._handlers=[]}function c(a,c){var b={};b.cur=a.getCursor();b.tok=a.getTokenAt(b.cur);b["char"]=c||b.tok.string.charAt(b.tok.string.length-1);var d=a.getRange(CodeMirror.Pos(b.cur.line,0),b.cur).split("").reverse().join(""), d=d.replace(/(['|"]\w*['|"])/g,"");b.charsBetween=d.match(/(^\w*)(['|"])/);b.charsBetween&&(b.endChar=b.charsBetween[2],b.charsBetween=b.charsBetween[1].split("").reverse().join(""));return b}function b(a){setTimeout(function(){a.state.completionActive||CodeMirror.showHint(a,d,{hintsClass:"toolbar-modifier",completeSingle:!1})},100);return CodeMirror.Pass}var i=this;this._createToolbar();this.toolbarContainer&&this.mainContainer.append(this.toolbarContainer);j.prototype._createModifier.call(this); this._setupActualConfig(a);var a=this.actualConfig.toolbar,a=CKEDITOR.tools.isArray(a)?"\tconfig.toolbar = "+("[\n\t\t"+g.map(a,function(a){return j.stringifyJSONintoOneLine(a,{addSpaces:!0,noQuotesOnKey:!0,singleQuotes:!0})}).join(",\n\t\t")+"\n\t]")+";":"config.toolbar = [];",a=["CKEDITOR.editorConfig = function( config ) {\n",a,"\n};"].join(""),e=new CKEDITOR.dom.element("div");e.addClass("codemirror-wrapper");this.modifyContainer.append(e);this.codeContainer=CodeMirror(e.$,{mode:{name:"javascript", json:!0},lineNumbers:!1,lineWrapping:!0,viewportMargin:Infinity,value:a,smartIndent:!1,indentWithTabs:!0,indentUnit:4,tabSize:4,theme:"neo",extraKeys:{Left:b,Right:b,"'''":b,"'\"'":b,Backspace:b,Delete:b,"Shift-Tab":"indentLess"}});this.codeContainer.on("endCompletion",function(a,b){var d=c(a);void 0!==b&&a.replaceSelection(d.endChar)});this.codeContainer.on("change",function(){var a=i.codeContainer.getValue(),a=i._evaluateValue(a);null!==a?(i.actualConfig.toolbar=a.toolbar?a.toolbar:i.actualConfig.toolbar, i._fillHintByUnusedElements(),i._refreshEditor(),i.mainContainer.removeClass("invalid")):i.mainContainer.addClass("invalid")});this.hintContainer=new CKEDITOR.dom.element("div");this.hintContainer.addClass("toolbarModifier-hints");this._fillHintByUnusedElements();this.hintContainer.insertBefore(e)};e.prototype._fillHintByUnusedElements=function(){var a=this.getUnusedButtonsArray(this.actualConfig.toolbar,!0),a=this.groupButtonNamesByGroup(a),d=g.map(a,function(a){var b=g.map(a.buttons,function(a){return""+ a+" "}).join("");return["
        ",a.name,"
        ",b,"
        "].join("")}).join(" "),f='
        Toolbar group
        Unused items
        ';a.length||(f="

        All items are in use.

        ");this.codeContainer.refresh();this.hintContainer.setHtml("

        Unused toolbar items

        "+f+d+"
        ")};e.prototype.getToolbarGroupByButtonName=function(a){var d=this.fullToolbarEditor.buttonNamesByGroup,f;for(f in d)for(var c=d[f],b=c.length;b--;)if(a===c[b])return f; return null};e.prototype.getUnusedButtonsArray=function(a,d,f){var d=!0===d?!0:!1,c=e.mapToolbarCfgToElementsList(a),a=Object.keys(this.fullToolbarEditor.editorInstance.ui.items),a=g.filter(a,function(a){var d="-"===a,a=void 0===f||0===a.toLowerCase().indexOf(f.toLowerCase());return!d&&a}),a=g.filter(a,function(a){return-1==CKEDITOR.tools.indexOf(c,a)});d&&a.sort();return a};e.prototype.groupButtonNamesByGroup=function(a){var d=[],f=JSON.parse(JSON.stringify(this.fullToolbarEditor.buttonNamesByGroup)), c;for(c in f){var b=f[c],b=g.filter(b,function(b){return-1!==CKEDITOR.tools.indexOf(a,b)});b.length&&d.push({name:c,buttons:b})}return d};e.mapToolbarCfgToElementsList=function(a){function d(a){return"-"!==a}for(var f=[],c=a.length,b=0;b and others 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. PK!BXabilian/web/resources/ckeditor/samples/toolbarconfigurator/lib/codemirror/codemirror.css/* BASICS */ .CodeMirror { /* Set height, width, borders, and global font properties here */ font-family: monospace; height: 300px; color: black; } /* PADDING */ .CodeMirror-lines { padding: 4px 0; /* Vertical padding around content */ } .CodeMirror pre { padding: 0 4px; /* Horizontal padding of content */ } .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { background-color: white; /* The little square between H and V scrollbars */ } /* GUTTER */ .CodeMirror-gutters { border-right: 1px solid #ddd; background-color: #f7f7f7; white-space: nowrap; } .CodeMirror-linenumbers {} .CodeMirror-linenumber { padding: 0 3px 0 5px; min-width: 20px; text-align: right; color: #999; white-space: nowrap; } .CodeMirror-guttermarker { color: black; } .CodeMirror-guttermarker-subtle { color: #999; } /* CURSOR */ .CodeMirror div.CodeMirror-cursor { border-left: 1px solid black; } /* Shown when moving in bi-directional text */ .CodeMirror div.CodeMirror-secondarycursor { border-left: 1px solid silver; } .CodeMirror.cm-fat-cursor div.CodeMirror-cursor { width: auto; border: 0; background: #7e7; } .CodeMirror.cm-fat-cursor div.CodeMirror-cursors { z-index: 1; } .cm-animate-fat-cursor { width: auto; border: 0; -webkit-animation: blink 1.06s steps(1) infinite; -moz-animation: blink 1.06s steps(1) infinite; animation: blink 1.06s steps(1) infinite; } @-moz-keyframes blink { 0% { background: #7e7; } 50% { background: none; } 100% { background: #7e7; } } @-webkit-keyframes blink { 0% { background: #7e7; } 50% { background: none; } 100% { background: #7e7; } } @keyframes blink { 0% { background: #7e7; } 50% { background: none; } 100% { background: #7e7; } } /* Can style cursor different in overwrite (non-insert) mode */ div.CodeMirror-overwrite div.CodeMirror-cursor {} .cm-tab { display: inline-block; text-decoration: inherit; } .CodeMirror-ruler { border-left: 1px solid #ccc; position: absolute; } /* DEFAULT THEME */ .cm-s-default .cm-keyword {color: #708;} .cm-s-default .cm-atom {color: #219;} .cm-s-default .cm-number {color: #164;} .cm-s-default .cm-def {color: #00f;} .cm-s-default .cm-variable, .cm-s-default .cm-punctuation, .cm-s-default .cm-property, .cm-s-default .cm-operator {} .cm-s-default .cm-variable-2 {color: #05a;} .cm-s-default .cm-variable-3 {color: #085;} .cm-s-default .cm-comment {color: #a50;} .cm-s-default .cm-string {color: #a11;} .cm-s-default .cm-string-2 {color: #f50;} .cm-s-default .cm-meta {color: #555;} .cm-s-default .cm-qualifier {color: #555;} .cm-s-default .cm-builtin {color: #30a;} .cm-s-default .cm-bracket {color: #997;} .cm-s-default .cm-tag {color: #170;} .cm-s-default .cm-attribute {color: #00c;} .cm-s-default .cm-header {color: blue;} .cm-s-default .cm-quote {color: #090;} .cm-s-default .cm-hr {color: #999;} .cm-s-default .cm-link {color: #00c;} .cm-negative {color: #d44;} .cm-positive {color: #292;} .cm-header, .cm-strong {font-weight: bold;} .cm-em {font-style: italic;} .cm-link {text-decoration: underline;} .cm-strikethrough {text-decoration: line-through;} .cm-s-default .cm-error {color: #f00;} .cm-invalidchar {color: #f00;} .CodeMirror-composing { border-bottom: 2px solid; } /* Default styles for common addons */ div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} .CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } .CodeMirror-activeline-background {background: #e8f2ff;} /* STOP */ /* The rest of this file contains styles related to the mechanics of the editor. You probably shouldn't touch them. */ .CodeMirror { position: relative; overflow: hidden; background: white; } .CodeMirror-scroll { overflow: scroll !important; /* Things will break if this is overridden */ /* 30px is the magic margin used to hide the element's real scrollbars */ /* See overflow: hidden in .CodeMirror */ margin-bottom: -30px; margin-right: -30px; padding-bottom: 30px; height: 100%; outline: none; /* Prevent dragging from highlighting the element */ position: relative; } .CodeMirror-sizer { position: relative; border-right: 30px solid transparent; } /* The fake, visible scrollbars. Used to force redraw during scrolling before actuall scrolling happens, thus preventing shaking and flickering artifacts. */ .CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { position: absolute; z-index: 6; display: none; } .CodeMirror-vscrollbar { right: 0; top: 0; overflow-x: hidden; overflow-y: scroll; } .CodeMirror-hscrollbar { bottom: 0; left: 0; overflow-y: hidden; overflow-x: scroll; } .CodeMirror-scrollbar-filler { right: 0; bottom: 0; } .CodeMirror-gutter-filler { left: 0; bottom: 0; } .CodeMirror-gutters { position: absolute; left: 0; top: 0; z-index: 3; } .CodeMirror-gutter { white-space: normal; height: 100%; display: inline-block; margin-bottom: -30px; /* Hack to make IE7 behave */ *zoom:1; *display:inline; } .CodeMirror-gutter-wrapper { position: absolute; z-index: 4; height: 100%; } .CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; } .CodeMirror-gutter-wrapper { -webkit-user-select: none; -moz-user-select: none; user-select: none; } .CodeMirror-lines { cursor: text; min-height: 1px; /* prevents collapsing before first draw */ } .CodeMirror pre { /* Reset some styles that the rest of the page might have set */ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; border-width: 0; background: transparent; font-family: inherit; font-size: inherit; margin: 0; white-space: pre; word-wrap: normal; line-height: inherit; color: inherit; z-index: 2; position: relative; overflow: visible; -webkit-tap-highlight-color: transparent; } .CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; } .CodeMirror-linebackground { position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: 0; } .CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; } .CodeMirror-widget {} .CodeMirror-code { outline: none; } /* Force content-box sizing for the elements where we expect it */ .CodeMirror-scroll, .CodeMirror-sizer, .CodeMirror-gutter, .CodeMirror-gutters, .CodeMirror-linenumber { -moz-box-sizing: content-box; box-sizing: content-box; } .CodeMirror-measure { position: absolute; width: 100%; height: 0; overflow: hidden; visibility: hidden; } .CodeMirror-measure pre { position: static; } .CodeMirror div.CodeMirror-cursor { position: absolute; border-right: none; width: 0; } div.CodeMirror-cursors { visibility: hidden; position: relative; z-index: 3; } .CodeMirror-focused div.CodeMirror-cursors { visibility: visible; } .CodeMirror-selected { background: #d9d9d9; } .CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } .CodeMirror-crosshair { cursor: crosshair; } .CodeMirror ::selection { background: #d7d4f0; } .CodeMirror ::-moz-selection { background: #d7d4f0; } .cm-searching { background: #ffa; background: rgba(255, 255, 0, .4); } /* IE7 hack to prevent it from returning funny offsetTops on the spans */ .CodeMirror span { *vertical-align: text-bottom; } /* Used to force a border model for a node */ .cm-force-border { padding-right: .1px; } @media print { /* Hide the cursor when printing */ .CodeMirror div.CodeMirror-cursors { visibility: hidden; } } /* See issue #2901 */ .cm-tab-wrap-hack:after { content: ''; } /* Help users use markselection to safely style text background */ span.CodeMirror-selectedtext { background: none; } PK!8| IIWabilian/web/resources/ckeditor/samples/toolbarconfigurator/lib/codemirror/codemirror.js(function(m){if("object"==typeof exports&&"object"==typeof module)module.exports=m();else{if("function"==typeof define&&define.amd)return define([],m);this.CodeMirror=m()}})(function(){function m(a,b){if(!(this instanceof m))return new m(a,b);this.options=b=b?S(b):{};S(jf,b,!1);rc(b);var c=b.value;"string"==typeof c&&(c=new M(c,b.mode));this.doc=c;var d=new m.inputStyles[b.inputStyle](this),d=this.display=new kf(a,c,d);d.wrapper.CodeMirror=this;sd(this);td(this);b.lineWrapping&&(this.display.wrapper.className+= " CodeMirror-wrap");b.autofocus&&!Xa&&d.input.focus();ud(this);this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,draggingText:!1,highlight:new Ya,keySeq:null,specialChars:null};var e=this;y&&11>z&&setTimeout(function(){e.display.input.reset(true)},20);lf(this);vd||(mf(),vd=!0);Fa(this);this.curOp.forceUpdate=!0;wd(this,c);b.autofocus&&!Xa||e.hasFocus()?setTimeout(Za(sc,this),20):$a(this);for(var f in Ga)if(Ga.hasOwnProperty(f))Ga[f](this, b[f],xd);yd(this);b.finishInit&&b.finishInit(this);for(c=0;cz&&(this.gutters.style.zIndex=-1,this.scroller.style.paddingRight= 0);if(!E&&(!sa||!Xa))this.scroller.draggable=!0;a&&(a.appendChild?a.appendChild(this.wrapper):a(this.wrapper));this.reportedViewFrom=this.reportedViewTo=this.viewFrom=this.viewTo=b.first;this.view=[];this.externalMeasured=this.renderedView=null;this.lastWrapHeight=this.lastWrapWidth=this.viewOffset=0;this.updateLineNumbers=null;this.nativeBarWidth=this.barHeight=this.barWidth=0;this.scrollbarsClipped=!1;this.lineNumWidth=this.lineNumInnerWidth=this.lineNumChars=null;this.alignWidgets=!1;this.maxLine= this.cachedCharWidth=this.cachedTextHeight=this.cachedPaddingH=null;this.maxLineLength=0;this.maxLineChanged=!1;this.wheelDX=this.wheelDY=this.wheelStartX=this.wheelStartY=null;this.shift=!1;this.activeTouch=this.selForContextMenu=null;c.init(this)}function uc(a){a.doc.mode=m.getMode(a.options,a.doc.modeOption);ab(a)}function ab(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null);a.styles&&(a.styles=null)});a.doc.frontier=a.doc.first;bb(a,100);a.state.modeGen++;a.curOp&&N(a)}function Ad(a){var b= ta(a.display),c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/cb(a.display)-3);return function(e){if(ua(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;gb.maxLineLength&&(b.maxLineLength=d,b.maxLine=a)})}function rc(a){var b=G(a.gutters,"CodeMirror-linenumbers");-1==b&&a.lineNumbers?a.gutters=a.gutters.concat(["CodeMirror-linenumbers"]): -1z&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}function Ac(){}function ud(a){a.display.scrollbars&& (a.display.scrollbars.clear(),a.display.scrollbars.addClass&&gb(a.display.wrapper,a.display.scrollbars.addClass));a.display.scrollbars=new m.scrollbarModel[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller);p(b,"mousedown",function(){a.state.focused&&setTimeout(function(){a.display.input.focus()},0)});b.setAttribute("cm-not-content","true")},function(b,c){c=="horizontal"?Ia(a,b):hb(a,b)},a);a.display.scrollbars.addClass&&ib(a.display.wrapper,a.display.scrollbars.addClass)} function Ja(a,b){b||(b=fb(a));var c=a.display.barWidth,d=a.display.barHeight;Bd(a,b);for(var e=0;4>e&&c!=a.display.barWidth||d!=a.display.barHeight;e++)c!=a.display.barWidth&&a.options.lineWrapping&&Hb(a),Bd(a,fb(a)),c=a.display.barWidth,d=a.display.barHeight}function Bd(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+"px";c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+"px";d.right&&d.bottom?(c.scrollbarFiller.style.display="block",c.scrollbarFiller.style.height= d.bottom+"px",c.scrollbarFiller.style.width=d.right+"px"):c.scrollbarFiller.style.display="";d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display="block",c.gutterFiller.style.height=d.bottom+"px",c.gutterFiller.style.width=b.gutterWidth+"px"):c.gutterFiller.style.display=""}function Bc(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop,d=Math.floor(d-a.lineSpace.offsetTop),e=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,d=xa(b,d), e=xa(b,e);if(c&&c.ensure){var f=c.ensure.from.line,c=c.ensure.to.line;f=e&&(d=xa(b,ga(r(b,c))-a.wrapper.clientHeight),e=c)}return{from:d,to:Math.max(e,d+1)}}function wc(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=Cc(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+"px",g=0;g=c.viewFrom&&b.visible.to<=c.viewTo&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo)&&c.renderedView==c.view&&0==Cd(a))return!1;yd(a)&&(ma(a),b.dims=Dc(a));var e=d.first+d.size,f=Math.max(b.visible.from-a.options.viewportMargin,d.first),g=Math.min(e,b.visible.to+a.options.viewportMargin);c.viewFromf-c.viewFrom&&(f=Math.max(d.first, c.viewFrom));c.viewTo>g&&20>c.viewTo-g&&(g=Math.min(e,c.viewTo));na&&(f=Fc(a.doc,f),g=Dd(a.doc,g));d=f!=c.viewFrom||g!=c.viewTo||c.lastWrapHeight!=b.wrapperHeight||c.lastWrapWidth!=b.wrapperWidth;e=a.display;0==e.view.length||f>=e.viewTo||g<=e.viewFrom?(e.view=Jb(a,f,g),e.viewFrom=f):(e.viewFrom>f?e.view=Jb(a,f,e.viewFrom).concat(e.view):e.viewFromg&&(e.view=e.view.slice(0,ya(a,g)));e.viewTo= g;c.viewOffset=ga(r(a.doc,c.viewFrom));a.display.mover.style.top=c.viewOffset+"px";g=Cd(a);if(!d&&0==g&&!b.force&&c.renderedView==c.view&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo))return!1;f=aa();4=a.display.viewFrom&&b.visible.to<=a.display.viewTo)break;if(!Ec(a,b))break;Hb(a);d=fb(a);jb(a);Hc(a,d);Ja(a,d)}b.signal(a,"update",a);if(a.display.viewFrom!=a.display.reportedViewFrom|| a.display.viewTo!=a.display.reportedViewTo)b.signal(a,"viewportChange",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo}function Ic(a,b){var c=new Ib(a,b);if(Ec(a,c)){Hb(a);Ed(a,c);var d=fb(a);jb(a);Hc(a,d);Ja(a,d);c.finish()}}function Hc(a,b){a.display.sizer.style.minHeight=b.docHeight+"px";var c=b.docHeight+a.display.barHeight;a.display.heightForcer.style.top=c+"px";a.display.gutters.style.height=Math.max(c+$(a),b.clientHeight)+ "px"}function Hb(a){for(var a=a.display,b=a.lineDiv.offsetTop,c=0;cz){var f=d.node.offsetTop+d.node.offsetHeight;e=f-b;b=f}else e=d.node.getBoundingClientRect(),e=e.bottom-e.top;f=d.line.height-e;2>e&&(e=ta(a));if(0.001f)if(Z(d.line,e),Fd(d.line),d.rest)for(e=0;ez&&(a.node.style.zIndex=2));return a.node}function Hd(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):Kd(a,b)}function Jc(a){var b=a.bgClass?a.bgClass+" "+(a.line.bgClass||""):a.line.bgClass;b&&(b+=" CodeMirror-linebackground"); if(a.background)b?a.background.className=b:(a.background.parentNode.removeChild(a.background),a.background=null);else if(b){var c=Kb(a);a.background=c.insertBefore(q("div",null,b),c.firstChild)}a.line.wrapClass?Kb(a).className=a.line.wrapClass:a.node!=a.text&&(a.node.className="");a.text.className=(a.textClass?a.textClass+" "+(a.line.textClass||""):a.line.textClass)||""}function Id(a,b,c,d){b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null);var e=b.line.gutterMarkers;if(a.options.lineNumbers|| e){var f=Kb(b),g=b.gutter=q("div",null,"CodeMirror-gutter-wrapper","left: "+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+"px; width: "+d.gutterTotalWidth+"px");a.display.input.setUneditable(g);f.insertBefore(g,b.text);b.line.gutterClass&&(g.className+=" "+b.line.gutterClass);if(a.options.lineNumbers&&(!e||!e["CodeMirror-linenumbers"]))b.lineNumber=g.appendChild(q("div",""+a.options.lineNumberFormatter(c+a.options.firstLineNumber),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+d.gutterLeft["CodeMirror-linenumbers"]+ "px; width: "+a.display.lineNumInnerWidth+"px"));if(e)for(b=0;bv(a,b)?b:a}function Mb(a,b){return 0>v(a,b)?a:b}function Md(a){a.state.focused||(a.display.input.focus(),sc(a))}function Nb(a){return a.options.readOnly||a.doc.cantEdit}function Kc(a,b,c,d,e){var f=a.doc;a.display.shift=!1;d||(d=f.sel);var g=oa(b),h=null;a.state.pasteIncoming&&1j.head.ch&&(!i||d.ranges[i-1].head.line!=j.head.line)){j=a.getModeAt(j.head);k=pa(k);n=!1;if(j.electricChars)for(var s=0;se?i.map:j[e],g=0;ge?a.line:a.rest[e]);e=f[g]+d;if(0>d||h!=b)e=f[g+(d?1:0)];return o(c,e)}}}var e=a.text.firstChild,f=!1;if(!b||!Oc(e,b))return Na(o(C(a.line),0),!0);if(b==e&&(f=!0,b=e.childNodes[c],c=0,!b))return c=a.rest?x(a.rest):a.line,Na(o(C(c),c.text.length),f);var g=3==b.nodeType?b:null,h=b;!g&&(1==b.childNodes.length&& 3==b.firstChild.nodeType)&&(g=b.firstChild,c&&(c=g.nodeValue.length));for(;h.parentNode!=e;)h=h.parentNode;var i=a.measure,j=i.maps;if(b=d(g,h,c))return Na(b,f);e=h.nextSibling;for(g=g?g.nodeValue.length-c:0;e;e=e.nextSibling){if(b=d(e,e.firstChild,0))return Na(o(b.line,b.ch-g),f);g+=e.textContent.length}h=h.previousSibling;for(g=c;h;h=h.previousSibling){if(b=d(h,h.firstChild,-1))return Na(o(b.line,b.ch+g),f);g+=e.textContent.length}}function qf(a,b,c,d,e){function f(a){return function(b){return b.id== a}}function g(b){if(1==b.nodeType){var c=b.getAttribute("cm-text");if(null!=c)""==c&&(c=b.textContent.replace(/\u200b/g,"")),h+=c;else{var c=b.getAttribute("cm-marker"),n;if(c){if(b=a.findMarks(o(d,0),o(e+1,0),f(+c)),b.length&&(n=b[0].find()))h+=za(a.doc,n.from,n.to).join("\n")}else if("false"!=b.getAttribute("contenteditable")){for(n=0;nc)return o(c,r(a,c).text.length);var c=r(a,b.line).text.length,d=b.ch,c=null==d||d>c?o(b.line,c):0>d?o(b.line,0):b;return c}function mb(a,b){return b>=a.first&&bv(c,a),b!=0>v(d,a)?(a=c,c=d):b!=0>v(c,d)&&(c=d)),new w(a,c)):new w(d||c,c)}function Qb(a,b,c,d){A(a,new ha([nb(a,a.sel.primary(),b,c)],0),d)}function Td(a, b,c){for(var d=[],e=0;ev(b.primary().head,a.sel.primary().head)?-1:1);Wd(a,Xd(a,b,d,!0));!(c&&!1===c.scroll)&&a.cm&&La(a.cm)}function Wd(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput=a.cm.curOp.selectionChanged=!0,Yd(a.cm)),H(a,"cursorActivity",a))}function Zd(a){Wd(a,Xd(a,a.sel,null, !1),ca)}function Xd(a,b,c,d){for(var e,f=0;f=f.ch: j.to>f.ch))){if(d&&(F(k,"beforeCursorEnter"),k.explicitlyCleared))if(h.markedSpans){--i;continue}else break;if(k.atomic){i=k.find(0>g?-1:1);if(0==v(i,f)&&(i.ch+=g,0>i.ch?i=i.line>a.first?t(a,o(i.line-1)):null:i.ch>h.text.length&&(i=i.lineb&&(b=0);b=Math.round(b);d=Math.round(d);h.appendChild(q("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px; top: "+b+"px; width: "+(null==c?k-a:c)+"px; height: "+(d-b)+"px"))}function e(b,c,e){var f=r(g,b),h=f.text.length,i,n;tf(V(f), c||0,null==e?h:e,function(g,m,q){var r=Ub(a,o(b,g),"div",f,"left"),p,t;g==m?(p=r,q=t=r.left):(p=Ub(a,o(b,m-1),"div",f,"right"),"rtl"==q&&(q=r,r=p,p=q),q=r.left,t=p.right);null==c&&0==g&&(q=j);3n.bottom||p.bottom==n.bottom&&p.right>n.right)n=p;qa.options.cursorBlinkRate&&(b.cursorDiv.style.visibility="hidden")}}function bb(a,b){a.doc.mode.startState&&a.doc.frontier=a.display.viewTo)){var c=+new Date+ a.options.workTime,d=Oa(b.mode,ob(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,a.display.viewTo+500),function(f){if(b.frontier>=a.display.viewFrom){var g=f.styles,h=be(a,f,d,true);f.styles=h.styles;var i=f.styleClasses;if(h=h.classes)f.styleClasses=h;else if(i)f.styleClasses=null;i=!g||g.length!=f.styles.length||i!=h&&(!i||!h||i.bgClass!=h.bgClass||i.textClass!=h.textClass);for(h=0;!i&&hc){bb(a,a.options.workDelay);return true}});e.length&&Q(a,function(){for(var b=0;bg;--b){if(b<=f.first)return f.first;var h=r(f,b-1);if(h.stateAfter&&(!c||b<=f.frontier))return b;h=X(h.text,null,a.options.tabSize);if(null==e||d>h)e=b-1,d=h}return e}function ob(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!0; var f=vf(a,b,c),g=f>d.first&&r(d,f-1).stateAfter,g=g?Oa(d.mode,g):wf(d.mode);d.iter(f,b,function(c){Rc(a,c.text,g);c.stateAfter=f==b-1||0==f%5||f>=e.viewFrom&&fc)return{map:a.measure.maps[d],cache:a.measure.caches[d],before:!0}} function Nc(a,b){if(b>=a.display.viewFrom&&b=c.lineN&&bk;k++){for(;h&&pb(b.line.text.charAt(i.coverStart+h));)--h;for(;i.coverStart+jz&&0==h&&j==i.coverEnd-i.coverStart)l=d.parentNode.getBoundingClientRect();else if(y&&a.options.lineWrapping){var s=Aa(d,h,j).getClientRects();l=s.length?s["right"==g?s.length-1:0]:Tc}else l=Aa(d,h,j).getBoundingClientRect()||Tc;if(l.left||l.right||0==h)break;j= h;h-=1;c="right"}if(y&&11>z){if(!(s=!window.screen))if(!(s=null==screen.logicalXDPI))if(!(s=screen.logicalXDPI==screen.deviceXDPI))null!=Uc?s=Uc:(k=R(a.display.measure,q("span","x")),s=k.getBoundingClientRect(),k=Aa(k,0,1).getBoundingClientRect(),s=Uc=1z&&!h&&(!l||!l.left&&!l.right))l=(l=d.parentNode.getClientRects()[0])?{left:l.left,right:l.left+cb(a.display),top:l.top,bottom:l.bottom}:Tc;s=l.top-b.rect.top;d=l.bottom-b.rect.top;h=(s+d)/2;g=b.view.measure.heights;for(k=0;kb)f=j-i,e=f-1,b>=j&&(g="right");if(null!=e){d=a[h+2];if(i==j&&c==(d.insertLeft?"left":"right"))g=c;if("left"==c&&0==e)for(;h&&a[h-2]==a[h-3]&&a[h-1].insertLeft;)d=a[(h-=3)+2],g="left";if("right"==c&&e==j-i)for(;h< a.length-3&&a[h+3]==a[h+4]&&!a[h+5].insertLeft;)d=a[(h+=3)+2],g="right";break}}return{node:d,start:e,end:f,collapse:g,coverStart:i,coverEnd:j}}function de(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,a.rest))for(var b=0;bc.from? g(a-1):g(a,d)}d=d||r(a.doc,b.line);e||(e=Vb(a,d));var i=V(d),b=b.ch;if(!i)return g(b);var j=Ob(i,b),j=h(b,j);null!=rb&&(j.other=h(b,rb));return j}function ge(a,b){var c=0,b=t(a.doc,b);a.options.lineWrapping||(c=cb(a.display)*b.ch);var d=r(a.doc,b.line),e=ga(d)+a.display.lineSpace.offsetTop;return{left:c,right:c,top:e,bottom:e+d.height}}function Wb(a,b,c,d){a=o(a,b);a.xRel=d;c&&(a.outside=!0);return a}function Xc(a,b,c){var d=a.doc,c=c+a.display.viewOffset;if(0>c)return Wb(d.first,0,!0,-1);var e=xa(d, c),f=d.first+d.size-1;if(e>f)return Wb(d.first+d.size-1,r(d,f).text.length,!0,1);0>b&&(b=0);for(d=r(d,e);;)if(e=xf(a,d,e,b,c),f=(d=wa(d,!1))&&d.find(0,!0),d&&(e.ch>f.from.ch||e.ch==f.from.ch&&0d.bottom)return d.left-i;if(gm)return Wb(c,l,q,1);for(;;){if(k?l==e||l==Yc(b,e,1):1>=l-e){k=dd?-1:1d){l=p;m=t;if(q=h)m+=1E3;n=r}else e=p,s=t,I=h,n-=r}}function ta(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==Ba){Ba=q("pre");for(var b=0;49>b;++b)Ba.appendChild(document.createTextNode("x")),Ba.appendChild(q("br"));Ba.appendChild(document.createTextNode("x"))}R(a.measure, Ba);b=Ba.offsetHeight/50;3=d.viewTo)|| d.maxLineChanged&&c.options.lineWrapping;e.update=e.mustUpdate&&new Ib(c,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}for(b=0;bj;j++){var k=!1,n=ia(c,h),l=!g||g==h?n:ia(c,g),l=Zb(c,Math.min(n.left,l.left),Math.min(n.top,l.top)-i,Math.max(n.left,l.left),Math.max(n.bottom,l.bottom)+i),s=c.doc.scrollTop,I=c.doc.scrollLeft;null!=l.scrollTop&&(hb(c,l.scrollTop),1g.top+j.top)h=!0;else if(g.bottom+j.top>(window.innerHeight||document.documentElement.clientHeight))h=!1;null!=h&&!zf&&(g=q("div","​",null,"position: absolute; top: "+(g.top-i.viewOffset-c.display.lineSpace.offsetTop)+"px; height: "+(g.bottom-g.top+$(c)+i.barHeight)+"px; left: "+g.left+"px; width: 2px;"),c.display.lineSpace.appendChild(g),g.scrollIntoView(h),c.display.lineSpace.removeChild(g))}}h=e.maybeHiddenMarkers;g=e.maybeUnhiddenMarkers;if(h)for(i=0;ib))e.updateLineNumbers=b;a.curOp.viewChanged=!0;if(b>=e.viewTo)na&&Fc(a.doc,b)e.viewFrom?ma(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)ma(a);else if(b<=e.viewFrom){var f=$b(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):ma(a)}else if(c>= e.viewTo)(f=$b(a,b,b,-1))?(e.view=e.view.slice(0,f.index),e.viewTo=f.lineN):ma(a);else{var f=$b(a,b,b,-1),g=$b(a,c,c+d,1);f&&g?(e.view=e.view.slice(0,f.index).concat(Jb(a,f.lineN,g.lineN)).concat(e.view.slice(g.index)),e.viewTo+=d):ma(a)}if(a=e.externalMeasured)c=e.lineN&&b=d.viewTo|| (a=d.view[ya(a,b)],null!=a.node&&(a=a.changes||(a.changes=[]),-1==G(a,c)&&a.push(c)))}function ma(a){a.display.viewFrom=a.display.viewTo=a.doc.first;a.display.view=[];a.display.viewOffset=0}function ya(a,b){if(b>=a.display.viewTo)return null;b-=a.display.viewFrom;if(0>b)return null;for(var c=a.display.view,d=0;db)return d}function $b(a,b,c,d){var e=ya(a,b),f=a.display.view;if(!na||c==a.doc.first+a.doc.size)return{index:e,lineN:c};for(var g=0,h=a.display.viewFrom;g< e;g++)h+=f[g].size;if(h!=b){if(0d?0:f.length-1))return null;c+=d*f[e-(0>d?1:0)].size;e+=d}return{index:e,lineN:c}}function Cd(a){for(var a=a.display.view,b=0,c=0;cz?p(d.scroller,"dblclick",B(a,function(b){if(!ea(a,b)){var c=Qa(a,b);c&&(!Zc(a,b,"gutterClick",!0,H)&&!ka(a.display,b))&&(L(b),b=a.findWordAt(c),Qb(a.doc,b.anchor,b.head))}})):p(d.scroller,"dblclick",function(b){ea(a,b)||L(b)});$c||p(d.scroller,"contextmenu",function(b){ie(a,b)});var e,f={end:0};p(d.scroller,"touchstart",function(a){var b;1!=a.touches.length?b=!1:(b=a.touches[0],b=1>=b.radiusX&& 1>=b.radiusY);b||(clearTimeout(e),b=+new Date,d.activeTouch={start:b,moved:!1,prev:300>=b-f.end?f:null},1==a.touches.length&&(d.activeTouch.left=a.touches[0].pageX,d.activeTouch.top=a.touches[0].pageY))});p(d.scroller,"touchmove",function(){d.activeTouch&&(d.activeTouch.moved=!0)});p(d.scroller,"touchend",function(e){var f=d.activeTouch;if(f&&!ka(d,e)&&null!=f.left&&!f.moved&&300>new Date-f.start){var g=a.coordsChar(d.activeTouch,"page"),f=!f.prev||c(f,f.prev)?new w(g,g):!f.prev.prev||c(f,f.prev.prev)? a.findWordAt(g):new w(o(g.line,0),t(a.doc,o(g.line+1,0)));a.setSelection(f.anchor,f.head);a.focus();L(e)}b()});p(d.scroller,"touchcancel",b);p(d.scroller,"scroll",function(){d.scroller.clientHeight&&(hb(a,d.scroller.scrollTop),Ia(a,d.scroller.scrollLeft,!0),F(a,"scroll",a))});p(d.scroller,"mousewheel",function(b){je(a,b)});p(d.scroller,"DOMMouseScroll",function(b){je(a,b)});p(d.wrapper,"scroll",function(){d.wrapper.scrollTop=d.wrapper.scrollLeft=0});d.dragFunctions={simple:function(b){ea(a,b)||ad(b)}, start:function(b){if(y&&(!a.state.draggingText||100>+new Date-ke))ad(b);else if(!ea(a,b)&&!ka(a.display,b)&&(b.dataTransfer.setData("Text",a.getSelection()),b.dataTransfer.setDragImage&&!le)){var c=q("img",null,null,"position: fixed; left: 0; top: 0;");c.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";Y&&(c.width=c.height=1,a.display.wrapper.appendChild(c),c._top=c.offsetTop);b.dataTransfer.setDragImage(c,0,0);Y&&c.parentNode.removeChild(c)}},drop:B(a,Af)};var g=d.input.getField(); p(g,"keyup",function(b){me.call(a,b)});p(g,"keydown",B(a,ne));p(g,"keypress",B(a,oe));p(g,"focus",Za(sc,a));p(g,"blur",Za($a,a))}function Bf(a){var b=a.display;b.lastWrapHeight==b.wrapper.clientHeight&&b.lastWrapWidth==b.wrapper.clientWidth||(b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize())}function ka(a,b){for(var c=b.target||b.srcElement;c!=a.wrapper;c=c.parentNode)if(!c||1==c.nodeType&&"true"==c.getAttribute("cm-ignore-events")||c.parentNode==a.sizer&& c!=a.mover)return!0}function Qa(a,b,c,d){var e=a.display;if(!c&&"true"==(b.target||b.srcElement).getAttribute("cm-not-content"))return null;var f,g,c=e.lineSpace.getBoundingClientRect();try{f=b.clientX-c.left,g=b.clientY-c.top}catch(h){return null}var b=Xc(a,f,g),i;if(d&&1==b.xRel&&(i=r(a.doc,b.line).text).length==b.ch)d=X(i,i.length,a.options.tabSize)-i.length,b=o(b.line,Math.max(0,Math.round((f-ae(a.display).left)/cb(a.display))-d));return b}function he(a){var b=this.display;if(!(b.activeTouch&& b.input.supportsTouch()||ea(this,a)))if(b.shift=a.shiftKey,ka(b,a))E||(b.scroller.draggable=!1,setTimeout(function(){b.scroller.draggable=!0},100));else if(!Zc(this,a,"gutterClick",!0,H)){var c=Qa(this,a);window.focus();switch(pe(a)){case 1:c?Cf(this,a,c):(a.target||a.srcElement)==b.scroller&&L(a);break;case 2:E&&(this.state.lastMiddleDown=+new Date);c&&Qb(this.doc,c);setTimeout(function(){b.input.focus()},20);L(a);break;case 3:$c?ie(this,a):Df(this)}}}function Cf(a,b,c){y?setTimeout(Za(Md,a),0): a.curOp.focus=aa();var d=+new Date,e;ac&&ac.time>d-400&&0==v(ac.pos,c)?e="triple":bc&&bc.time>d-400&&0==v(bc.pos,c)?(e="double",ac={time:d,pos:c}):(e="single",bc={time:d,pos:c});var d=a.doc.sel,f=T?b.metaKey:b.ctrlKey,g;a.options.dragDrop&&Ef&&!Nb(a)&&"single"==e&&-1<(g=d.contains(c))&&!d.ranges[g].empty()?Ff(a,b,c,f):Gf(a,b,c,e,f)}function Ff(a,b,c,d){var e=a.display,f=+new Date,g=B(a,function(h){E&&(e.scroller.draggable=!1);a.state.draggingText=!1;fa(document,"mouseup",g);fa(e.scroller,"drop",g); 10>Math.abs(b.clientX-h.clientX)+Math.abs(b.clientY-h.clientY)&&(L(h),!d&&+new Date-200q&&e.push(new w(o(h,q),o(h,qe(I,g,f))))}e.length||e.push(new w(c,c));A(j,W(l.ranges.slice(0,n).concat(e),n),{origin:"*mouse",scroll:!1});a.scrollIntoView(b)}else e=k,f=e.anchor,i=b,"single"!=d&&(b="double"==d?a.findWordAt(b):new w(o(b.line,0),t(j,o(b.line+1,0))),0=h.to||e.lineq.bottom?20:0;k&&setTimeout(B(a,function(){u==c&&(i.scroller.scrollTop+=k,g(b))}),50)}}function h(a){u=Infinity;L(a);i.input.focus();fa(document,"mousemove",y);fa(document,"mouseup",x);j.history.lastSelOrigin= null}var i=a.display,j=a.doc;L(b);var k,n,l=j.sel,s=l.ranges;e&&!b.shiftKey?(n=j.sel.contains(c),k=-1=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&L(b);var d=a.display,i=d.lineDiv.getBoundingClientRect(); if(g>i.bottom||!P(a,c))return cd(b);g-=i.top-d.viewOffset;for(i=0;i=f)return f=xa(a.doc,g),e(a,c,a,f,a.options.gutters[i],b),cd(b)}}function Af(a){var b=this;if(!ea(b,a)&&!ka(b.display,a)){L(a);y&&(ke=+new Date);var c=Qa(b,a,!0),d=a.dataTransfer.files;if(c&&!Nb(b))if(d&&d.length&&window.FileReader&&window.File)for(var e=d.length,f=Array(e),g=0,a=function(a,d){var h=new FileReader;h.onload=B(b,function(){f[d]= h.result;if(++g==e){c=t(b.doc,c);var a={from:c,to:c,text:oa(f.join("\n")),origin:"paste"};Ka(b.doc,a);Ud(b.doc,ba(c,pa(a)))}});h.readAsText(a)},h=0;hMath.abs(a.doc.scrollTop-b)||(a.doc.scrollTop=b,sa||Ic(a,{top:b}),a.display.scroller.scrollTop!=b&&(a.display.scroller.scrollTop=b),a.display.scrollbars.setScrollTop(b),sa&&Ic(a),bb(a,100))}function Ia(a,b,c){if(!(c?b==a.doc.scrollLeft:2>Math.abs(a.doc.scrollLeft-b)))b=Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth),a.doc.scrollLeft=b,wc(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft= b),a.display.scrollbars.setScrollLeft(b)}function je(a,b){var c=re(b),d=c.x,c=c.y,e=a.display,f=e.scroller;if(d&&f.scrollWidth>f.clientWidth||c&&f.scrollHeight>f.clientHeight){if(c&&T&&E){var g=b.target,h=e.view;a:for(;g!=f;g=g.parentNode)for(var i=0;ig?h=Math.max(0,h+g-50):i=Math.min(a.doc.height,i+g+50),Ic(a,{top:h,bottom:i})),20>cc)null==e.wheelStartX?(e.wheelStartX=f.scrollLeft,e.wheelStartY=f.scrollTop,e.wheelDX=d,e.wheelDY=c,setTimeout(function(){if(e.wheelStartX!=null){var a=f.scrollLeft-e.wheelStartX,b=f.scrollTop-e.wheelStartY,a=b&&e.wheelDY&&b/e.wheelDY||a&&e.wheelDX&&a/e.wheelDX;e.wheelStartX=e.wheelStartY=null;if(a){O=(O*cc+a)/(cc+1);++cc}}}, 200)):(e.wheelDX+=d,e.wheelDY+=c)}}function dc(a,b,c){if("string"==typeof b&&(b=ec[b],!b))return!1;a.display.input.ensurePolled();var d=a.display.shift,e=!1;try{Nb(a)&&(a.state.suppressEdits=!0),c&&(a.display.shift=!1),e=b(a)!=se}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function Hf(a,b,c){for(var d=0;dz&&27==a.keyCode)&&(a.returnValue=!1);var b=a.keyCode;this.display.shift=16==b||a.shiftKey;var c=te(this,a);Y&&(dd=c?b:null,!c&&(88==b&&!ue&&(T?a.metaKey:a.ctrlKey))&&this.replaceSelection("",null,"cut"));18==b&&!/\bCodeMirror-crosshair\b/.test(this.display.lineDiv.className)&&Mf(this)}}function Mf(a){function b(a){if(18== a.keyCode||!a.altKey)gb(c,"CodeMirror-crosshair"),fa(document,"keyup",b),fa(document,"mouseover",b)}var c=a.display.lineDiv;ib(c,"CodeMirror-crosshair");p(document,"keyup",b);p(document,"mouseover",b)}function me(a){16==a.keyCode&&(this.doc.sel.shift=!1);ea(this,a)}function oe(a){if(!ka(this.display,a)&&!ea(this,a)&&!(a.ctrlKey&&!a.altKey||T&&a.metaKey)){var b=a.keyCode,c=a.charCode;if(Y&&b==dd)dd=null,L(a);else if(!Y||a.which&&!(10>a.which)||!te(this,a))if(b=String.fromCharCode(null==c?b:c),!Lf(this, a,b))this.display.input.onKeyPress(a)}}function Df(a){a.state.delayingBlurEvent=!0;setTimeout(function(){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1,$a(a))},100)}function sc(a){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1);"nocursor"!=a.options.readOnly&&(a.state.focused||(F(a,"focus",a),a.state.focused=!0,ib(a.display.wrapper,"CodeMirror-focused"),!a.curOp&&a.display.selForContextMenu!=a.doc.sel&&(a.display.input.reset(),E&&setTimeout(function(){a.display.input.reset(true)}, 20)),a.display.input.receivedFocus()),Qc(a))}function $a(a){a.state.delayingBlurEvent||(a.state.focused&&(F(a,"blur",a),a.state.focused=!1,gb(a.display.wrapper,"CodeMirror-focused")),clearInterval(a.display.blinker),setTimeout(function(){if(!a.state.focused)a.display.shift=false},150))}function ie(a,b){var c;if(!(c=ka(a.display,b)))c=P(a,"gutterContextMenu")?Zc(a,b,"gutterContextMenu",!1,F):!1;if(!c)a.display.input.onContextMenu(b)}function ve(a,b){if(0>v(a,b.from))return a;if(0>=v(a,b.to))return pa(b); var c=a.line+b.text.length-(b.to.line-b.from.line)-1,d=a.ch;a.line==b.to.line&&(d+=pa(b).ch-b.to.ch);return o(c,d)}function ed(a,b){for(var c=[],d=0;da.lastLine())){if(b.from.linee&&(b={from:b.from,to:o(e,r(a,e).text.length),text:[b.text[0]],origin:b.origin});b.removed=za(a,b.from,b.to);c||(c=ed(a,b));a.cm?Of(a.cm,b,d):hd(a,b,d);Rb(a,c,ca)}}function Of(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,i=f.line;a.options.lineWrapping|| (i=C(da(r(d,f.line))),d.iter(i,g.line+1,function(a){if(a==e.maxLine)return h=!0}));-1e.maxLineLength){e.maxLine=a;e.maxLineLength=b;e.maxLineChanged=true;h=false}}),h&&(a.curOp.updateMaxLine=!0));d.frontier=Math.min(d.frontier,f.line);bb(a,400);c=b.text.length-(g.line-f.line)-1;b.full?N(a):f.line==g.line&&1==b.text.length&&!Ee(a.doc,b)?ja(a,f.line,"text"):N(a,f.line, g.line+1,c);c=P(a,"changes");if((d=P(a,"change"))||c)b={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin},d&&H(a,"change",a,b),c&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(b);a.display.selForContextMenu=null}function sb(a,b,c,d,e){d||(d=c);if(0>v(d,c))var f=d,d=c,c=f;"string"==typeof b&&(b=oa(b));Ka(a,{from:c,to:d,text:b,origin:e})}function Zb(a,b,c,d,e){var f=a.display,g=ta(a.display);0>c&&(c=0);var h=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:f.scroller.scrollTop,i=Gc(a), j={};e-c>i&&(e=c+i);var k=a.doc.height+(f.mover.offsetHeight-f.lineSpace.offsetHeight),n=ck-g;ch+i&&(c=Math.min(c,(g?k:e)-i),c!=h&&(j.scrollTop=c));h=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:f.scroller.scrollLeft;a=la(a)-(a.options.fixedGutter?f.gutters.offsetWidth:0);(f=d-b>a)&&(d=b+a);10>b?j.scrollLeft=0:ba+h-3&&(j.scrollLeft=d+(f?0:10)-a);return j}function id(a,b,c){(null!=b||null!=c)&&hc(a);null!=b&&(a.curOp.scrollLeft= (null==a.curOp.scrollLeft?a.doc.scrollLeft:a.curOp.scrollLeft)+b);null!=c&&(a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+c)}function La(a){hc(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping||(c=b.ch?o(b.line,b.ch-1):b,d=o(b.line,b.ch+1));a.curOp.scrollToPos={from:c,to:d,margin:a.options.cursorScrollMargin,isCursor:!0}}function hc(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;var c=ge(a,b.from),d=ge(a,b.to),b=Zb(a,Math.min(c.left,d.left),Math.min(c.top, d.top)-b.margin,Math.max(c.right,d.right),Math.max(c.bottom,d.bottom)+b.margin);a.scrollTo(b.scrollLeft,b.scrollTop)}}function lb(a,b,c,d){var e=a.doc,f;null==c&&(c="add");"smart"==c&&(e.mode.indent?f=ob(a,b):c="prev");var g=a.options.tabSize,h=r(e,b),i=X(h.text,null,g);h.stateAfter&&(h.stateAfter=null);var j=h.text.match(/^\s*/)[0],k;if(!d&&!/\S/.test(h.text))k=0,c="not";else if("smart"==c&&(k=e.mode.indent(f,h.text.slice(j.length),h.text),k==se||150e.first? X(r(e,b-1).text,null,g):0:"add"==c?k=i+a.options.indentUnit:"subtract"==c?k=i-a.options.indentUnit:"number"==typeof c&&(k=i+c);k=Math.max(0,k);c="";d=0;if(a.options.indentWithTabs)for(a=Math.floor(k/g);a;--a)d+=g,c+="\t";d=v(f.from,x(d).to);){var g=d.pop();if(0>v(g.from,f.from)){f.from=g.from;break}}d.push(f)}Q(a,function(){for(var b=d.length-1;0<=b;b--)sb(a.doc,"",d[b].from,d[b].to,"+delete");La(a)})}function jd(a,b,c,d,e){function f(b){var d=(e?Yc:Ge)(j,h,c,!0);if(null==d){if(b=!b)b=g+c,b=a.first+ a.size?b=k=!1:(g=b,b=j=r(a,b));if(b)h=e?(0>c?Yb:Xb)(j):0>c?j.text.length:0;else return k=!1}else h=d;return!0}var g=b.line,h=b.ch,i=c,j=r(a,g),k=!0;if("char"==d)f();else if("column"==d)f(!0);else if("word"==d||"group"==d)for(var n=null,d="group"==d,b=a.cm&&a.cm.getHelper(b,"wordChars"),l=!0;!(0>c)||f(!l);l=!1){var s=j.text.charAt(h)||"\n",s=jc(s,b)?"w":d&&"\n"==s?"n":!d||/\s/.test(s)?null:"p";d&&(!l&&!s)&&(s="s");if(n&&n!=s){0>c&&(c=1,f());break}s&&(n=s);if(0c?1.5:0.5)*ta(a.display))):"line"==d&&(g=0c?0>=g:g>=e.height){h.hitSide=!0;break}g+=5*c}return h}function u(a,b,c,d){m.defaults[a]=b;c&&(Ga[a]=d?function(a,b,d){d!=xd&&c(a,b,d)}:c)}function Pf(a){for(var b=a.split(/-(?!$)/),a=b[b.length- 1],c,d,e,f,g=0;g=e:j.to>e);(i||(i=[])).push(new lc(k,j.from,n?null:j.to))}}c=i;if(d)for(var h=0,l;h=f:i.to>f)||i.from==f&&"bookmark"==j.type&&(!g||i.marker.insertLeft))k=null==i.from||(j.inclusiveLeft?i.from<=f:i.fromv(g.to,e.from)||0i||!c.inclusiveLeft&&!i)&&h.push({from:g.from,to:e.from});(0Ne(d,e.marker)))d=e.marker;return d}function Ie(a,b,c,d,e){a=r(a,b);if(a=na&&a.markedSpans)for(b=0;b=i||0>=h&&0<=i))if(0>=h&&(0v(g.from,d)||f.marker.inclusiveLeft&&e.inclusiveRight))return!0}}}function da(a){for(var b;b=wa(a,!0);)a=b.find(-1,!0).line;return a}function Fc(a,b){var c=r(a,b),d=da(c);return c==d?b:C(d)}function Dd(a,b){if(b> a.lastLine())return b;var c=r(a,b),d;if(!ua(a,c))return b;for(;d=wa(c,!1);)c=d.find(1,!0).line;return C(c)+1}function ua(a,b){var c=na&&b.markedSpans;if(c)for(var d,e=0;ee;e++){d&&(d[0]=m.innerMode(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw Error("Mode "+a.name+" failed to advance stream."); }function Re(a,b,c,d){function e(a){return{start:k.start,end:k.pos,string:k.current(),type:h||null,state:a?Oa(f.mode,j):j}}var f=a.doc,g=f.mode,h,b=t(f,b),i=r(f,b.line),j=ob(a,b.line,c),k=new oc(i.text,a.options.tabSize),n;for(d&&(n=[]);(d||k.posa.options.maxHighlightLength?(h=!1,g&&Rc(a,b,d,k.pos),k.pos=b.length,n=null):n=Pe(md(c,k,d,l),f);if(l){var s=l[0].name;s&&(n="m-"+(n?s+" "+n:s))}if(!h||j!=n){for(;ia&&e.splice(h,1,a,e[h+1],d);h=h+2;i=Math.min(a,d)}if(b)if(g.opaque){e.splice(c,h-c,a,"cm-overlay "+b);h=c+2}else for(;cAa(g,1,2).getBoundingClientRect().right-h.right}if(g&&(f=V(e)))c.addToken=Xf(c.addToken,f);c.map=[];h=b!=a.display.externalMeasured&&C(e);a:{g=c;var h=Te(a,e,h),i=e.markedSpans,j=e.text,k=0;if(i)for(var n=j.length,l=0,s=1,m="",o=void 0,r=void 0,p=0,t=void 0,u=void 0,v=void 0, x=void 0,w=void 0;;){if(p==l){for(var t=u=v=x=r="",w=null,p=Infinity,z=[],B=0;Bl||A.collapsed&&D.to==l&&D.from==l)){if(null!=D.to&&(D.to!=l&&p>D.to)&&(p=D.to,u=""),A.className&&(t+=" "+A.className),A.css&&(r=A.css),A.startStyle&&D.from==l&&(v+=" "+A.startStyle),A.endStyle&&D.to==p&&(u+=" "+A.endStyle),A.title&&!x&&(x=A.title),A.collapsed&&(!w||0>Ne(w.marker,A)))w=D}else D.from> l&&p>D.from&&(p=D.from)}if(w&&(w.from||0)==l){Ve(g,(null==w.to?n+1:w.to)-l,w.marker,null==w.from);if(null==w.to)break a;w.to==l&&(w=!1)}if(!w&&z.length)for(B=0;B=n)break;for(z=Math.min(n,p);;){if(m){B=l+m.length;w||(D=B>z?m.slice(0,z-l):m,g.addToken(g,D,o?o+t:t,v,l+D.length==p?u:"",x,r));if(B>=z){m=m.slice(z-l);l=z;break}l=B;v=""}m=j.slice(k,k=h[s++]);o=Ue(h[s++],g.cm.options)}}else for(var s=1;sz?k.appendChild(q("span",[m])):k.appendChild(m);a.map.push(a.pos,a.pos+s,m);a.col+=s;a.pos+=s}if(!l)break;n+=s+1;"\t"==l[0]?(m= a.cm.options.tabSize,l=m-a.col%m,m=k.appendChild(q("span",Fe(l),"cm-tab")),m.setAttribute("role","presentation"),m.setAttribute("cm-text","\t"),a.col+=l):(m=a.cm.options.specialCharPlaceholder(l[0]),m.setAttribute("cm-text",l[0]),y&&9>z?k.appendChild(q("span",[m])):k.appendChild(m),a.col+=1);a.map.push(a.pos,a.pos+1,m);a.pos++}else{a.col+=b.length;var k=document.createTextNode(h);a.map.push(a.pos,a.pos+b.length,k);y&&9>z&&(j=!0);a.pos+=b.length}if(c||d||e||j||g)return b=c||"",d&&(b+=d),e&&(b+=e), d=q("span",[k],b,g),f&&(d.title=f),a.content.appendChild(d);a.content.appendChild(k)}}function Zf(a){for(var b=" ",c=0;cj&&l.from<=j)break}if(l.to>=k)return a(c,d,e,f,g,h,i);a(c,d.slice(0,l.to-j),e,f,null,h,i);f=null;d=d.slice(l.to-j);j=l.to}}}function Ve(a,b,c,d){var e=!d&&c.widgetNode; e&&a.map.push(a.pos,a.pos+b,e);!d&&a.cm.display.input.needsContentAttribute&&(e||(e=a.content.appendChild(document.createElement("span"))),e.setAttribute("cm-marker",c.id));e&&(a.cm.display.input.setUneditable(e),a.content.appendChild(e));a.pos+=b}function Ee(a,b){return 0==b.from.ch&&0==b.to.ch&&""==x(b.text)&&(!a.cm||a.cm.options.wholeLineUpdateBefore)}function hd(a,b,c,d){function e(a){return c?c[a]:null}function f(a,c,e){var f=d;a.text=c;a.stateAfter&&(a.stateAfter=null);a.styles&&(a.styles=null); null!=a.order&&(a.order=null);Le(a);Me(a,e);c=f?f(a):1;c!=a.height&&Z(a,c);H(a,"change",a,b)}function g(a,b){for(var c=a,f=[];cb||b>=a.size)throw Error("There is no line "+(b+a.first)+" in the document.");for(var c=a;!c.lines;)for(var d=0;;++d){var e=c.children[d],f=e.chunkSize();if(bf-a.cm.options.historyEventDelay||"*"==b.origin.charAt(0))){var i;e.lastOp==d?(Vd(e.done),i=x(e.done)):e.done.length&&!x(e.done).ranges? i=x(e.done):1e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift()}e.done.push(c);e.generation=++e.maxGeneration;e.lastModTime=e.lastSelTime=f;e.lastOp=e.lastSelOp=d;e.lastOrigin=e.lastSelOrigin= b.origin;j||F(a,"historyAdded")}function Sb(a,b){var c=x(b);(!c||!c.ranges||!c.equals(a))&&b.push(a)}function We(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+a.size,d),function(c){c.markedSpans&&((e||(e=b["spans_"+a.id]={}))[f]=c.markedSpans);++f})}function Sf(a){if(!a)return null;for(var b=0,c;b=b)return d+Math.min(g,b-e);e+=f-d;e+=c-e%c;d=f+1;if(e>=b)return d}}function Fe(a){for(;qc.length<=a;)qc.push(x(qc)+" ");return qc[a]}function x(a){return a[a.length-1]}function G(a,b){for(var c=0;c=b.offsetWidth&&2z))}a=qd?q("span","​"):q("span"," ",null,"display: inline-block; width: 1px; margin-right: -1px");a.setAttribute("cm-text","");return a} function tf(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=!1,f=0;fb||b==c&&g.to==b)d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?"rtl":"ltr"),e=!0}e||d(b,c,"ltr")}function Wc(a){return a.level%2?a.from:a.to}function Xb(a){return(a=V(a))?a[0].level%2?a[0].to:a[0].from:0}function Yb(a){var b=V(a);return!b?a.text.length:Wc(x(b))}function cf(a,b){var c=r(a.doc,b),d=da(c);d!=c&&(b=C(d));c=V(d);d=!c?0:c[0].level%2?Yb(d):Xb(d);return o(b,d)}function df(a,b){var c= cf(a,b.line),d=r(a.doc,c.line),e=V(d);return!e||0==e[0].level?(d=Math.max(0,d.text.search(/\S/)),o(c.line,b.line==c.line&&b.ch<=d&&b.ch?0:d)):c}function Ob(a,b){rb=null;for(var c=0,d;cb)return c;if(e.from==b||e.to==b)if(null==d)d=c;else{var f;f=e.level;var g=a[d].level,h=a[0].level;f=f==h?!0:g==h?!1:fg.from&&bb||b>a.text.length?null:b}var sa=/gecko\/\d/i.test(navigator.userAgent),ef=/MSIE \d/.test(navigator.userAgent),ff=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent), y=ef||ff,z=y&&(ef?document.documentMode||6:ff[1]),E=/WebKit\//.test(navigator.userAgent),cg=E&&/Qt\/\d+\.\d+/.test(navigator.userAgent),dg=/Chrome\//.test(navigator.userAgent),Y=/Opera\//.test(navigator.userAgent),le=/Apple Computer/.test(navigator.vendor),eg=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),zf=/PhantomJS/.test(navigator.userAgent),Ma=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),Xa=Ma||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent), T=Ma||/Mac/.test(navigator.platform),fg=/win/i.test(navigator.platform),Ea=Y&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);Ea&&(Ea=Number(Ea[1]));Ea&&15<=Ea&&(Y=!1,E=!0);var gf=T&&(cg||Y&&(null==Ea||12.11>Ea)),$c=sa||y&&9<=z,ye=!1,na=!1;zc.prototype=S({update:function(a){var b=a.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;if(c){this.vert.style.display="block";this.vert.style.bottom=b?d+"px":"0";this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+ (a.viewHeight-(b?d:0)))+"px"}else{this.vert.style.display="";this.vert.firstChild.style.height="0"}if(b){this.horiz.style.display="block";this.horiz.style.right=c?d+"px":"0";this.horiz.style.left=a.barLeft+"px";this.horiz.firstChild.style.width=a.scrollWidth-a.clientWidth+(a.viewWidth-a.barLeft-(c?d:0))+"px"}else{this.horiz.style.display="";this.horiz.firstChild.style.width="0"}if(!this.checkedOverlay&&a.clientHeight>0){d==0&&this.overlayHack();this.checkedOverlay=true}return{right:c?d:0,bottom:b? d:0}},setScrollLeft:function(a){if(this.horiz.scrollLeft!=a)this.horiz.scrollLeft=a},setScrollTop:function(a){if(this.vert.scrollTop!=a)this.vert.scrollTop=a},overlayHack:function(){this.horiz.style.minHeight=this.vert.style.minWidth=T&&!eg?"12px":"18px";var a=this,b=function(b){(b.target||b.srcElement)!=a.vert&&(b.target||b.srcElement)!=a.horiz&&B(a.cm,he)(b)};p(this.vert,"mousedown",b);p(this.horiz,"mousedown",b)},clear:function(){var a=this.horiz.parentNode;a.removeChild(this.horiz);a.removeChild(this.vert)}}, zc.prototype);Ac.prototype=S({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},Ac.prototype);m.scrollbarModel={"native":zc,"null":Ac};Ib.prototype.signal=function(a,b){P(a,b)&&this.events.push(arguments)};Ib.prototype.finish=function(){for(var a=0;a=9&&c.hasSelection)c.hasSelection=null;c.poll()});p(f,"paste",function(){if(E&&!d.state.fakedLastChar&&!(new Date-d.state.lastMiddleDown<200)){var a=f.selectionStart,b=f.selectionEnd;f.value=f.value+"$";f.selectionEnd=b;f.selectionStart=a;d.state.fakedLastChar=true}d.state.pasteIncoming=true;c.fastPoll()});p(f,"cut",b);p(f,"copy",b);p(a.scroller,"paste",function(b){if(!ka(a,b)){d.state.pasteIncoming=true;c.focus()}});p(a.lineSpace, "selectstart",function(b){ka(a,b)||L(b)});p(f,"compositionstart",function(){var a=d.getCursor("from");c.composing={start:a,range:d.markText(a,d.getCursor("to"),{className:"CodeMirror-composing"})}});p(f,"compositionend",function(){if(c.composing){c.poll();c.composing.range.clear();c.composing=null}})},prepareSelection:function(){var a=this.cm,b=a.display,c=a.doc,d=$d(a);if(a.options.moveInputWithCursor){var a=ia(a,c.sel.primary().head,"div"),c=b.wrapper.getBoundingClientRect(),e=b.lineDiv.getBoundingClientRect(); d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-10,a.top+e.top-c.top));d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,a.left+e.left-c.left))}return d},showSelection:function(a){var b=this.cm.display;R(b.cursorDiv,a.cursors);R(b.selectionDiv,a.selection);if(a.teTop!=null){this.wrapper.style.top=a.teTop+"px";this.wrapper.style.left=a.teLeft+"px"}},reset:function(a){if(!this.contextMenuPending){var b,c,d=this.cm,e=d.doc;if(d.somethingSelected()){this.prevInput="";b=e.sel.primary();c=(b=ue&& (b.to().line-b.from().line>100||(c=d.getSelection()).length>1E3))?"-":c||d.getSelection();this.textarea.value=c;d.state.focused&&Va(this.textarea);if(y&&z>=9)this.hasSelection=c}else if(!a){this.prevInput=this.textarea.value="";if(y&&z>=9)this.hasSelection=null}this.inaccurateSelection=b}},getField:function(){return this.textarea},supportsTouch:function(){return false},focus:function(){if(this.cm.options.readOnly!="nocursor"&&(!Xa||aa()!=this.textarea))try{this.textarea.focus()}catch(a){}},blur:function(){this.textarea.blur()}, resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var a=this;a.pollingFast||a.polling.set(this.cm.options.pollInterval,function(){a.poll();a.cm.state.focused&&a.slowPoll()})},fastPoll:function(){function a(){if(!c.poll()&&!b){b=true;c.polling.set(60,a)}else{c.pollingFast=false;c.slowPoll()}}var b=false,c=this;c.pollingFast=true;c.polling.set(20,a)},poll:function(){var a=this.cm,b=this.textarea,c=this.prevInput; if(!a.state.focused||gg(b)&&!c||Nb(a)||a.options.disableInput||a.state.keySeq)return false;if(a.state.pasteIncoming&&a.state.fakedLastChar){b.value=b.value.substring(0,b.value.length-1);a.state.fakedLastChar=false}var d=b.value;if(d==c&&!a.somethingSelected())return false;if(y&&z>=9&&this.hasSelection===d||T&&/[\uf700-\uf7ff]/.test(d)){a.display.input.reset();return false}if(a.doc.sel==a.display.selForContextMenu){var e=d.charCodeAt(0);e==8203&&!c&&(c="​");if(e==8666){this.reset();return this.cm.execCommand("undo")}}for(var f= 0,e=Math.min(c.length,d.length);f1E3||d.indexOf("\n")>-1?b.value=g.prevInput="":g.prevInput=d;if(g.composing){g.composing.range.clear();g.composing.range=a.markText(g.composing.start,a.getCursor("to"),{className:"CodeMirror-composing"})}});return true},ensurePolled:function(){if(this.pollingFast&&this.poll())this.pollingFast=false},onKeyPress:function(){if(y&&z>= 9)this.hasSelection=null;this.fastPoll()},onContextMenu:function(a){function b(){if(g.selectionStart!=null){var a=e.somethingSelected(),b="​"+(a?g.value:"");g.value="⇚";g.value=b;d.prevInput=a?"":"​";g.selectionStart=1;g.selectionEnd=b.length;f.selForContextMenu=e.doc.sel}}function c(){d.contextMenuPending=false;d.wrapper.style.position="relative";g.style.cssText=j;if(y&&z<9)f.scrollbars.setScrollTop(f.scroller.scrollTop=i);if(g.selectionStart!=null){(!y||y&&z<9)&&b();var a=0,c=function(){f.selForContextMenu== e.doc.sel&&g.selectionStart==0&&g.selectionEnd>0&&d.prevInput=="​"?B(e,ec.selectAll)(e):a++<10?f.detectingSelectAll=setTimeout(c,500):f.input.reset()};f.detectingSelectAll=setTimeout(c,200)}}var d=this,e=d.cm,f=e.display,g=d.textarea,h=Qa(e,a),i=f.scroller.scrollTop;if(h&&!Y){e.options.resetSelectionOnContextMenu&&e.doc.sel.contains(h)==-1&&B(e,A)(e.doc,ba(h),ca);var j=g.style.cssText;d.wrapper.style.position="absolute";g.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(a.clientY- 5)+"px; left: "+(a.clientX-5)+"px; z-index: 1000; background: "+(y?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);";if(E)var k=window.scrollY;f.input.focus();E&&window.scrollTo(null,k);f.input.reset();if(!e.somethingSelected())g.value=d.prevInput=" ";d.contextMenuPending=true;f.selForContextMenu=e.doc.sel;clearTimeout(f.detectingSelectAll);y&&z>=9&&b();if($c){ad(a);var n=function(){fa(window,"mouseup", n);setTimeout(c,20)};p(window,"mouseup",n)}else setTimeout(c,50)}},setUneditable:Ab,needsContentAttribute:!1},Lc.prototype);Mc.prototype=S({init:function(a){function b(a){if(d.somethingSelected()){U=d.getSelections();a.type=="cut"&&d.replaceSelection("",null,"cut")}else if(d.options.lineWiseCopyCut){var b=Nd(d);U=b.text;a.type=="cut"&&d.operation(function(){d.setSelections(b.ranges,0,ca);d.replaceSelection("",null,"cut")})}else return;if(a.clipboardData&&!Ma){a.preventDefault();a.clipboardData.clearData(); a.clipboardData.setData("text/plain",U.join("\n"))}else{var c=Pd(),a=c.firstChild;d.display.lineSpace.insertBefore(c,d.display.lineSpace.firstChild);a.value=U.join("\n");var h=document.activeElement;Va(a);setTimeout(function(){d.display.lineSpace.removeChild(c);h.focus()},50)}}var c=this,d=c.cm,a=c.div=a.lineDiv;a.contentEditable="true";Od(a);p(a,"paste",function(a){var b=a.clipboardData&&a.clipboardData.getData("text/plain");if(b){a.preventDefault();d.replaceSelection(b,null,"paste")}});p(a,"compositionstart", function(a){a=a.data;c.composing={sel:d.doc.sel,data:a,startData:a};if(a){var b=d.doc.sel.primary(),g=d.getLine(b.head.line).indexOf(a,Math.max(0,b.head.ch-a.length));if(g>-1&&g<=b.head.ch)c.composing.sel=ba(o(b.head.line,g),o(b.head.line,g+a.length))}});p(a,"compositionupdate",function(a){c.composing.data=a.data});p(a,"compositionend",function(a){var b=c.composing;if(b){if(a.data!=b.startData&&!/\u200b/.test(a.data))b.data=a.data;setTimeout(function(){b.handled||c.applyComposition(b);if(c.composing== b)c.composing=null},50)}});p(a,"touchstart",function(){c.forceCompositionEnd()});p(a,"input",function(){c.composing||c.pollContent()||Q(c.cm,function(){N(d)})});p(a,"copy",b);p(a,"cut",b)},prepareSelection:function(){var a=$d(this.cm,false);a.focus=this.cm.state.focused;return a},showSelection:function(a){if(a&&this.cm.display.view.length){a.focus&&this.showPrimarySelection();this.showMultipleSelections(a)}},showPrimarySelection:function(){var a=window.getSelection(),b=this.cm.doc.sel.primary(),c= Pb(this.cm,a.anchorNode,a.anchorOffset),d=Pb(this.cm,a.focusNode,a.focusOffset);if(!c||c.bad||!d||d.bad||!(v(Mb(c,d),b.from())==0&&v(Lb(c,d),b.to())==0)){c=Qd(this.cm,b.from());d=Qd(this.cm,b.to());if(c||d){var e=this.cm.display.view,b=a.rangeCount&&a.getRangeAt(0);if(c){if(!d){d=e[e.length-1].measure;d=d.maps?d.maps[d.maps.length-1]:d.map;d={node:d[d.length-1],offset:d[d.length-2]-d[d.length-3]}}}else c={node:e[0].measure.map[2],offset:0};try{var f=Aa(c.node,c.offset,d.offset,d.node)}catch(g){}if(f){a.removeAllRanges(); a.addRange(f);b&&a.anchorNode==null?a.addRange(b):sa&&this.startGracePeriod()}this.rememberSelection()}}},startGracePeriod:function(){var a=this;clearTimeout(this.gracePeriod);this.gracePeriod=setTimeout(function(){a.gracePeriod=false;a.selectionChanged()&&a.cm.operation(function(){a.cm.curOp.selectionChanged=true})},20)},showMultipleSelections:function(a){R(this.cm.display.cursorDiv,a.cursors);R(this.cm.display.selectionDiv,a.selection)},rememberSelection:function(){var a=window.getSelection();this.lastAnchorNode= a.anchorNode;this.lastAnchorOffset=a.anchorOffset;this.lastFocusNode=a.focusNode;this.lastFocusOffset=a.focusOffset},selectionInEditor:function(){var a=window.getSelection();if(!a.rangeCount)return false;a=a.getRangeAt(0).commonAncestorContainer;return Oc(this.div,a)},focus:function(){this.cm.options.readOnly!="nocursor"&&this.div.focus()},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return true},receivedFocus:function(){function a(){if(b.cm.state.focused){b.pollSelection(); b.polling.set(b.cm.options.pollInterval,a)}}var b=this;this.selectionInEditor()?this.pollSelection():Q(this.cm,function(){b.cm.curOp.selectionChanged=true});this.polling.set(this.cm.options.pollInterval,a)},selectionChanged:function(){var a=window.getSelection();return a.anchorNode!=this.lastAnchorNode||a.anchorOffset!=this.lastAnchorOffset||a.focusNode!=this.lastFocusNode||a.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var a= window.getSelection(),b=this.cm;this.rememberSelection();var c=Pb(b,a.anchorNode,a.anchorOffset),d=Pb(b,a.focusNode,a.focusOffset);c&&d&&Q(b,function(){A(b.doc,ba(c,d),ca);if(c.bad||d.bad)b.curOp.selectionChanged=true})}},pollContent:function(){var a=this.cm,b=a.display,c=a.doc.sel.primary(),d=c.from(),c=c.to();if(d.lineb.viewTo-1)return false;var e;if(d.line==b.viewFrom||(e=ya(a,d.line))==0){d=C(b.view[0].line);e=b.view[0].node}else{d=C(b.view[e].line);e=b.view[e-1].node.nextSibling}var f= ya(a,c.line);if(f==b.view.length-1){c=b.viewTo-1;b=b.view[f].node}else{c=C(b.view[f+1].line)-1;b=b.view[f+1].node.previousSibling}b=oa(qf(a,e,b,d,c));for(e=za(a.doc,o(d,0),o(c,r(a.doc,c).text.length));b.length>1&&e.length>1;)if(x(b)==x(e)){b.pop();e.pop();c--}else if(b[0]==e[0]){b.shift();e.shift();d++}else break;for(var g=0,f=0,h=b[0],i=e[0],j=Math.min(h.length,i.length);g1||b[0]||v(d,c)){sb(a.doc,b,d,c,"+input");return true}},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){if(this.composing&&!this.composing.handled){this.applyComposition(this.composing);this.composing.handled=true;this.div.blur();this.div.focus()}},applyComposition:function(a){a.data&& a.data!=a.startData&&B(this.cm,Kc)(this.cm,a.data,0,a.sel)},setUneditable:function(a){a.setAttribute("contenteditable","false")},onKeyPress:function(a){a.preventDefault();B(this.cm,Kc)(this.cm,String.fromCharCode(a.charCode==null?a.keyCode:a.charCode),0)},onContextMenu:Ab,resetPosition:Ab,needsContentAttribute:!0},Mc.prototype);m.inputStyles={textarea:Lc,contenteditable:Mc};ha.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(a){if(a==this)return true;if(a.primIndex!= this.primIndex||a.ranges.length!=this.ranges.length)return false;for(var b=0;b=0&&v(a,d.to())<=0)return c}return-1}};w.prototype={from:function(){return Mb(this.anchor,this.head)},to:function(){return Lb(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var Tc={left:0,right:0,top:0,bottom:0},Ba,Pa=null,yf=0,bc,ac,ke=0,cc=0,O=null;y?O=-0.53:sa?O=15:dg?O=-0.7:le&&(O=-1/3);var re=function(a){var b= a.wheelDeltaX,c=a.wheelDeltaY;if(b==null&&a.detail&&a.axis==a.HORIZONTAL_AXIS)b=a.detail;if(c==null&&a.detail&&a.axis==a.VERTICAL_AXIS)c=a.detail;else if(c==null)c=a.wheelDelta;return{x:b,y:c}};m.wheelEventPixels=function(a){a=re(a);a.x=a.x*O;a.y=a.y*O;return a};var Jf=new Ya,dd=null,pa=m.changeEnd=function(a){return!a.text?a.to:o(a.from.line+a.text.length-1,x(a.text).length+(a.text.length==1?a.from.ch:0))};m.prototype={constructor:m,focus:function(){window.focus();this.display.input.focus()},setOption:function(a, b){var c=this.options,d=c[a];if(!(c[a]==b&&a!="mode")){c[a]=b;Ga.hasOwnProperty(a)&&B(this,Ga[a])(this,b,d)}},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?"push":"unshift"](kc(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;cc){lb(this,e.head.line,a,true);c=e.head.line;d==this.doc.sel.primIndex&&La(this)}}else{for(var f=e.from(),e=e.to(),g=Math.max(c,f.line),c=Math.min(this.lastLine(),e.line-(e.ch?0:1))+1,e=g;e0)&&Pc(this.doc,d,new w(f,e[d].to()),ca)}}}),getTokenAt:function(a,b){return Re(this,a,b)},getLineTokens:function(a,b){return Re(this,o(a),b,true)},getTokenTypeAt:function(a){var a= t(this.doc,a),b=Te(this,r(this.doc,a.line)),c=0,d=(b.length-1)/2,a=a.ch,e;if(a==0)e=b[2];else for(;;){var f=c+d>>1;if((f?b[f*2-1]:0)>=a)d=f;else if(b[f*2+1]d){a=d;c=true}d=r(this.doc,a)}else d=a;return Vc(this,d,{top:0,left:0},b||"page").top+(c?this.doc.height-ga(d):0)},defaultTextHeight:function(){return ta(this.display)},defaultCharWidth:function(){return cb(this.display)},setGutterMarker:J(function(a,b,c){return ic(this.doc,a,"gutter",function(a){var e=a.gutterMarkers||(a.gutterMarkers={});e[b]=c;if(!c&&af(e))a.gutterMarkers=null;return true})}),clearGutter:J(function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){if(c.gutterMarkers&& c.gutterMarkers[a]){c.gutterMarkers[a]=null;ja(b,d,"gutter");if(af(c.gutterMarkers))c.gutterMarkers=null}++d})}),lineInfo:function(a){if(typeof a=="number"){if(!mb(this.doc,a))return null;var b=a,a=r(this.doc,a);if(!a)return null}else{b=C(a);if(b==null)return null}return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a, b,c,d,e){var f=this.display,a=ia(this,t(this.doc,a)),g=a.bottom,h=a.left;b.style.position="absolute";b.setAttribute("cm-ignore-events","true");this.display.input.setUneditable(b);f.sizer.appendChild(b);if(d=="over")g=a.top;else if(d=="above"||d=="near"){var i=Math.max(f.wrapper.clientHeight,this.doc.height),j=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);if((d=="above"||a.bottom+b.offsetHeight>i)&&a.top>b.offsetHeight)g=a.top-b.offsetHeight;else if(a.bottom+b.offsetHeight<=i)g=a.bottom;h+ b.offsetWidth>j&&(h=j-b.offsetWidth)}b.style.top=g+"px";b.style.left=b.style.right="";if(e=="right"){h=f.sizer.clientWidth-b.offsetWidth;b.style.right="0px"}else{e=="left"?h=0:e=="middle"&&(h=(f.sizer.clientWidth-b.offsetWidth)/2);b.style.left=h+"px"}if(c){a=Zb(this,h,g,h+b.offsetWidth,g+b.offsetHeight);a.scrollTop!=null&&hb(this,a.scrollTop);a.scrollLeft!=null&&Ia(this,a.scrollLeft)}},triggerOnKeyDown:J(ne),triggerOnKeyPress:J(oe),triggerOnKeyUp:me,execCommand:function(a){if(ec.hasOwnProperty(a))return ec[a](this)}, findPosH:function(a,b,c,d){var e=1;if(b<0){e=-1;b=-b}for(var f=0,a=t(this.doc,a);f0&&f(b.charAt(c-1));)--c;for(;d0.5)&&vc(this);F(this,"refresh",this)}),swapDoc:J(function(a){var b=this.doc;b.cm=null;wd(this,a);db(this);this.display.input.reset(); this.scrollTo(a.scrollLeft,a.scrollTop);this.curOp.forceScroll=true;H(this,"swapDoc",this,b);return b}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}};Ua(m);var jf=m.defaults={},Ga=m.optionHandlers={},xd=m.Init={toString:function(){return"CodeMirror.Init"}};u("value","",function(a,b){a.setValue(b)},!0);u("mode", null,function(a,b){a.doc.modeOption=b;uc(a)},!0);u("indentUnit",2,uc,!0);u("indentWithTabs",!1);u("smartIndent",!0);u("tabSize",4,function(a){ab(a);db(a);N(a)},!0);u("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(a,b,c){a.state.specialChars=RegExp(b.source+(b.test("\t")?"":"|\t"),"g");c!=m.Init&&a.refresh()});u("specialCharPlaceholder",function(a){var b=q("span","•","cm-invalidchar");b.title="\\u"+a.charCodeAt(0).toString(16);b.setAttribute("aria-label",b.title); return b},function(a){a.refresh()},!0);u("electricChars",!0);u("inputStyle",Xa?"contenteditable":"textarea",function(){throw Error("inputStyle can not (yet) be changed in a running editor");},!0);u("rtlMoveVisually",!fg);u("wholeLineUpdateBefore",!0);u("theme","default",function(a){td(a);eb(a)},!0);u("keyMap","default",function(a,b,c){b=kc(b);(c=c!=m.Init&&kc(c))&&c.detach&&c.detach(a,b);b.attach&&b.attach(a,c||null)});u("extraKeys",null);u("lineWrapping",!1,function(a){if(a.options.lineWrapping){ib(a.display.wrapper, "CodeMirror-wrap");a.display.sizer.style.minWidth="";a.display.sizerWidth=null}else{gb(a.display.wrapper,"CodeMirror-wrap");yc(a)}vc(a);N(a);db(a);setTimeout(function(){Ja(a)},100)},!0);u("gutters",[],function(a){rc(a.options);eb(a)},!0);u("fixedGutter",!0,function(a,b){a.display.gutters.style.left=b?Cc(a.display)+"px":"0";a.refresh()},!0);u("coverGutterNextToScrollbar",!1,function(a){Ja(a)},!0);u("scrollbarStyle","native",function(a){ud(a);Ja(a);a.display.scrollbars.setScrollTop(a.doc.scrollTop); a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)},!0);u("lineNumbers",!1,function(a){rc(a.options);eb(a)},!0);u("firstLineNumber",1,eb,!0);u("lineNumberFormatter",function(a){return a},eb,!0);u("showCursorWhenSelecting",!1,jb,!0);u("resetSelectionOnContextMenu",!0);u("lineWiseCopyCut",!0);u("readOnly",!1,function(a,b){if(b=="nocursor"){$a(a);a.display.input.blur();a.display.disabled=true}else{a.display.disabled=false;b||a.display.input.reset()}});u("disableInput",!1,function(a,b){b||a.display.input.reset()}, !0);u("dragDrop",!0,function(a,b,c){if(!b!=!(c&&c!=m.Init)){c=a.display.dragFunctions;b=b?p:fa;b(a.display.scroller,"dragstart",c.start);b(a.display.scroller,"dragenter",c.simple);b(a.display.scroller,"dragover",c.simple);b(a.display.scroller,"drop",c.drop)}});u("cursorBlinkRate",530);u("cursorScrollMargin",0);u("cursorHeight",1,jb,!0);u("singleCursorHeightPerLine",!0,jb,!0);u("workTime",100);u("workDelay",100);u("flattenSpans",!0,ab,!0);u("addModeClass",!1,ab,!0);u("pollInterval",100);u("undoDepth", 200,function(a,b){a.doc.history.undoDepth=b});u("historyEventDelay",1250);u("viewportMargin",10,function(a){a.refresh()},!0);u("maxHighlightLength",1E4,ab,!0);u("moveInputWithCursor",!0,function(a,b){b||a.display.input.resetPosition()});u("tabindex",null,function(a,b){a.display.input.getField().tabIndex=b||""});u("autofocus",null);var hf=m.modes={},Db=m.mimeModes={};m.defineMode=function(a,b){if(!m.defaults.mode&&a!="null")m.defaults.mode=a;if(arguments.length>2)b.dependencies=Array.prototype.slice.call(arguments, 2);hf[a]=b};m.defineMIME=function(a,b){Db[a]=b};m.resolveMode=function(a){if(typeof a=="string"&&Db.hasOwnProperty(a))a=Db[a];else if(a&&typeof a.name=="string"&&Db.hasOwnProperty(a.name)){var b=Db[a.name];typeof b=="string"&&(b={name:b});a=Ze(b,a);a.name=b.name}else if(typeof a=="string"&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return m.resolveMode("application/xml");return typeof a=="string"?{name:a}:a||{name:"null"}};m.getMode=function(a,b){var b=m.resolveMode(b),c=hf[b.name];if(!c)return m.getMode(a, "text/plain");c=c(a,b);if(Eb.hasOwnProperty(b.name)){var d=Eb[b.name],e;for(e in d)if(d.hasOwnProperty(e)){c.hasOwnProperty(e)&&(c["_"+e]=c[e]);c[e]=d[e]}}c.name=b.name;if(b.helperType)c.helperType=b.helperType;if(b.modeProps)for(e in b.modeProps)c[e]=b.modeProps[e];return c};m.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}});m.defineMIME("text/plain","null");var Eb=m.modeExtensions={};m.extendMode=function(a,b){var c=Eb.hasOwnProperty(a)?Eb[a]:Eb[a]={};S(b,c)};m.defineExtension= function(a,b){m.prototype[a]=b};m.defineDocExtension=function(a,b){M.prototype[a]=b};m.defineOption=u;var tc=[];m.defineInitHook=function(a){tc.push(a)};var Wa=m.helpers={};m.registerHelper=function(a,b,c){Wa.hasOwnProperty(a)||(Wa[a]=m[a]={_global:[]});Wa[a][b]=c};m.registerGlobalHelper=function(a,b,c,d){m.registerHelper(a,b,d);Wa[a]._global.push({pred:c,val:d})};var Oa=m.copyState=function(a,b){if(b===true)return b;if(a.copyState)return a.copyState(b);var c={},d;for(d in b){var e=b[d];e instanceof Array&&(e=e.concat([]));c[d]=e}return c},wf=m.startState=function(a,b,c){return a.startState?a.startState(b,c):true};m.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);if(!c||c.mode==a)break;b=c.state;a=c.mode}return c||{mode:a,state:b}};var ec=m.commands={selectAll:function(a){a.setSelection(o(a.firstLine(),0),o(a.lastLine()),ca)},singleSelection:function(a){a.setSelection(a.getCursor("anchor"),a.getCursor("head"),ca)},killLine:function(a){Ra(a,function(b){if(b.empty()){var c=r(a.doc, b.head.line).text.length;return b.head.ch==c&&b.head.line0){e=new o(e.line,e.ch+1);a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),o(e.line,e.ch-2),e,"+transpose")}else if(e.line>a.doc.first){var g=r(a.doc,e.line-1).text;g&&a.replaceRange(f.charAt(0)+ "\n"+g.charAt(g.length-1),o(e.line-1,g.length-1),o(e.line,1),"+transpose")}}c.push(new w(e,e))}a.setSelections(c)})},newlineAndIndent:function(a){Q(a,function(){for(var b=a.listSelections().length,c=0;c=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){if(this.posb},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){a=this.string.indexOf(a,this.pos);if(a>-1){this.pos=a;return true}},backUp:function(a){this.pos=this.pos-a},column:function(){if(this.lastColumnPos0)return null;if(a&&b!==false)this.pos=this.pos+a[0].length;return a}},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(a,b){this.lineStart=this.lineStart+a;try{return b()}finally{this.lineStart=this.lineStart-a}}};var kd=0,Da=m.TextMarker=function(a,b){this.lines=[];this.type=b;this.doc=a;this.id=++kd};Ua(Da);Da.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b= a&&!a.curOp;b&&Fa(a);if(P(this,"clear")){var c=this.find();c&&H(this,"clear",c.from,c.to)}for(var d=c=null,e=0;ea.display.maxLineLength){a.display.maxLine=f;a.display.maxLineLength=g;a.display.maxLineChanged=true}}c!=null&&(a&&this.collapsed)&&N(a,c,d+1);this.lines.length=0;this.explicitlyCleared=true;if(this.atomic&&this.doc.cantEdit){this.doc.cantEdit=false;a&&Zd(a.doc)}a&&H(a,"markerCleared",a,this);b&&Ha(a);this.parent&&this.parent.clear()}};Da.prototype.find=function(a,b){a==null&&this.type=="bookmark"&&(a=1);for(var c,d,e=0;e1||!(this.children[0]instanceof xb))){c=[];this.collapse(c);this.children=[new xb(c)];this.children[0].parent=this}},collapse:function(a){for(var b=0;b< this.children.length;++b)this.children[b].collapse(a)},insertInner:function(a,b,c){this.size=this.size+b.length;this.height=this.height+c;for(var d=0;d50){for(;e.lines.length>50;){a=e.lines.splice(e.lines.length-25,25);a=new xb(a);e.height=e.height-a.height;this.children.splice(d+1,0,a);a.parent=this}this.maybeSpill()}break}a=a-f}},maybeSpill:function(){if(!(this.children.length<= 10)){var a=this;do{var b=a.children.splice(a.children.length-5,5),b=new yb(b);if(a.parent){a.size=a.size-b.size;a.height=a.height-b.height;var c=G(a.parent.children,a);a.parent.children.splice(c+1,0,b)}else{c=new yb(a.children);c.parent=a;a.children=[c,b];a=c}b.parent=a.parent}while(a.children.length>10);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;d=0;f--)Ka(this,d[f]);b?Ud(this,b):this.cm&&La(this.cm)}),undo:K(function(){gc(this,"undo")}), redo:K(function(){gc(this,"redo")}),undoSelection:K(function(){gc(this,"undo",true)}),redoSelection:K(function(){gc(this,"redo",true)}),setExtending:function(a){this.extend=a},getExtending:function(){return this.extend},historySize:function(){for(var a=this.history,b=0,c=0,d=0;d=a.ch))b.push(e.marker.parent||e.marker)}return b},findMarks:function(a,b,c){var a=t(this,a),b=t(this,b),d=[],e=a.line;this.iter(a.line,b.line+1,function(f){if(f=f.markedSpans)for(var g=0;gh.to||h.from==null&&e!=a.line||e==b.line&&h.from>b.ch)&&(!c||c(h.marker)))d.push(h.marker.parent|| h.marker)}++e});return d},getAllMarks:function(){var a=[];this.iter(function(b){if(b=b.markedSpans)for(var c=0;ca){b=a;return true}a=a-d;++c});return t(this,o(c,b))},indexFromPos:function(a){var a=t(this,a),b=a.ch;if(a.lineb)b=a.from;if(a.to!=null&&a.toG(ig,Fb)&&(m.prototype[Fb]=function(a){return function(){return a.apply(this.doc,arguments)}}(M.prototype[Fb])); Ua(M);var L=m.e_preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=false},jg=m.e_stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=true},ad=m.e_stop=function(a){L(a);jg(a)},p=m.on=function(a,b,c){if(a.addEventListener)a.addEventListener(b,c,false);else if(a.attachEvent)a.attachEvent("on"+b,c);else{a=a._handlers||(a._handlers={});(a[b]||(a[b]=[])).push(c)}},fa=m.off=function(a,b,c){if(a.removeEventListener)a.removeEventListener(b,c,false);else if(a.detachEvent)a.detachEvent("on"+ b,c);else if(a=a._handlers&&a._handlers[b])for(b=0;b=b)return e+(b-d);e=e+(f-d);e=e+(c-e%c);d=f+1}},qc=[""],Va=function(a){a.select()};Ma?Va=function(a){a.selectionStart=0;a.selectionEnd=a.value.length}:y&&(Va=function(a){try{a.select()}catch(b){}});var kg=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,$e=m.isWordChar=function(a){return/\w/.test(a)||a>"€"&&(a.toUpperCase()!=a.toLowerCase()|| kg.test(a))},bg=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/, Aa;Aa=document.createRange?function(a,b,c,d){var e=document.createRange();e.setEnd(d||a,c);e.setStart(a,b);return e}:function(a,b,c){var d=document.body.createTextRange();try{d.moveToElementText(a.parentNode)}catch(e){return d}d.collapse(true);d.moveEnd("character",c);d.moveStart("character",b);return d};var Oc=m.contains=function(a,b){if(b.nodeType==3)b=b.parentNode;if(a.contains)return a.contains(b);do{if(b.nodeType==11)b=b.host;if(b==a)return true}while(b=b.parentNode)};y&&11>z&&(aa=function(){try{return document.activeElement}catch(a){return document.body}}); var gb=m.rmClass=function(a,b){var c=a.className,d=Bb(b).exec(c);if(d){var e=c.slice(d.index+d[0].length);a.className=c.slice(0,d.index)+(e?d[1]+e:"")}},ib=m.addClass=function(a,b){var c=a.className;if(!Bb(b).test(c))a.className=a.className+((c?" ":"")+b)},vd=!1,Ef=function(){if(y&&z<9)return false;var a=q("div");return"draggable"in a||"dragDrop"in a}(),qd,nd,oa=m.splitLines=3!="\n\nb".split(/\n/).length?function(a){for(var b=0,c=[],d=a.length;b<=d;){var e=a.indexOf("\n",b);if(e==-1)e=a.length;var f= a.slice(b,a.charAt(e-1)=="\r"?e-1:e),g=f.indexOf("\r");if(g!=-1){c.push(f.slice(0,g));b=b+(g+1)}else{c.push(f);b=e+1}}return c}:function(a){return a.split(/\r\n?|\n/)},gg=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(b){return false}}:function(a){try{var b=a.ownerDocument.selection.createRange()}catch(c){}return!b||b.parentElement()!=a?false:b.compareEndPoints("StartToEnd",b)!=0},ue=function(){var a=q("div");if("oncopy"in a)return true;a.setAttribute("oncopy","return;"); return typeof a.oncopy=="function"}(),Uc=null,ra={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right", 63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};m.keyNames=ra;(function(){for(var a=0;a<10;a++)ra[a+48]=ra[a+96]=""+a;for(a=65;a<=90;a++)ra[a]=String.fromCharCode(a);for(a=1;a<=12;a++)ra[a+111]=ra[a+63235]="F"+a})();var rb,$f=function(){function a(a){return a<=247?c.charAt(a):1424<=a&&a<=1524?"R":1536<=a&&a<=1773?d.charAt(a-1536):1774<=a&&a<=2220?"r":8192<=a&&a<=8203?"w":a==8204?"b":"L"}function b(a,b,c){this.level=a;this.from=b;this.to=c}var c="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN", d="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",e=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,f=/[stwN]/,g=/[LRr]/,h=/[Lb1n]/,i=/[1n]/;return function(c){if(!e.test(c))return false;for(var d=c.length,n=[],l=0,m;l"))return n("=>","operator");if("0"==e&&a.eat(/x/i))return a.eatWhile(/[\da-f]/i),n("number","number");if(/\d/.test(e))return a.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),n("number","number");if("/"==e){if(a.eat("*"))return d.tokenize=J,J(a,d);if(a.eat("/"))return a.skipToEnd(),n("comment","comment");if("operator"==d.lastType||"keyword c"==d.lastType||"sof"==d.lastType||/^[\[{}\(,;:]$/.test(d.lastType)){a:for(var e=!1,c,b=!1;null!=(c=a.next());){if(!e){if("/"== c&&!b)break a;"["==c?b=!0:b&&"]"==c&&(b=!1)}e=!e&&"\\"==c}a.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/);return n("regexp","string-2")}a.eatWhile(K);return n("operator","operator",a.current())}if("`"==e)return d.tokenize=Q,Q(a,d);if("#"==e)return a.skipToEnd(),n("error","error");if(K.test(e))return a.eatWhile(K),n("operator","operator",a.current());if(R.test(e))return a.eatWhile(R),e=a.current(),(c=ba.propertyIsEnumerable(e)&&ba[e])&&"."!=d.lastType?n(c.type,c.style,e):n("variable","variable",e)}function pa(a){return function(d, e){var c=!1,b;if(L&&"@"==d.peek()&&d.match(qa))return e.tokenize=u,n("jsonld-keyword","meta");for(;null!=(b=d.next())&&(b!=a||c);)c=!c&&"\\"==b;c||(e.tokenize=u);return n("string","string")}}function J(a,d){for(var b=!1,c;c=a.next();){if("/"==c&&b){d.tokenize=u;break}b="*"==c}return n("comment","comment")}function Q(a,d){for(var b=!1,c;null!=(c=a.next());){if(!b&&("`"==c||"$"==c&&a.eat("{"))){d.tokenize=u;break}b=!b&&"\\"==c}return n("quasi","string-2",a.current())}function S(a,d){d.fatArrowAt&&(d.fatArrowAt= null);var b=a.string.indexOf("=>",a.start);if(!(0>b)){for(var c=0,r=!1,b=b-1;0<=b;--b){var T=a.string.charAt(b),f=ra.indexOf(T);if(0<=f&&3>f){if(!c){++b;break}if(0==--c)break}else if(3<=f&&6>f)++c;else if(R.test(T))r=!0;else{if(/["'\/]/.test(T))return;if(r&&!c){++b;break}}}r&&!c&&(d.fatArrowAt=b)}}function ca(a,d,b,c,r,f){this.indented=a;this.column=d;this.type=b;this.prev=r;this.info=f;null!=c&&(this.align=c)}function f(){for(var a=arguments.length-1;0<=a;a--)H.push(arguments[a])}function b(){f.apply(null, arguments);return!0}function v(a){function d(b){for(;b;b=b.next)if(b.name==a)return!0;return!1}var b=l;b.context?(i="def",d(b.localVars)||(b.localVars={name:a,next:b.localVars})):!d(b.globalVars)&&p.globalVars&&(b.globalVars={name:a,next:b.globalVars})}function w(){l.context={prev:l.context,vars:l.localVars};l.localVars=sa}function x(){l.localVars=l.context.vars;l.context=l.context.prev}function g(a,b){var e=function(){var c=l,e=c.indented;if("stat"==c.lexical.type)e=c.lexical.indented;else for(var f= c.lexical;f&&")"==f.type&&f.align;f=f.prev)e=f.indented;c.lexical=new ca(e,t.column(),a,null,c.lexical,b)};e.lex=!0;return e}function h(){var a=l;a.lexical.prev&&(")"==a.lexical.type&&(a.indented=a.lexical.indented),a.lexical=a.lexical.prev)}function j(a){function d(e){return e==a?b():";"==a?f():b(d)}return d}function o(a,d){return"var"==a?b(g("vardef",d.length),U,j(";"),h):"keyword a"==a?b(g("form"),k,o,h):"keyword b"==a?b(g("form"),o,h):"{"==a?b(g("}"),V,h):";"==a?b():"if"==a?("else"==l.lexical.info&& l.cc[l.cc.length-1]==h&&l.cc.pop()(),b(g("form"),k,o,h,da)):"function"==a?b(s):"for"==a?b(g("form"),ea,o,h):"variable"==a?b(g("stat"),ta):"switch"==a?b(g("form"),k,g("}","switch"),j("{"),V,h,h):"case"==a?b(k,j(":")):"default"==a?b(j(":")):"catch"==a?b(g("form"),w,j("("),W,j(")"),o,h,x):"module"==a?b(g("form"),w,ua,x,h):"class"==a?b(g("form"),va,h):"export"==a?b(g("form"),wa,h):"import"==a?b(g("form"),xa,h):f(g("stat"),k,j(";"),h)}function k(a){return fa(a,!1)}function q(a){return fa(a,!0)}function fa(a, d){if(l.fatArrowAt==t.start){var e=d?ga:ha;if("("==a)return b(w,g(")"),E(y,")"),h,j("=>"),e,x);if("variable"==a)return f(w,y,j("=>"),e,x)}e=d?X:M;return ya.hasOwnProperty(a)?b(e):"function"==a?b(s,e):"keyword c"==a?b(d?ia:Y):"("==a?b(g(")"),Y,N,j(")"),h,e):"operator"==a||"spread"==a?b(d?q:k):"["==a?b(g("]"),za,h,e):"{"==a?F(Aa,"}",null,e):"quasi"==a?f(O,e):b()}function Y(a){return a.match(/[;\}\)\],]/)?f():f(k)}function ia(a){return a.match(/[;\}\)\],]/)?f():f(q)}function M(a,d){return","==a?b(k): X(a,d,!1)}function X(a,d,e){var c=!1==e?M:X,r=!1==e?k:q;if("=>"==a)return b(w,e?ga:ha,x);if("operator"==a)return/\+\+|--/.test(d)?b(c):"?"==d?b(k,j(":"),r):b(r);if("quasi"==a)return f(O,c);if(";"!=a){if("("==a)return F(q,")","call",c);if("."==a)return b(Ba,c);if("["==a)return b(g("]"),Y,j("]"),h,c)}}function O(a,d){return"quasi"!=a?f():"${"!=d.slice(d.length-2)?b(O):b(k,Ca)}function Ca(a){if("}"==a)return i="string-2",l.tokenize=Q,b(O)}function ha(a){S(t,l);return f("{"==a?o:k)}function ga(a){S(t, l);return f("{"==a?o:q)}function ta(a){return":"==a?b(h,o):f(M,j(";"),h)}function Ba(a){if("variable"==a)return i="property",b()}function Aa(a,d){if("variable"==a||"keyword"==C)return i="property","get"==d||"set"==d?b(Da):b(G);if("number"==a||"string"==a)return i=L?"property":C+" property",b(G);if("jsonld-keyword"==a)return b(G);if("["==a)return b(k,j("]"),G)}function Da(a){if("variable"!=a)return f(G);i="property";return b(s)}function G(a){if(":"==a)return b(q);if("("==a)return f(s)}function E(a, d){function e(c){return","==c?(c=l.lexical,"call"==c.info&&(c.pos=(c.pos||0)+1),b(a,e)):c==d?b():b(j(d))}return function(c){return c==d?b():f(a,e)}}function F(a,d,e){for(var c=3;c!?|~^]/,qa=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/, D,I,ra="([{}])",ya={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,"this":!0,"jsonld-keyword":!0};H=i=l=null;C=t=void 0;var sa={name:"this",next:{name:"arguments"}};h.lex=!0;return{startState:function(a){a={tokenize:u,lastType:"sof",cc:[],lexical:new ca((a||0)-A,0,"block",!1),localVars:p.localVars,context:p.localVars&&{vars:p.localVars},indented:0};p.globalVars&&"object"==typeof p.globalVars&&(a.globalVars=p.globalVars);return a},token:function(a,b){a.sol()&&(b.lexical.hasOwnProperty("align")|| (b.lexical.align=!1),b.indented=a.indentation(),S(a,b));if(b.tokenize!=J&&a.eatSpace())return null;var e=b.tokenize(a,b);if("comment"==D)return e;b.lastType="operator"==D&&("++"==I||"--"==I)?"incdec":D;var c;a:{var f=D,h=I,g=b.cc;l=b;t=a;i=null;H=g;C=e;b.lexical.hasOwnProperty("align")||(b.lexical.align=!0);for(;;)if((g.length?g.pop():B?k:o)(f,h)){for(;g.length&&g[g.length-1].lex;)g.pop()();if(i){c=i;break a}if(c="variable"==f)b:{for(c=b.localVars;c;c=c.next)if(c.name==h){c=!0;break b}for(f=b.context;f;f= f.prev)for(c=f.vars;c;c=c.next)if(c.name==h){c=!0;break b}c=void 0}if(c){c="variable-2";break a}c=e;break a}}return c},indent:function(a,b){if(a.tokenize==J)return m.Pass;if(a.tokenize!=u)return 0;var e=b&&b.charAt(0),c=a.lexical;if(!/^\s*else\b/.test(b))for(var f=a.cc.length-1;0<=f;--f){var g=a.cc[f];if(g==h)c=c.prev;else if(g!=da)break}"stat"==c.type&&"}"==e&&(c=c.prev);na&&(")"==c.type&&"stat"==c.prev.type)&&(c=c.prev);f=c.type;g=e==f;return"vardef"==f?c.indented+("operator"==a.lastType||","== a.lastType?c.info+1:0):"form"==f&&"{"==e?c.indented:"form"==f?c.indented+A:"stat"==f?c.indented+("operator"==a.lastType||","==a.lastType||K.test(b.charAt(0))||/[,.]/.test(b.charAt(0))?na||A:0):"switch"==c.info&&!g&&!1!=p.doubleIndentSwitch?c.indented+(/^(?:case|default)\b/.test(b)?A:2*A):c.align?c.column+(g?0:1):c.indented+(g?0:A)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:B?null:"/*",blockCommentEnd:B?null:"*/",lineComment:B?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``", helperType:B?"json":"javascript",jsonldMode:L,jsonMode:B}});m.registerHelper("wordChars","javascript",/[\w$]/);m.defineMIME("text/javascript","javascript");m.defineMIME("text/ecmascript","javascript");m.defineMIME("application/javascript","javascript");m.defineMIME("application/x-javascript","javascript");m.defineMIME("application/ecmascript","javascript");m.defineMIME("application/json",{name:"javascript",json:!0});m.defineMIME("application/x-json",{name:"javascript",json:!0});m.defineMIME("application/ld+json", {name:"javascript",jsonld:!0});m.defineMIME("text/typescript",{name:"javascript",typescript:!0});m.defineMIME("application/typescript",{name:"javascript",typescript:!0})});PK!OSSQabilian/web/resources/ckeditor/samples/toolbarconfigurator/lib/codemirror/neo.css/* neo theme for codemirror */ /* Color scheme */ .cm-s-neo.CodeMirror { background-color:#ffffff; color:#2e383c; line-height:1.4375; } .cm-s-neo .cm-comment {color:#75787b} .cm-s-neo .cm-keyword, .cm-s-neo .cm-property {color:#1d75b3} .cm-s-neo .cm-atom,.cm-s-neo .cm-number {color:#75438a} .cm-s-neo .cm-node,.cm-s-neo .cm-tag {color:#9c3328} .cm-s-neo .cm-string {color:#b35e14} .cm-s-neo .cm-variable,.cm-s-neo .cm-qualifier {color:#047d65} /* Editor styling */ .cm-s-neo pre { padding:0; } .cm-s-neo .CodeMirror-gutters { border:none; border-right:10px solid transparent; background-color:transparent; } .cm-s-neo .CodeMirror-linenumber { padding:0; color:#e0e2e5; } .cm-s-neo .CodeMirror-guttermarker { color: #1d75b3; } .cm-s-neo .CodeMirror-guttermarker-subtle { color: #e0e2e5; } PK!YWabilian/web/resources/ckeditor/samples/toolbarconfigurator/lib/codemirror/show-hint.css.CodeMirror-hints { position: absolute; z-index: 10; overflow: hidden; list-style: none; margin: 0; padding: 2px; -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2); -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2); box-shadow: 2px 3px 5px rgba(0,0,0,.2); border-radius: 3px; border: 1px solid silver; background: white; font-size: 90%; font-family: monospace; max-height: 20em; overflow-y: auto; } .CodeMirror-hint { margin: 0; padding: 0 4px; border-radius: 2px; max-width: 19em; overflow: hidden; white-space: pre; color: black; cursor: pointer; } li.CodeMirror-hint-active { background: #08f; color: white; } PK!:||Vabilian/web/resources/ckeditor/samples/toolbarconfigurator/lib/codemirror/show-hint.js(function(f){"object"==typeof exports&&"object"==typeof module?f(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],f):f(CodeMirror)})(function(f){function m(a,b){this.cm=a;this.options=this.buildOptions(b);this.widget=null;this.tick=this.debounce=0;this.startPos=this.cm.getCursor();this.startLen=this.cm.getLine(this.startPos.line).length;var c=this;a.on("cursorActivity",this.activityFunc=function(){c.cursorActivity()})}function t(a,b){function c(a, c){var d;d="string"!=typeof c?function(a){return c(a,b)}:e.hasOwnProperty(c)?e[c]:c;f[a]=d}var e={Up:function(){b.moveFocus(-1)},Down:function(){b.moveFocus(1)},PageUp:function(){b.moveFocus(-b.menuSize()+1,!0)},PageDown:function(){b.moveFocus(b.menuSize()-1,!0)},Home:function(){b.setFocus(0)},End:function(){b.setFocus(b.length-1)},Enter:b.pick,Tab:b.pick,Esc:b.close},d=a.options.customKeys,f=d?{}:e;if(d)for(var g in d)d.hasOwnProperty(g)&&c(g,d[g]);if(d=a.options.extraKeys)for(g in d)d.hasOwnProperty(g)&& c(g,d[g]);return f}function s(a,b){for(;b&&b!=a;){if("LI"===b.nodeName.toUpperCase()&&b.parentNode==a)return b;b=b.parentNode}}function l(a,b){this.completion=a;this.data=b;this.picked=!1;var c=this,e=a.cm,d=this.hints=document.createElement("ul");d.className="CodeMirror-hints";this.selectedHint=b.selectedHint||0;for(var k=b.list,g=0;gi&&(d.style.height=i-5+"px",d.style.top=(p=g.bottom-h.top)+"px",i=e.getCursor(),b.from.ch!=i.ch&&(g=e.cursorCoords(i),d.style.left=(o=g.left)+"px",h=d.getBoundingClientRect()))}i=h.right-j;0j&&(d.style.width=j-5+"px",i-=h.right-h.left-j),d.style.left=(o=g.left-i)+"px");e.addKeyMap(this.keyMap=t(a,{moveFocus:function(a,b){c.changeActive(c.selectedHint+a,b)},setFocus:function(a){c.changeActive(a)}, menuSize:function(){return c.screenAmount()},length:k.length,close:function(){a.close()},pick:function(){c.pick()},data:b}));if(a.options.closeOnUnfocus){var m;e.on("blur",this.onBlur=function(){m=setTimeout(function(){a.close()},100)});e.on("focus",this.onFocus=function(){clearTimeout(m)})}var n=e.getScrollInfo();e.on("scroll",this.onScroll=function(){var c=e.getScrollInfo(),b=e.getWrapperElement().getBoundingClientRect(),f=p+n.top-c.top,g=f-(window.pageYOffset||(document.documentElement||document.body).scrollTop); l||(g=g+d.offsetHeight);if(g<=b.top||g>=b.bottom)return a.close();d.style.top=f+"px";d.style.left=o+n.left-c.left+"px"});f.on(d,"dblclick",function(a){if((a=s(d,a.target||a.srcElement))&&a.hintId!=null){c.changeActive(a.hintId);c.pick()}});f.on(d,"click",function(b){if((b=s(d,b.target||b.srcElement))&&b.hintId!=null){c.changeActive(b.hintId);a.options.completeOnSingleClick&&c.pick()}});f.on(d,"mousedown",function(){setTimeout(function(){e.focus()},20)});f.signal(b,"select",k[0],d.firstChild);return!0} var u="CodeMirror-hint",q="CodeMirror-hint-active";f.showHint=function(a,b,c){if(!b)return a.showHint(c);c&&c.async&&(b.async=!0);b={hint:b};if(c)for(var e in c)b[e]=c[e];return a.showHint(b)};f.defineExtension("showHint",function(a){1=this.data.list.length?a=b?this.data.list.length-1:0:0>a&&(a=b?0:this.data.list.length-1); if(this.selectedHint!=a){var c=this.hints.childNodes[this.selectedHint];c.className=c.className.replace(" "+q,"");c=this.hints.childNodes[this.selectedHint=a];c.className+=" "+q;c.offsetTopthis.hints.scrollTop+this.hints.clientHeight&&(this.hints.scrollTop=c.offsetTop+c.offsetHeight-this.hints.clientHeight+3);f.signal(this.data,"select",this.data.list[this.selectedHint],c)}},screenAmount:function(){return Math.floor(this.hints.clientHeight/ this.hints.firstChild.offsetHeight)||1}};f.registerHelper("hint","auto",function(a,b){var c=a.getHelpers(a.getCursor(),"hint");if(c.length)for(var e=0;e,]/,closeOnUnfocus:!0,completeOnSingleClick:!1,container:null,customKeys:null,extraKeys:null};f.defineOption("hintOptions",null)});PK!z@Kw4w45abilian/web/resources/ckeditor/skins/moono/dialog.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}PK!888abilian/web/resources/ckeditor/skins/moono/dialog_ie.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}PK!(Z3:3:9abilian/web/resources/ckeditor/skins/moono/dialog_ie7.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_title{zoom:1}.cke_dialog_footer{border-top:1px solid #bfbfbf}.cke_dialog_footer_buttons{position:static}.cke_dialog_footer_buttons a.cke_dialog_ui_button{vertical-align:top}.cke_dialog .cke_resizer_ltr{padding-left:4px}.cke_dialog .cke_resizer_rtl{padding-right:4px}.cke_dialog_ui_input_text,.cke_dialog_ui_input_password,.cke_dialog_ui_input_textarea,.cke_dialog_ui_input_select{padding:0!important}.cke_dialog_ui_checkbox_input,.cke_dialog_ui_ratio_input,.cke_btn_reset,.cke_btn_locked,.cke_btn_unlocked{border:1px solid transparent!important}PK!T(J889abilian/web/resources/ckeditor/skins/moono/dialog_ie8.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{display:block}PK!~#8#8>abilian/web/resources/ckeditor/skins/moono/dialog_iequirks.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_dialog{visibility:visible}.cke_dialog_body{z-index:1;background:#eaeaea;border:1px solid #b2b2b2;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_dialog strong{font-weight:bold}.cke_dialog_title{font-weight:bold;font-size:13px;cursor:move;position:relative;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #999;padding:6px 10px;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_dialog_spinner{border-radius:50%;width:12px;height:12px;overflow:hidden;text-indent:-9999em;border-top:2px solid rgba(102,102,102,0.2);border-right:2px solid rgba(102,102,102,0.2);border-bottom:2px solid rgba(102,102,102,0.2);border-left:2px solid rgba(102,102,102,1);-webkit-animation:dialog_spinner 1s infinite linear;animation:dialog_spinner 1s infinite linear}.cke_browser_ie8 .cke_dialog_spinner,.cke_browser_ie9 .cke_dialog_spinner{background:url(images/spinner.gif) center top no-repeat;width:16px;height:16px;border:0}@-webkit-keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes dialog_spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.cke_dialog_contents{background-color:#fff;overflow:auto;padding:15px 10px 5px 10px;margin-top:30px;border-top:1px solid #bfbfbf;border-radius:0 0 3px 3px}.cke_dialog_contents_body{overflow:auto;padding:17px 10px 5px 10px;margin-top:22px}.cke_dialog_footer{text-align:right;position:relative;border:0;outline:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;border-radius:0 0 2px 2px;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_rtl .cke_dialog_footer{text-align:left}.cke_hc .cke_dialog_footer{outline:0;border-top:1px solid #fff}.cke_dialog .cke_resizer{margin-top:22px}.cke_dialog .cke_resizer_rtl{margin-left:5px}.cke_dialog .cke_resizer_ltr{margin-right:5px}.cke_dialog_tabs{height:24px;display:inline-block;margin:5px 0 0;position:absolute;z-index:2;left:10px}.cke_rtl .cke_dialog_tabs{right:10px}a.cke_dialog_tab{height:16px;padding:4px 8px;margin-right:3px;display:inline-block;cursor:pointer;line-height:16px;outline:0;color:#595959;border:1px solid #bfbfbf;border-radius:3px 3px 0 0;background:#d4d4d4;background-image:linear-gradient(to bottom,#fafafa,#ededed);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fafafa',endColorstr='#ededed')}.cke_rtl a.cke_dialog_tab{margin-right:0;margin-left:3px}a.cke_dialog_tab:hover,a.cke_dialog_tab:focus{background:#ebebeb;background:linear-gradient(to bottom,#ebebeb 0,#dfdfdf 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ebebeb',endColorstr='#dfdfdf',GradientType=0)}a.cke_dialog_tab_selected{background:#fff;color:#383838;border-bottom-color:#fff;cursor:default;filter:none}a.cke_dialog_tab_selected:hover,a.cke_dialog_tab_selected:focus,{background:#ededed;background:linear-gradient(to bottom,#ededed 0,#fff 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ededed',endColorstr='#ffffff',GradientType=0)}.cke_hc a.cke_dialog_tab:hover,.cke_hc a.cke_dialog_tab:focus,.cke_hc a.cke_dialog_tab_selected{border:3px solid;padding:2px 6px}a.cke_dialog_tab_disabled{color:#bababa;cursor:default}.cke_single_page .cke_dialog_tabs{display:none}.cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:0;border-top:0}a.cke_dialog_close_button{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:4px;z-index:5;opacity:.8;filter:alpha(opacity = 80)}.cke_dialog_close_button:hover{opacity:1;filter:alpha(opacity = 100)}.cke_hidpi .cke_dialog_close_button{background-image:url(images/hidpi/close.png);background-size:16px}.cke_dialog_close_button span{display:none}.cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px}.cke_ltr .cke_dialog_close_button{right:5px}.cke_rtl .cke_dialog_close_button{left:6px}.cke_dialog_close_button{top:4px}div.cke_disabled .cke_dialog_ui_labeled_content div *{background-color:#ddd;cursor:default}.cke_dialog_ui_vbox table,.cke_dialog_ui_hbox table{margin:auto}.cke_dialog_ui_vbox_child{padding:5px 0}.cke_dialog_ui_hbox{width:100%}.cke_dialog_ui_hbox_first,.cke_dialog_ui_hbox_child,.cke_dialog_ui_hbox_last{vertical-align:top}.cke_ltr .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px}.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px}.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_ltr .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-right:5px}.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_footer_buttons .cke_dialog_ui_hbox_child{padding-left:5px;padding-right:0}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:1px solid}textarea.cke_dialog_ui_input_textarea{overflow:auto;resize:none}input.cke_dialog_ui_input_text,input.cke_dialog_ui_input_password,textarea.cke_dialog_ui_input_textarea{background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:4px 6px;outline:0;width:100%;*width:95%;box-sizing:border-box;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}input.cke_dialog_ui_input_text:hover,input.cke_dialog_ui_input_password:hover,textarea.cke_dialog_ui_input_textarea:hover{border:1px solid #aeb3b9;border-top-color:#a0a6ad}input.cke_dialog_ui_input_text:focus,input.cke_dialog_ui_input_password:focus,textarea.cke_dialog_ui_input_textarea:focus,select.cke_dialog_ui_input_select:focus{outline:0;border:1px solid #139ff7;border-top-color:#1392e9}a.cke_dialog_ui_button{display:inline-block;*display:inline;*zoom:1;padding:4px 0;margin:0;text-align:center;color:#333;vertical-align:middle;cursor:pointer;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}span.cke_dialog_ui_button{padding:0 10px}a.cke_dialog_ui_button:hover{border-color:#9e9e9e;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}a.cke_dialog_ui_button:focus,a.cke_dialog_ui_button:active{border-color:#969696;outline:0;box-shadow:0 0 6px rgba(0,0,0,.4) inset}.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button:focus,.cke_hc a.cke_dialog_ui_button:active{border:3px solid;padding-top:1px;padding-bottom:1px}.cke_hc a.cke_dialog_ui_button:hover span,.cke_hc a.cke_dialog_ui_button:focus span,.cke_hc a.cke_dialog_ui_button:active span{padding-left:10px;padding-right:10px}.cke_dialog_footer_buttons a.cke_dialog_ui_button span{color:inherit;font-size:12px;font-weight:bold;line-height:18px;padding:0 12px}a.cke_dialog_ui_button_ok{color:#fff;text-shadow:0 -1px 0 #55830c;border-color:#62a60a #62a60a #4d9200;background:#69b10b;background-image:linear-gradient(to bottom,#9ad717,#69b10b);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#9ad717',endColorstr='#69b10b')}a.cke_dialog_ui_button_ok:hover{border-color:#5b9909 #5b9909 #478500;background:#88be14;background:linear-gradient(to bottom,#88be14 0,#5d9c0a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#88be14',endColorstr='#5d9c0a',GradientType=0)}a.cke_dialog_ui_button_ok.cke_disabled{border-color:#7d9f51;background:#8dad62;background-image:-webkit-gradient(linear,0 0,0 100%,from(#b3d271),to(#8dad62));background-image:-webkit-linear-gradient(top,#b3d271,#8dad62);background-image:-o-linear-gradient(top,#b3d271,#8dad62);background-image:linear-gradient(to bottom,#b3d271,#8dad62);background-image:-moz-linear-gradient(top,#b3d271,#8dad62);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#B3D271',endColorstr='#8DAD62')}a.cke_dialog_ui_button_ok.cke_disabled span{color:#e0e8d1}a.cke_dialog_ui_button span{text-shadow:0 1px 0 #fff}a.cke_dialog_ui_button_ok span{text-shadow:0 -1px 0 #55830c}span.cke_dialog_ui_button{cursor:pointer}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active,a.cke_dialog_ui_button_cancel:focus,a.cke_dialog_ui_button_cancel:active{border-width:2px;padding:3px 0}a.cke_dialog_ui_button_ok:focus,a.cke_dialog_ui_button_ok:active{border-color:#568c0a}a.cke_dialog_ui_button_ok.cke_disabled:focus,a.cke_dialog_ui_button_ok.cke_disabled:active{border-color:#6f8c49}a.cke_dialog_ui_button_ok:focus span,a.cke_dialog_ui_button_ok:active span,a.cke_dialog_ui_button_cancel:focus span,a.cke_dialog_ui_button_cancel:active span{padding:0 11px}.cke_dialog_footer_buttons{display:inline-table;margin:5px;width:auto;position:relative;vertical-align:middle}div.cke_dialog_ui_input_select{display:table}select.cke_dialog_ui_input_select{height:25px;line-height:25px;background-color:#fff;border:1px solid #c9cccf;border-top-color:#aeb3b9;padding:3px 3px 3px 6px;outline:0;border-radius:3px;box-shadow:0 1px 2px rgba(0,0,0,.15) inset}.cke_dialog_ui_input_file{width:100%;height:25px}.cke_hc .cke_dialog_ui_labeled_content input:focus,.cke_hc .cke_dialog_ui_labeled_content select:focus,.cke_hc .cke_dialog_ui_labeled_content textarea:focus{outline:1px dotted}.cke_dialog .cke_dark_background{background-color:#dedede}.cke_dialog .cke_light_background{background-color:#ebebeb}.cke_dialog .cke_centered{text-align:center}.cke_dialog a.cke_btn_reset{float:right;background:url(images/refresh.png) top left no-repeat;width:16px;height:16px;border:1px none;font-size:1px}.cke_hidpi .cke_dialog a.cke_btn_reset{background-size:16px;background-image:url(images/hidpi/refresh.png)}.cke_rtl .cke_dialog a.cke_btn_reset{float:left}.cke_dialog a.cke_btn_locked,.cke_dialog a.cke_btn_unlocked{float:left;width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px}.cke_dialog a.cke_btn_locked .cke_icon{display:none}.cke_rtl .cke_dialog a.cke_btn_locked,.cke_rtl .cke_dialog a.cke_btn_unlocked{float:right}.cke_dialog a.cke_btn_locked{background-image:url(images/lock.png)}.cke_dialog a.cke_btn_unlocked{background-image:url(images/lock-open.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked,.cke_hidpi .cke_dialog a.cke_btn_locked{background-size:16px}.cke_hidpi .cke_dialog a.cke_btn_locked{background-image:url(images/hidpi/lock.png)}.cke_hidpi .cke_dialog a.cke_btn_unlocked{background-image:url(images/hidpi/lock-open.png)}.cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer}.cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white}.cke_dialog .ImagePreviewBox table td{white-space:normal}.cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity = 90);background-color:#e4e4e4}.cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white}.cke_dialog .cke_pastetext{width:346px;height:170px}.cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none}.cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid #aeb3b9;border-radius:3px}.cke_dialog .cke_hand{cursor:pointer}.cke_disabled{color:#a0a0a0}.cke_dialog_body .cke_label{display:none}.cke_dialog_body label{display:inline;margin-bottom:auto;cursor:default}.cke_dialog_body label.cke_required{font-weight:bold}a.cke_smile{overflow:hidden;display:block;text-align:center;padding:.3em 0}a.cke_smile img{vertical-align:middle}a.cke_specialchar{cursor:inherit;display:block;height:1.25em;padding:.2em .3em;text-align:center}a.cke_smile,a.cke_specialchar{border:1px solid transparent}a.cke_smile:hover,a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:hover,a.cke_specialchar:focus,a.cke_specialchar:active{background:#fff;outline:0}a.cke_smile:hover,a.cke_specialchar:hover{border-color:#888}a.cke_smile:focus,a.cke_smile:active,a.cke_specialchar:focus,a.cke_specialchar:active{border-color:#139ff7}.cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px}.cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px}.cke_dialog_ui_checkbox_input:focus,.cke_dialog_ui_radio_input:focus,.cke_btn_over{outline:1px dotted #696969}.cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity = 0);width:100%;height:100%}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px}.cke_rtl div.cke_dialog_ui_input_text,.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px}.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px}.cke_rtl .cke_dialog_ui_vbox_child,.cke_rtl .cke_dialog_ui_hbox_child,.cke_rtl .cke_dialog_ui_hbox_first,.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important}.cke_hc .cke_dialog_title,.cke_hc .cke_dialog_footer,.cke_hc a.cke_dialog_tab,.cke_hc a.cke_dialog_ui_button,.cke_hc a.cke_dialog_ui_button:hover,.cke_hc a.cke_dialog_ui_button_ok,.cke_hc a.cke_dialog_ui_button_ok:hover{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_hc div.cke_dialog_ui_input_text,.cke_hc div.cke_dialog_ui_input_password,.cke_hc div.cke_dialog_ui_input_textarea,.cke_hc div.cke_dialog_ui_input_select,.cke_hc div.cke_dialog_ui_input_file{border:0}.cke_dialog_footer{filter:""}PK!75abilian/web/resources/ckeditor/skins/moono/editor.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}PK!e|#ܡܡ;abilian/web/resources/ckeditor/skins/moono/editor_gecko.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}.cke_bottom{padding-bottom:3px}.cke_combo_text{margin-bottom:-1px;margin-top:1px}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}PK!1rr8abilian/web/resources/ckeditor/skins/moono/editor_ie.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}PK!ZZ9abilian/web/resources/ckeditor/skins/moono/editor_ie7.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_toolbox{display:inline-block;padding-bottom:5px;height:100%}.cke_rtl .cke_toolbox{padding-bottom:0}.cke_toolbar{margin-bottom:5px}.cke_rtl .cke_toolbar{margin-bottom:0}.cke_toolgroup{height:26px}.cke_toolgroup,.cke_combo{position:relative}a.cke_button{float:none;vertical-align:top}.cke_toolbar_separator{display:inline-block;float:none;vertical-align:top;background-color:#c0c0c0}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_rtl .cke_button_arrow{padding-top:8px;margin-right:2px}.cke_rtl .cke_combo_inlinelabel{display:table-cell;vertical-align:middle}.cke_menubutton{display:block;height:24px}.cke_menubutton_inner{display:block;position:relative}.cke_menubutton_icon{height:16px;width:16px}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:inline-block}.cke_menubutton_label{width:auto;vertical-align:top;line-height:24px;height:24px;margin:0 10px 0 0}.cke_menuarrow{width:5px;height:6px;padding:0;position:absolute;right:8px;top:10px;background-position:0 0}.cke_rtl .cke_menubutton_icon{position:absolute;right:0;top:0}.cke_rtl .cke_menubutton_label{float:right;clear:both;margin:0 24px 0 10px}.cke_hc .cke_rtl .cke_menubutton_label{margin-right:0}.cke_rtl .cke_menuarrow{left:8px;right:auto;background-position:0 -24px}.cke_hc .cke_menuarrow{top:5px;padding:0 5px}.cke_rtl input.cke_dialog_ui_input_text,.cke_rtl input.cke_dialog_ui_input_password{position:relative}.cke_wysiwyg_div{padding-top:0!important;padding-bottom:0!important}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}PK!8h!!9abilian/web/resources/ckeditor/skins/moono/editor_ie8.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_toolbox_collapser .cke_arrow{border-width:4px}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{border-width:3px}.cke_toolbox_collapser .cke_arrow{margin-top:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}PK!>abilian/web/resources/ckeditor/skins/moono/editor_iequirks.css/* Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. For licensing, see LICENSE.md or http://ckeditor.com/license */ .cke_reset{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none}.cke_reset_all,.cke_reset_all *,.cke_reset_all a,.cke_reset_all textarea{margin:0;padding:0;border:0;background:transparent;text-decoration:none;width:auto;height:auto;vertical-align:baseline;box-sizing:content-box;position:static;transition:none;border-collapse:collapse;font:normal normal normal 12px Arial,Helvetica,Tahoma,Verdana,Sans-Serif;color:#000;text-align:left;white-space:nowrap;cursor:auto;float:none}.cke_reset_all .cke_rtl *{text-align:right}.cke_reset_all iframe{vertical-align:inherit}.cke_reset_all textarea{white-space:pre-wrap}.cke_reset_all textarea,.cke_reset_all input[type="text"],.cke_reset_all input[type="password"]{cursor:text}.cke_reset_all textarea[disabled],.cke_reset_all input[type="text"][disabled],.cke_reset_all input[type="password"][disabled]{cursor:default}.cke_reset_all fieldset{padding:10px;border:2px groove #e0dfe3}.cke_reset_all select{box-sizing:border-box}.cke_reset_all table{table-layout:auto}.cke_chrome{display:block;border:1px solid #b6b6b6;padding:0;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_inner{display:block;-webkit-touch-callout:none;background:#fff;padding:0}.cke_float{border:0}.cke_float .cke_inner{padding-bottom:0}.cke_top,.cke_contents,.cke_bottom{display:block;overflow:hidden}.cke_top{border-bottom:1px solid #b6b6b6;padding:6px 8px 2px;white-space:normal;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_float .cke_top{border:1px solid #b6b6b6;border-bottom-color:#999}.cke_bottom{padding:6px 8px 2px;position:relative;border-top:1px solid #bfbfbf;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#ebebeb,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ebebeb',endColorstr='#cfd1cf')}.cke_browser_ios .cke_contents{overflow-y:auto;-webkit-overflow-scrolling:touch}.cke_resizer{width:0;height:0;overflow:hidden;width:0;height:0;overflow:hidden;border-width:10px 10px 0 0;border-color:transparent #666 transparent transparent;border-style:dashed solid dashed dashed;font-size:0;vertical-align:bottom;margin-top:6px;margin-bottom:2px;box-shadow:0 1px 0 rgba(255,255,255,.3)}.cke_hc .cke_resizer{font-size:15px;width:auto;height:auto;border-width:0}.cke_resizer_ltr{cursor:se-resize;float:right;margin-right:-4px}.cke_resizer_rtl{border-width:10px 0 0 10px;border-color:transparent transparent transparent #a5a5a5;border-style:dashed dashed dashed solid;cursor:sw-resize;float:left;margin-left:-4px;right:auto}.cke_wysiwyg_div{display:block;height:100%;overflow:auto;padding:0 8px;outline-style:none;box-sizing:border-box}.cke_panel{visibility:visible;width:120px;height:100px;overflow:hidden;background-color:#fff;border:1px solid #b6b6b6;border-bottom-color:#999;border-radius:3px;box-shadow:0 0 3px rgba(0,0,0,.15)}.cke_menu_panel{padding:0;margin:0}.cke_combopanel{width:150px;height:170px}.cke_panel_frame{width:100%;height:100%;font-size:12px;overflow:auto;overflow-x:hidden}.cke_panel_container{overflow-y:auto;overflow-x:hidden}.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap}.cke_panel_listItem{margin:0;padding-bottom:1px}.cke_panel_listItem a{padding:3px 4px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;border-radius:2px}* html .cke_panel_listItem a{width:100%;color:#000}*:first-child+html .cke_panel_listItem a{color:#000}.cke_panel_listItem.cke_selected a{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_hc .cke_panel_listItem a{border-style:none}.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border:2px solid;padding:1px 2px}.cke_panel_grouptitle{cursor:default;font-size:11px;font-weight:bold;white-space:nowrap;margin:0;padding:4px 6px;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.75);border-bottom:1px solid #b6b6b6;border-radius:2px 2px 0 0;box-shadow:0 1px 0 #fff inset;background:#cfd1cf;background-image:linear-gradient(to bottom,#f5f5f5,#cfd1cf);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f5f5f5',endColorstr='#cfd1cf')}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:0;margin-bottom:0}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left}.cke_rtl span.cke_colorbox{float:right}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;width:12px;height:12px}.cke_rtl a.cke_colorbox{float:right}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#b6b6b6 1px solid;background-color:#e5e5e5}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#b6b6b6 1px solid;background-color:#e5e5e5}.cke_toolbar{float:left}.cke_rtl .cke_toolbar{float:right}.cke_toolgroup{float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_hc .cke_toolgroup{border:0;margin-right:10px;margin-bottom:10px}.cke_rtl .cke_toolgroup{float:right;margin-left:6px;margin-right:0}a.cke_button{display:inline-block;height:18px;padding:4px 6px;outline:0;cursor:default;float:left;border:0}.cke_ltr .cke_button:last-child,.cke_rtl .cke_button:first-child{border-radius:0 2px 2px 0}.cke_ltr .cke_button:first-child,.cke_rtl .cke_button:last-child{border-radius:2px 0 0 2px}.cke_rtl .cke_button{float:right}.cke_hc .cke_button{border:1px solid black;padding:3px 5px;margin:-2px 4px 0 -2px}a.cke_button_on{box-shadow:0 1px 5px rgba(0,0,0,.6) inset,0 1px 0 rgba(0,0,0,.2);background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc a.cke_button_disabled:hover,.cke_hc a.cke_button_disabled:focus,.cke_hc a.cke_button_disabled:active{border-width:3px;padding:1px 3px}.cke_button_disabled .cke_button_icon{opacity:.3}.cke_hc .cke_button_disabled{opacity:.5}a.cke_button_on:hover,a.cke_button_on:focus,a.cke_button_on:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}a.cke_button_off:hover,a.cke_button_off:focus,a.cke_button_off:active,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{box-shadow:0 0 1px rgba(0,0,0,.3) inset;background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_button_icon{cursor:inherit;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;float:left;display:inline-block}.cke_rtl .cke_button_icon{float:right}.cke_hc .cke_button_icon{display:none}.cke_button_label{display:none;padding-left:3px;margin-top:1px;line-height:17px;vertical-align:middle;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5)}.cke_rtl .cke_button_label{padding-right:3px;padding-left:0;float:right}.cke_hc .cke_button_label{padding:0;display:inline-block;font-size:12px}.cke_button_arrow{display:inline-block;margin:8px 0 0 1px;width:0;height:0;cursor:default;vertical-align:top;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_rtl .cke_button_arrow{margin-right:5px;margin-left:0}.cke_hc .cke_button_arrow{font-size:10px;margin:3px -2px 0 3px;width:auto;border:0}.cke_toolbar_separator{float:left;background-color:#c0c0c0;background-color:rgba(0,0,0,.2);margin:5px 2px 0;height:18px;width:1px;box-shadow:1px 0 1px rgba(255,255,255,.5)}.cke_rtl .cke_toolbar_separator{float:right;box-shadow:-1px 0 1px rgba(255,255,255,.1)}.cke_hc .cke_toolbar_separator{width:0;border-left:1px solid;margin:1px 5px 0 0}.cke_toolbar_break{display:block;clear:left}.cke_rtl .cke_toolbar_break{clear:right}a.cke_toolbox_collapser{width:12px;height:11px;float:right;margin:11px 0 0;font-size:0;cursor:default;text-align:center;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_toolbox_collapser:hover{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc')}.cke_toolbox_collapser.cke_toolbox_collapser_min{margin:0 2px 4px}.cke_rtl .cke_toolbox_collapser{float:left}.cke_toolbox_collapser .cke_arrow{display:inline-block;height:0;width:0;font-size:0;margin-top:1px;border-left:3px solid transparent;border-right:3px solid transparent;border-bottom:3px solid #474747;border-top:3px solid transparent}.cke_toolbox_collapser.cke_toolbox_collapser_min .cke_arrow{margin-top:4px;border-bottom-color:transparent;border-top-color:#474747}.cke_hc .cke_toolbox_collapser .cke_arrow{font-size:8px;width:auto;border:0;margin-top:0;margin-right:2px}.cke_menubutton{display:block}.cke_menuitem span{cursor:default}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#d3d3d3;display:block}.cke_hc .cke_menubutton{padding:2px}.cke_hc .cke_menubutton:hover,.cke_hc .cke_menubutton:focus,.cke_hc .cke_menubutton:active{border:2px solid;padding:0}.cke_menubutton_inner{display:table-row}.cke_menubutton_icon,.cke_menubutton_label,.cke_menuarrow{display:table-cell}.cke_menubutton_icon{background-color:#d7d8d7;opacity:.70;filter:alpha(opacity=70);padding:4px}.cke_hc .cke_menubutton_icon{height:16px;width:0;padding:4px 0}.cke_menubutton:hover .cke_menubutton_icon,.cke_menubutton:focus .cke_menubutton_icon,.cke_menubutton:active .cke_menubutton_icon{background-color:#d0d2d0}.cke_menubutton_disabled:hover .cke_menubutton_icon,.cke_menubutton_disabled:focus .cke_menubutton_icon,.cke_menubutton_disabled:active .cke_menubutton_icon{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_label{padding:0 5px;background-color:transparent;width:100%;vertical-align:middle}.cke_menubutton_disabled .cke_menubutton_label{opacity:.3;filter:alpha(opacity=30)}.cke_menubutton_on{border:1px solid #dedede;background-color:#f2f2f2;box-shadow:0 0 2px rgba(0,0,0,.1) inset}.cke_menubutton_on .cke_menubutton_icon{padding-right:3px}.cke_menubutton:hover,.cke_menubutton:focus,.cke_menubutton:active{background-color:#eff0ef}.cke_panel_frame .cke_menubutton_label{display:none}.cke_menuseparator{background-color:#d3d3d3;height:1px;filter:alpha(opacity=70);opacity:.70}.cke_menuarrow{background-image:url(images/arrow.png);background-position:0 10px;background-repeat:no-repeat;padding:0 5px}.cke_rtl .cke_menuarrow{background-position:5px -13px;background-repeat:no-repeat}.cke_menuarrow span{display:none}.cke_hc .cke_menuarrow span{vertical-align:middle;display:inline}.cke_combo{display:inline-block;float:left}.cke_rtl .cke_combo{float:right}.cke_hc .cke_combo{margin-top:-2px}.cke_combo_label{display:none;float:left;line-height:26px;vertical-align:top;margin-right:5px}.cke_rtl .cke_combo_label{float:right;margin-left:5px;margin-right:0}a.cke_combo_button{cursor:default;display:inline-block;float:left;margin:0 6px 5px 0;border:1px solid #a6a6a6;border-bottom-color:#979797;border-radius:3px;box-shadow:0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset;background:#e4e4e4;background-image:linear-gradient(to bottom,#fff,#e4e4e4);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffff',endColorstr='#e4e4e4')}.cke_combo_off a.cke_combo_button:hover,.cke_combo_off a.cke_combo_button:focus{background:#ccc;background-image:linear-gradient(to bottom,#f2f2f2,#ccc);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#f2f2f2',endColorstr='#cccccc');outline:0}.cke_combo_off a.cke_combo_button:active,.cke_combo_on a.cke_combo_button{border:1px solid #777;box-shadow:0 1px 0 rgba(255,255,255,.5),0 1px 5px rgba(0,0,0,.6) inset;background:#b5b5b5;background-image:linear-gradient(to bottom,#aaa,#cacaca);filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#aaaaaa',endColorstr='#cacaca')}.cke_combo_on a.cke_combo_button:hover,.cke_combo_on a.cke_combo_button:focus,.cke_combo_on a.cke_combo_button:active{box-shadow:0 1px 6px rgba(0,0,0,.7) inset,0 1px 0 rgba(0,0,0,.2)}.cke_rtl .cke_combo_button{float:right;margin-left:5px;margin-right:0}.cke_hc a.cke_combo_button{padding:3px}.cke_hc .cke_combo_on a.cke_combo_button,.cke_hc .cke_combo_off a.cke_combo_button:hover,.cke_hc .cke_combo_off a.cke_combo_button:focus,.cke_hc .cke_combo_off a.cke_combo_button:active{border-width:3px;padding:1px}.cke_combo_text{line-height:26px;padding-left:10px;text-overflow:ellipsis;overflow:hidden;float:left;cursor:default;color:#474747;text-shadow:0 1px 0 rgba(255,255,255,.5);width:60px}.cke_rtl .cke_combo_text{float:right;text-align:right;padding-left:0;padding-right:10px}.cke_hc .cke_combo_text{line-height:18px;font-size:12px}.cke_combo_open{cursor:default;display:inline-block;font-size:0;height:19px;line-height:17px;margin:1px 7px 1px;width:5px}.cke_hc .cke_combo_open{height:12px}.cke_combo_arrow{cursor:default;margin:11px 0 0;float:left;height:0;width:0;font-size:0;border-left:3px solid transparent;border-right:3px solid transparent;border-top:3px solid #474747}.cke_hc .cke_combo_arrow{font-size:10px;width:auto;border:0;margin-top:3px}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{opacity:.3}.cke_path{float:left;margin:-2px 0 2px}a.cke_path_item,span.cke_path_empty{display:inline-block;float:left;padding:3px 4px;margin-right:2px;cursor:default;text-decoration:none;outline:0;border:0;color:#4c4c4c;text-shadow:0 1px 0 #fff;font-weight:bold;font-size:11px}.cke_rtl .cke_path,.cke_rtl .cke_path_item,.cke_rtl .cke_path_empty{float:right}a.cke_path_item:hover,a.cke_path_item:focus,a.cke_path_item:active{background-color:#bfbfbf;color:#333;text-shadow:0 1px 0 rgba(255,255,255,.5);border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.5) inset,0 1px 0 rgba(255,255,255,.5)}.cke_hc a.cke_path_item:hover,.cke_hc a.cke_path_item:focus,.cke_hc a.cke_path_item:active{border:2px solid;padding:1px 2px}.cke_button__source_label,.cke_button__sourcedialog_label{display:inline}.cke_combo__fontsize .cke_combo_text{width:30px}.cke_combopanel__fontsize{width:120px}textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre-wrap;border:0;padding:0;margin:0;display:block}.cke_wysiwyg_frame,.cke_wysiwyg_div{background-color:#fff}.cke_notifications_area{pointer-events:none}.cke_notification{pointer-events:auto;position:relative;margin:10px;width:300px;color:white;border-radius:3px;text-align:center;opacity:.95;filter:alpha(opacity = 95);box-shadow:2px 2px 3px 0 rgba(50,50,50,0.3);-webkit-animation:fadeIn .7s;animation:fadeIn .7s}.cke_notification_message a{color:#12306f}@-webkit-keyframes fadeIn{from{opacity:.4}to{opacity:.95}}@keyframes fadeIn{from{opacity:.4}to{opacity:.95}}.cke_notification_success{background:#72b572;border:1px solid #63a563}.cke_notification_warning{background:#c83939;border:1px solid #902b2b}.cke_notification_info{background:#2e9ad0;border:1px solid #0f74a8}.cke_notification_info span.cke_notification_progress{background-color:#0f74a8;display:block;padding:0;margin:0;height:100%;overflow:hidden;position:absolute;z-index:1}.cke_notification_message{position:relative;margin:4px 23px 3px;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;z-index:4;text-overflow:ellipsis;overflow:hidden}.cke_notification_close{background-image:url(images/close.png);background-repeat:no-repeat;background-position:50%;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:1px;right:1px;padding:0;margin:0;z-index:5;opacity:.6;filter:alpha(opacity = 60)}.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_notification_close span{display:none}.cke_notification_warning a.cke_notification_close{opacity:.8;filter:alpha(opacity = 80)}.cke_notification_warning a.cke_notification_close:hover{opacity:1;filter:alpha(opacity = 100)}.cke_chrome{visibility:inherit}.cke_voice_label{display:none}legend.cke_voice_label{display:none}a.cke_button_disabled,a.cke_button_disabled:hover,a.cke_button_disabled:focus,a.cke_button_disabled:active{filter:alpha(opacity = 30)}.cke_button_disabled .cke_button_icon{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#00ffffff,endColorstr=#00ffffff)}.cke_button_off:hover,.cke_button_off:focus,.cke_button_off:active{filter:alpha(opacity = 100)}.cke_combo_disabled .cke_combo_inlinelabel,.cke_combo_disabled .cke_combo_open{filter:alpha(opacity = 30)}.cke_toolbox_collapser{border:1px solid #a6a6a6}.cke_toolbox_collapser .cke_arrow{margin-top:1px}.cke_hc .cke_top,.cke_hc .cke_bottom,.cke_hc .cke_combo_button,.cke_hc a.cke_combo_button:hover,.cke_hc a.cke_combo_button:focus,.cke_hc .cke_toolgroup,.cke_hc .cke_button_on,.cke_hc a.cke_button_off:hover,.cke_hc a.cke_button_off:focus,.cke_hc a.cke_button_off:active,.cke_hc .cke_toolbox_collapser,.cke_hc .cke_toolbox_collapser:hover,.cke_hc .cke_panel_grouptitle{filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.cke_top,.cke_contents,.cke_bottom{width:100%}.cke_button_arrow{font-size:0}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_button,.cke_rtl .cke_button *,.cke_rtl .cke_combo,.cke_rtl .cke_combo *,.cke_rtl .cke_path_item,.cke_rtl .cke_path_item *,.cke_rtl .cke_path_empty{float:none}.cke_rtl .cke_toolgroup,.cke_rtl .cke_toolbar_separator,.cke_rtl .cke_combo_button,.cke_rtl .cke_combo_button *,.cke_rtl .cke_button,.cke_rtl .cke_button_icon{display:inline-block;vertical-align:top}.cke_rtl .cke_button_icon{float:none}.cke_resizer{width:10px}.cke_source{white-space:normal}.cke_bottom{position:static}.cke_colorbox{font-size:0}.cke_button__about_icon {background: url(icons.png) no-repeat 0 -0px !important;}.cke_button__bold_icon {background: url(icons.png) no-repeat 0 -24px !important;}.cke_button__italic_icon {background: url(icons.png) no-repeat 0 -48px !important;}.cke_button__strike_icon {background: url(icons.png) no-repeat 0 -72px !important;}.cke_button__subscript_icon {background: url(icons.png) no-repeat 0 -96px !important;}.cke_button__superscript_icon {background: url(icons.png) no-repeat 0 -120px !important;}.cke_button__underline_icon {background: url(icons.png) no-repeat 0 -144px !important;}.cke_button__bidiltr_icon {background: url(icons.png) no-repeat 0 -168px !important;}.cke_button__bidirtl_icon {background: url(icons.png) no-repeat 0 -192px !important;}.cke_button__blockquote_icon {background: url(icons.png) no-repeat 0 -216px !important;}.cke_rtl .cke_button__copy_icon, .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -240px !important;}.cke_ltr .cke_button__copy_icon {background: url(icons.png) no-repeat 0 -264px !important;}.cke_rtl .cke_button__cut_icon, .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -288px !important;}.cke_ltr .cke_button__cut_icon {background: url(icons.png) no-repeat 0 -312px !important;}.cke_rtl .cke_button__paste_icon, .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -336px !important;}.cke_ltr .cke_button__paste_icon {background: url(icons.png) no-repeat 0 -360px !important;}.cke_button__bgcolor_icon {background: url(icons.png) no-repeat 0 -384px !important;}.cke_button__textcolor_icon {background: url(icons.png) no-repeat 0 -408px !important;}.cke_rtl .cke_button__templates_icon, .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -432px !important;}.cke_ltr .cke_button__templates_icon {background: url(icons.png) no-repeat 0 -456px !important;}.cke_button__creatediv_icon {background: url(icons.png) no-repeat 0 -480px !important;}.cke_rtl .cke_button__find_icon, .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons.png) no-repeat 0 -504px !important;}.cke_ltr .cke_button__find_icon {background: url(icons.png) no-repeat 0 -528px !important;}.cke_button__replace_icon {background: url(icons.png) no-repeat 0 -552px !important;}.cke_button__flash_icon {background: url(icons.png) no-repeat 0 -576px !important;}.cke_button__button_icon {background: url(icons.png) no-repeat 0 -600px !important;}.cke_button__checkbox_icon {background: url(icons.png) no-repeat 0 -624px !important;}.cke_button__form_icon {background: url(icons.png) no-repeat 0 -648px !important;}.cke_button__hiddenfield_icon {background: url(icons.png) no-repeat 0 -672px !important;}.cke_button__imagebutton_icon {background: url(icons.png) no-repeat 0 -696px !important;}.cke_button__radio_icon {background: url(icons.png) no-repeat 0 -720px !important;}.cke_rtl .cke_button__select_icon, .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons.png) no-repeat 0 -744px !important;}.cke_ltr .cke_button__select_icon {background: url(icons.png) no-repeat 0 -768px !important;}.cke_rtl .cke_button__textarea_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -792px !important;}.cke_ltr .cke_button__textarea_icon {background: url(icons.png) no-repeat 0 -816px !important;}.cke_rtl .cke_button__textfield_icon, .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -840px !important;}.cke_ltr .cke_button__textfield_icon {background: url(icons.png) no-repeat 0 -864px !important;}.cke_button__horizontalrule_icon {background: url(icons.png) no-repeat 0 -888px !important;}.cke_button__iframe_icon {background: url(icons.png) no-repeat 0 -912px !important;}.cke_button__image_icon {background: url(icons.png) no-repeat 0 -936px !important;}.cke_rtl .cke_button__indent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -960px !important;}.cke_ltr .cke_button__indent_icon {background: url(icons.png) no-repeat 0 -984px !important;}.cke_rtl .cke_button__outdent_icon, .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1008px !important;}.cke_ltr .cke_button__outdent_icon {background: url(icons.png) no-repeat 0 -1032px !important;}.cke_button__smiley_icon {background: url(icons.png) no-repeat 0 -1056px !important;}.cke_button__justifyblock_icon {background: url(icons.png) no-repeat 0 -1080px !important;}.cke_button__justifycenter_icon {background: url(icons.png) no-repeat 0 -1104px !important;}.cke_button__justifyleft_icon {background: url(icons.png) no-repeat 0 -1128px !important;}.cke_button__justifyright_icon {background: url(icons.png) no-repeat 0 -1152px !important;}.cke_button__language_icon {background: url(icons.png) no-repeat 0 -1176px !important;}.cke_rtl .cke_button__anchor_icon, .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1200px !important;}.cke_ltr .cke_button__anchor_icon {background: url(icons.png) no-repeat 0 -1224px !important;}.cke_button__link_icon {background: url(icons.png) no-repeat 0 -1248px !important;}.cke_button__unlink_icon {background: url(icons.png) no-repeat 0 -1272px !important;}.cke_rtl .cke_button__bulletedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1296px !important;}.cke_ltr .cke_button__bulletedlist_icon {background: url(icons.png) no-repeat 0 -1320px !important;}.cke_rtl .cke_button__numberedlist_icon, .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1344px !important;}.cke_ltr .cke_button__numberedlist_icon {background: url(icons.png) no-repeat 0 -1368px !important;}.cke_button__maximize_icon {background: url(icons.png) no-repeat 0 -1392px !important;}.cke_rtl .cke_button__newpage_icon, .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1416px !important;}.cke_ltr .cke_button__newpage_icon {background: url(icons.png) no-repeat 0 -1440px !important;}.cke_rtl .cke_button__pagebreak_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1464px !important;}.cke_ltr .cke_button__pagebreak_icon {background: url(icons.png) no-repeat 0 -1488px !important;}.cke_rtl .cke_button__pastetext_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1512px !important;}.cke_ltr .cke_button__pastetext_icon {background: url(icons.png) no-repeat 0 -1536px !important;}.cke_rtl .cke_button__pastefromword_icon, .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1560px !important;}.cke_ltr .cke_button__pastefromword_icon {background: url(icons.png) no-repeat 0 -1584px !important;}.cke_rtl .cke_button__preview_icon, .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1608px !important;}.cke_ltr .cke_button__preview_icon {background: url(icons.png) no-repeat 0 -1632px !important;}.cke_button__print_icon {background: url(icons.png) no-repeat 0 -1656px !important;}.cke_button__removeformat_icon {background: url(icons.png) no-repeat 0 -1680px !important;}.cke_button__save_icon {background: url(icons.png) no-repeat 0 -1704px !important;}.cke_button__selectall_icon {background: url(icons.png) no-repeat 0 -1728px !important;}.cke_rtl .cke_button__showblocks_icon, .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1752px !important;}.cke_ltr .cke_button__showblocks_icon {background: url(icons.png) no-repeat 0 -1776px !important;}.cke_rtl .cke_button__source_icon, .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1800px !important;}.cke_ltr .cke_button__source_icon {background: url(icons.png) no-repeat 0 -1824px !important;}.cke_button__specialchar_icon {background: url(icons.png) no-repeat 0 -1848px !important;}.cke_button__scayt_icon {background: url(icons.png) no-repeat 0 -1872px !important;}.cke_button__table_icon {background: url(icons.png) no-repeat 0 -1896px !important;}.cke_rtl .cke_button__redo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1920px !important;}.cke_ltr .cke_button__redo_icon {background: url(icons.png) no-repeat 0 -1944px !important;}.cke_rtl .cke_button__undo_icon, .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1968px !important;}.cke_ltr .cke_button__undo_icon {background: url(icons.png) no-repeat 0 -1992px !important;}.cke_button__spellchecker_icon {background: url(icons.png) no-repeat 0 -2016px !important;}.cke_hidpi .cke_button__about_icon {background: url(icons_hidpi.png) no-repeat 0 -0px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bold_icon {background: url(icons_hidpi.png) no-repeat 0 -24px !important;background-size: 16px !important;}.cke_hidpi .cke_button__italic_icon {background: url(icons_hidpi.png) no-repeat 0 -48px !important;background-size: 16px !important;}.cke_hidpi .cke_button__strike_icon {background: url(icons_hidpi.png) no-repeat 0 -72px !important;background-size: 16px !important;}.cke_hidpi .cke_button__subscript_icon {background: url(icons_hidpi.png) no-repeat 0 -96px !important;background-size: 16px !important;}.cke_hidpi .cke_button__superscript_icon {background: url(icons_hidpi.png) no-repeat 0 -120px !important;background-size: 16px !important;}.cke_hidpi .cke_button__underline_icon {background: url(icons_hidpi.png) no-repeat 0 -144px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidiltr_icon {background: url(icons_hidpi.png) no-repeat 0 -168px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bidirtl_icon {background: url(icons_hidpi.png) no-repeat 0 -192px !important;background-size: 16px !important;}.cke_hidpi .cke_button__blockquote_icon {background: url(icons_hidpi.png) no-repeat 0 -216px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__copy_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -240px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__copy_icon,.cke_ltr.cke_hidpi .cke_button__copy_icon {background: url(icons_hidpi.png) no-repeat 0 -264px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__cut_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -288px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__cut_icon,.cke_ltr.cke_hidpi .cke_button__cut_icon {background: url(icons_hidpi.png) no-repeat 0 -312px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__paste_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -336px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__paste_icon,.cke_ltr.cke_hidpi .cke_button__paste_icon {background: url(icons_hidpi.png) no-repeat 0 -360px !important;background-size: 16px !important;}.cke_hidpi .cke_button__bgcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -384px !important;background-size: 16px !important;}.cke_hidpi .cke_button__textcolor_icon {background: url(icons_hidpi.png) no-repeat 0 -408px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__templates_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -432px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__templates_icon,.cke_ltr.cke_hidpi .cke_button__templates_icon {background: url(icons_hidpi.png) no-repeat 0 -456px !important;background-size: 16px !important;}.cke_hidpi .cke_button__creatediv_icon {background: url(icons_hidpi.png) no-repeat 0 -480px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__find_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -504px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__find_icon,.cke_ltr.cke_hidpi .cke_button__find_icon {background: url(icons_hidpi.png) no-repeat 0 -528px !important;background-size: 16px !important;}.cke_hidpi .cke_button__replace_icon {background: url(icons_hidpi.png) no-repeat 0 -552px !important;background-size: 16px !important;}.cke_hidpi .cke_button__flash_icon {background: url(icons_hidpi.png) no-repeat 0 -576px !important;background-size: 16px !important;}.cke_hidpi .cke_button__button_icon {background: url(icons_hidpi.png) no-repeat 0 -600px !important;background-size: 16px !important;}.cke_hidpi .cke_button__checkbox_icon {background: url(icons_hidpi.png) no-repeat 0 -624px !important;background-size: 16px !important;}.cke_hidpi .cke_button__form_icon {background: url(icons_hidpi.png) no-repeat 0 -648px !important;background-size: 16px !important;}.cke_hidpi .cke_button__hiddenfield_icon {background: url(icons_hidpi.png) no-repeat 0 -672px !important;background-size: 16px !important;}.cke_hidpi .cke_button__imagebutton_icon {background: url(icons_hidpi.png) no-repeat 0 -696px !important;background-size: 16px !important;}.cke_hidpi .cke_button__radio_icon {background: url(icons_hidpi.png) no-repeat 0 -720px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__select_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -744px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__select_icon,.cke_ltr.cke_hidpi .cke_button__select_icon {background: url(icons_hidpi.png) no-repeat 0 -768px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textarea_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -792px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textarea_icon,.cke_ltr.cke_hidpi .cke_button__textarea_icon {background: url(icons_hidpi.png) no-repeat 0 -816px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__textfield_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -840px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__textfield_icon,.cke_ltr.cke_hidpi .cke_button__textfield_icon {background: url(icons_hidpi.png) no-repeat 0 -864px !important;background-size: 16px !important;}.cke_hidpi .cke_button__horizontalrule_icon {background: url(icons_hidpi.png) no-repeat 0 -888px !important;background-size: 16px !important;}.cke_hidpi .cke_button__iframe_icon {background: url(icons_hidpi.png) no-repeat 0 -912px !important;background-size: 16px !important;}.cke_hidpi .cke_button__image_icon {background: url(icons_hidpi.png) no-repeat 0 -936px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__indent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -960px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__indent_icon,.cke_ltr.cke_hidpi .cke_button__indent_icon {background: url(icons_hidpi.png) no-repeat 0 -984px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__outdent_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1008px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__outdent_icon,.cke_ltr.cke_hidpi .cke_button__outdent_icon {background: url(icons_hidpi.png) no-repeat 0 -1032px !important;background-size: 16px !important;}.cke_hidpi .cke_button__smiley_icon {background: url(icons_hidpi.png) no-repeat 0 -1056px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyblock_icon {background: url(icons_hidpi.png) no-repeat 0 -1080px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifycenter_icon {background: url(icons_hidpi.png) no-repeat 0 -1104px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyleft_icon {background: url(icons_hidpi.png) no-repeat 0 -1128px !important;background-size: 16px !important;}.cke_hidpi .cke_button__justifyright_icon {background: url(icons_hidpi.png) no-repeat 0 -1152px !important;background-size: 16px !important;}.cke_hidpi .cke_button__language_icon {background: url(icons_hidpi.png) no-repeat 0 -1176px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__anchor_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1200px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__anchor_icon,.cke_ltr.cke_hidpi .cke_button__anchor_icon {background: url(icons_hidpi.png) no-repeat 0 -1224px !important;background-size: 16px !important;}.cke_hidpi .cke_button__link_icon {background: url(icons_hidpi.png) no-repeat 0 -1248px !important;background-size: 16px !important;}.cke_hidpi .cke_button__unlink_icon {background: url(icons_hidpi.png) no-repeat 0 -1272px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__bulletedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1296px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__bulletedlist_icon,.cke_ltr.cke_hidpi .cke_button__bulletedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1320px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__numberedlist_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1344px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__numberedlist_icon,.cke_ltr.cke_hidpi .cke_button__numberedlist_icon {background: url(icons_hidpi.png) no-repeat 0 -1368px !important;background-size: 16px !important;}.cke_hidpi .cke_button__maximize_icon {background: url(icons_hidpi.png) no-repeat 0 -1392px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__newpage_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1416px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__newpage_icon,.cke_ltr.cke_hidpi .cke_button__newpage_icon {background: url(icons_hidpi.png) no-repeat 0 -1440px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pagebreak_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1464px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pagebreak_icon,.cke_ltr.cke_hidpi .cke_button__pagebreak_icon {background: url(icons_hidpi.png) no-repeat 0 -1488px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastetext_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1512px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastetext_icon,.cke_ltr.cke_hidpi .cke_button__pastetext_icon {background: url(icons_hidpi.png) no-repeat 0 -1536px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__pastefromword_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1560px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__pastefromword_icon,.cke_ltr.cke_hidpi .cke_button__pastefromword_icon {background: url(icons_hidpi.png) no-repeat 0 -1584px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__preview_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1608px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__preview_icon,.cke_ltr.cke_hidpi .cke_button__preview_icon {background: url(icons_hidpi.png) no-repeat 0 -1632px !important;background-size: 16px !important;}.cke_hidpi .cke_button__print_icon {background: url(icons_hidpi.png) no-repeat 0 -1656px !important;background-size: 16px !important;}.cke_hidpi .cke_button__removeformat_icon {background: url(icons_hidpi.png) no-repeat 0 -1680px !important;background-size: 16px !important;}.cke_hidpi .cke_button__save_icon {background: url(icons_hidpi.png) no-repeat 0 -1704px !important;background-size: 16px !important;}.cke_hidpi .cke_button__selectall_icon {background: url(icons_hidpi.png) no-repeat 0 -1728px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__showblocks_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1752px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__showblocks_icon,.cke_ltr.cke_hidpi .cke_button__showblocks_icon {background: url(icons_hidpi.png) no-repeat 0 -1776px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__source_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1800px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__source_icon,.cke_ltr.cke_hidpi .cke_button__source_icon {background: url(icons_hidpi.png) no-repeat 0 -1824px !important;background-size: 16px !important;}.cke_hidpi .cke_button__specialchar_icon {background: url(icons_hidpi.png) no-repeat 0 -1848px !important;background-size: 16px !important;}.cke_hidpi .cke_button__scayt_icon {background: url(icons_hidpi.png) no-repeat 0 -1872px !important;background-size: 16px !important;}.cke_hidpi .cke_button__table_icon {background: url(icons_hidpi.png) no-repeat 0 -1896px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__redo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1920px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__redo_icon,.cke_ltr.cke_hidpi .cke_button__redo_icon {background: url(icons_hidpi.png) no-repeat 0 -1944px !important;background-size: 16px !important;}.cke_rtl.cke_hidpi .cke_button__undo_icon, .cke_hidpi .cke_mixed_dir_content .cke_rtl .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1968px !important;background-size: 16px !important;}.cke_hidpi .cke_ltr .cke_button__undo_icon,.cke_ltr.cke_hidpi .cke_button__undo_icon {background: url(icons_hidpi.png) no-repeat 0 -1992px !important;background-size: 16px !important;}.cke_hidpi .cke_button__spellchecker_icon {background: url(icons_hidpi.png) no-repeat 0 -2016px !important;background-size: 16px !important;}PK!XG++4abilian/web/resources/ckeditor/skins/moono/icons.pngPNG  IHDRJ*IDATx XTWJ+ߊQP#HGNtk29yur2'''OnL'iz<C4M4ñ\q8alwEU"v_SkZkolv7ԥ1 ^}F=e7[tp v;/$z[]3:UZ]޷_R rP~T ^~ݮyʉ'v\&' r7k &/b.)b'_v=[Hsv$(a:3M|-`6I,`޽[8@ӭ FhZvaJ"sR?JGKhv#pA^Qp( x#yp ˚R9~Layf7k)QX>ɪNE(PB+Hd& FqZzO U`"TU5!mEsvOKɋTc׿LܞϮy3^8 O89,M%語QBGxr֑RjGW T<ʄWoq`Vf 2WSMRQKe=KVH(']E{y (pN+¯,Q+RLuKN܍=$Pʼnc{pNϹ waآ*Gy^r%w GXWp F_;kl3fGSXtf~I-BhPbF tK`n^hĉSy YRXi2$ZnkhMxoA! 5Nx'OJvYxk4<3 qb.Nq"Rq-1r(Z6:-BH%x ,s<6Yê'e(dV˲32 z!F>8IM@z( (6ZXt/^uq»n82  E!ܰL.8y)M59Y> 7ѪVIUe[%cxV\zxR&$j//}-cu#KG (ҋcTq<;qflxel۝], /귲ZYz8WOkKӯP&/%ic,t=rw%N=)wx_Ǎ\%Vt&WpLn?q#@tB#a4DH [3Cf"2) ͧtvr耞 2Ba;[ QvB|"⋈/"RSYw&/ɱ ˟-WLbzS}.x*^>%\_C%sN>ZVQ'5R 8Ħ[WW l.ur2wV0cGF0[>8ԙCрeT yGoyKTbrpI{xioUf]:"2eB||wt.@/VչLyuh,-jЈzq@!r2 wM/3Ef2 (bu(F3TmĨCŚo‰B R8AL߀e&TH e@,D!H@^@plP 2UiR6;Gd!c%2Hd%װO6N!pbYH8RH|ta+j}}ټThTɤ'uSI 5VeSRy<Ih<-uj偷v6ɥZ-]ZCw5*w bəِCg[8"x8(KNƌ崑X9lea۶>@Ip{J:p`-+I$K·ip\^!Jnɵ8Gv$Tng٨zQ|VM>V\jkY3̐\%TR{M>Hh\v{pa/Ɂ+%5'͸Z̧嶐O/42l O ehMؐ[ɬ  s O/"T`%R")#ttA)Fv˜Ģ[Y6mX=I9c2`}i42oՇS;8'ͳ=}Ig2i!X2ᑂNr! x"6!>VelF&ݧQHbf%Y]~K%llb(8L?GM!فeᙃnxzQwauS0ҵ%ps"r#KLnQpv#TtK&Õ"$J;$}!IԯrEZL>( \@R]죊l&uTIgm" Lk/AZ&{E)y,vi0 |0{Gme=ݸmpҶLqcH+¯ aԡb%vIq61*#bp H5j rm65baHC[\fM~|IJqElϙuoW$H,“P-~^W4l芑 b~QFױWZ_j* UR*u1L9TJCQQzNWeO%uKN'Ӈepmk/ՆKM_ HiQrn(?<'r)'kXڳTڌ\/Ͻ-4s_TTņԦ..xeZyjŲ\c5V_MQ߿3~ա\F64[P>>Thn2xOlD둈iXqoŽzƯ5%0c,oX>װW GQxeSQjhV7%2Z"\M6ymD^#6Xa G~#}!O"D]j꣢Z YNK[:: *ݙ+mWwƩc w@SezFAdrjҐڥ5Nmw <6RSE?iöy!D Zzȩug9kimP~9p@LGv|, k^ #2DۯG*-f:؆Dg49MڄDlV P ajVt;Oź6P *$y?7\NQrS.$#WMr[27|$],)YI8`X&'j/.Ԙ%eM2Y>ŹۉAwd )w?K8|m (?/@7yN&}c !Ds|7y]%Ei{:tShxUi~?jUni8Vvۑi8B&ZkI*8 @-[el,`#ec.?/>02n:oO8ft=aij|-Yto3&.yX}$Jn~XD)%lխ#7$17@ģoRpUS3 ڄ6ip³XЌR4T⸹xWF 5$q:qf9z>Čե->hT"7O;RVM C%j*Һh.2 K7-6l#n~#hl{VPP}l%icR{`;F0ӎÌJ_+"Es чޜ9J>8F9-\B>+/"Ġ0xHFSe>a#IcBh|ݐE<vd3}5Evo#9Bx.L>ذ~┤O;#E/xWj0RQݭ2ڻ[C*NSJRNtDwT*8a 0a͉cB:%SFc:!}ߺ*%4hE'M"}>YrTѵ*$o:5'Ge,lQ/T{Y.Ozꬁ/!O /,luuu`a=21HطrPN c1^ Q 9\arTAbOy=J 3R?C|P̍c=3uWwgv X^C.Xr@yNvOgh}&Rf M|Ma6bل4Y>^PlD1R4BΠR%9qhT~d0R@,FHg4( 3Ou'X:ZGC ɏ464bg`]W<ۋВI -@;و B@H)|z܄MS6fXE" $|?_?_DrXzQ !H$1Gœ{!IŪYQδV vOܡ3Ƃؐ-󄵶Ƿnn6!,?dQi}_c^L6!B4IYLj 2Y)5EL8*Y,R9Hk` xlX/:WyT ! 1CG9H)R O5tlAZ\ 6*MEdUwWo\w'ŭ' Z(2d&^"{VF^&xAv~8 jwH97ST+VhI<DG("?)焎h[ލ,Ón#M>vtS䖣gS&P?]?]ODdWy"PFNQbj'㌧UKZ<٢naHӑFV#=iȓꢞ蠧="|D|1ԾXܐb}p4j&-='_xἆFohh:gbEG*9,ɕMq$Uܦ'M'ٺ>N[`XH1\VX"=/X~ϧeұ#l PÂak/u//l7nnC%'݌M<~7Mp'} 5}Tm؆/r7-nDM1AӐ̔5)k]l ?H45\i I+gS0(NT9dnZu` CLh\Bm@Aر\ wrA,n~.LN˩l"ddJ*'eWSFd,e c fd2 ];X,ֱ Ӑ&8"IG#8&|ȫOU>$w(NqPcNǯ LJ2H3R¯$嬁Lr""6p-d'A6PLr~F<#,d5PKc5 m_t=! Nx'D [QnﷀYVqwzۋmX|BA#3?mD0)l{FȬ$${{2p8̈/"|AB|qȟ|3"/oK {\.,$;#ռN}^˧XMH8m+` 3 Lq&I[Ty_Rl {Gs:""y]b}z blÎTw`wXM$va5Oqxh' %)|1 d&}Y>F3Tm5o‰B R8AL߀x$,D^@!GW5&,Τ+Lt[؛*CʐWtP,!3K̐p`w,vb!Q4b P-b"CL(TC XܧC" $0/g(?/2&22PH_M4/ [ [@,0XI֧7 ?`%"/`b_9dud5 FHQ:4f,D>rBw/ qn{Bf#s>(XHw?hak lW&X:V :qSUv/eTǴPi{~ֳ56'#Tح|v `X*':&ppCH_s))lۗwaHwUa8Ňޡ<7V11{#5Z+`/L5Ix5TS lHSM %svh>rzɃJyd ~vg3rA&2`YH!KFJYl#,gH+gw |}%R:XLfu&,)ŒȬNPK.{*EXI_vʻ+{ڷQAXMO͉uAw1M7N,.F#Xb:9E|$^J~sD!⋈/"DΣyT^")sRwv*RHtgOG(L,ףgSt=eʤlf*GwO*g{Q$KmaGmk$mS]Ѽ#Lq~LmZPIENDB`PK!q$hWW:abilian/web/resources/ckeditor/skins/moono/icons_hidpi.pngPNG  IHDR  2IDATx |u/fb BHH@ -b;f31ƀ1^ccqq\M'q&Mbǯ8J ! B !J%W]D9F3sΙg{=9IF6|YapI8)l6 iC}g-ׯb=X>f;J3(^ 4^F~˭KZ˖-VXaZZvuϽZxCI;xJ=O^h5}tkQjkk=PUUե[n%ի.s|q+5 ,.|R7=8ƈq]4QcwY<%KXǏw];̙{nH. #VNHͽQĩSK4 . -s,wCQ$\xbnnH>x=ꛏ;jk_>)m=5b÷]QX.'zfe?,zw/]t 0E#GU72ݐu? 9\4Q6n, ?7"]t9{uPt[2}֬qFaքٳ?Hj%'3מpyVq_nr"f k-=ӭ:kϓ&Y9x& Rz L9E)SXSr`\"X4Znj7g[R/"k>)3v7qQxn6ΚEF~'e< $ĺ>n74Kw}MM5hР3>.,9oHGçNjM0d^@. IxwzÇsr^ѧ{$ځog/p ۹!ٚʒ!'\N eԾ#xO\KGZE&f̜ɗ jM:w>Z,ɓ'_>`FWvV_VV]iioÖ[ Çm'zX甔kV>}'ښ1͛?>mdck:0WBCIF1bĈ#F_B&"$\%wju:t>f8x0;^:Ĉ  9[p<B'4k^xaz:)`uzĈ5 \2:p/eLrzq(#e*(.>Z̓"ܹsꜼ<XF%?%aF(Zl@ p1͖W\BoF9= nIVG3B⊊@V82yBJʬoر"K0]6DHK!5mmO^쓑00>FwZ߾P8vVʦiVFLIٳwo+W/BYq6|IxAcoŜ"õ@g0Yr_q5s%iسc?1 :#Qs8BEͳnݺɽ19CÜjMk]u;۫WcuM@5(V#*Ys] BIRň#F1bĈ# }❸[Գ(ݬ9P<SUXxrӄL'W@8m,t` `~bRz5*9% T}֛ 8* @ڿx*;! Vű88=?@Fq-ͯm=oNNޭ9%{\c'L Rh9m9$Bh֤x0L/Zz}wrm۶=#2jc={'h7|67/o}6l!mP2Gxn#r|]Tein>iQ^58Ac{ X߿?IDkvѥKJ0̺݄$܁#9#p>.!Ef[]uC`_8`;r.FnF1bĈ#FDs>Y9m5֮SxEZ*~þ39@t}a駫DŖΟO0/([0ynQ3&U XvpƤ|D ě10ě10xPKj56` gLϘD0aL cgĿċ1I1^˘3&KĈ#F1bĈ#IwDʴ^̘VΝY4%@ߥ>r7%PlkߜW>Uݸq#uUсC<c90Mѱ;Ɣ_Dr@wrj"Ӟ190I8 `"9#3Nib)LLLTc* )ˈg^i$br`QZ@N뮈txwS$SɁq '^#;Я߻arX1_5'8B(]}DqU -TT)L!7PTFLVlSv9Ɂ}KuPmdF#&^*:)1L H;ycsl/ 0Rx@{F#6 P\_0=E@cr`xe%Rœ&?:G@w쓓3#jRA8@{X?צE@Ay^jBqVp]M=ժmh P6:ێ>AV8 @pegmKnX#?;BQ;?aсZ?TqH&dm?70//@+sw`8xuJBE!-)uZ5%!Befe]&k8pg^&)0ft`Ҡt` ?Svx u!+9c={<~w;>Wp@8/{C R/U|qqve0L JRX,lGhV&! t ڂ}׮C^j\80N` Ẃa rck IbJ"6 `#lKH>BDRMk5ˁRŏ/R?N;Gls{`˼/YxMp \>F.»ibxM6p`%K @{`9=n  \x!' "BNE$( pF1bĈ#F1brn! GwBr)'ڴ9Z`RPBwtxg>rG)c,H3GD5%5;_Jt}3+edg99'.={_@I=.ޫdι[(!ܥcJv))k:N>wǀd!DTss /6\.!5S\nFdҌu\/7QQ$8*3MIԴX6Ĺ2b̘DF!E+mijڴӋ)#Uwb۶( G -`!|U9P1/91奃WGr ߺe|sm H7 /{ȑd?N7xM2@?'/Wg&rwr$^%d7Z7kIy[Ql'ID=.AiCp&efy?Fm}^Hݹ}7:ۡ3W_ϞcI!É<Ј"лv=5So0Dr|'B+YJ4SCg} 3ҾSǹ-33k g蚬W ,VWGhA|y+#HҜ;vAW隓7tթy^z}I%ߒJ >زL}s=5EEdVy)٧4ܡKUb=r/Mg}] Z]g3unsrs @z %~:OQ.ժadg yaZ9kdsnp^(mZ`~:漈lwANSBA6:6 -oĈ#F1bĈ^r:+O}'NjW1? TPpĈ:1E_ *Zܮ8W|kK80vT礦o~TMɎ1;1vL{.-qbP 2n4@L(؎ƉكJJstށ ACOH'MA&V r %fR^V5y&9 bT,WinHO l!G]9fGk>s@Nh :>bX͛m99T}4I쇗MW_Oޛw ª)_շ@y oaWrt mt$*~ XO`h_RÊH'0d({,4l!7enA?\;W 5m[ffZK`(ePq=8Uh9Qg=BM= g (v-f d.7?27?5| nTxbP@_tD@Сn"#j؊EGRұj.oЇھ'Ł+@#F1bĈ _`/0| _`(/0| _`Ĉ#F1b$K,IJ;t1U+赖2)-ݦMJ# k"Þ4.7u>*r^^)j{Ȯrѐ _y>Uno92s%"HB>IhDy9}ECnfܗl(D1bl)%yhqҿ(U;mw#dr8vܸdSY(ŌD$}Ɉ}va6l{U(5cd!0"N0d F(8!C~oWr :ȮJfi_ iRlwur(͏0u?ώq!%tN͝7 }BB/ % )O ]NϘl2I"$Dj29sΖM;ırЩWj[J&/Rw]ri]%R$EϼzؽK~}!lL>0TO.u}?52jwotN4t#(L60 J^zL 1?=~PX|>G|O; Hxz2.Ѳ!!P$+trҤ(gR 'F=[y糀o|{)t+(l>3* #$isO:,~11r%4CT+|+m<@Z?VϚ3gt%Y✈`FO؁*E.ZzH߼>(S]MÞzryhR8yCYЎ?\_T'ܬ^$'NlvZsu}s]Iǔo%Ըٱo^gX6%9~|WEgk/a]ҩS=9@Y.1 ׇq;0J^ЊNnp?؂lA^3g͈1 эNkVX~!9%?~߾dV{% ܭۉNB nF'dMe;PwS:r =-o!ÆF bGa"w25U >+Ϛ4dmB/!#G6v@qZ,5bئړ/~Aސ^+URm۶A(+- {'tY:qT:L9@C<˄t/zݮ}׮yp=Z~Qxa`nݜdNkZ[19c{yn>7͚=R7g2.`GrhQy(FD'[T&L#IMlY'}I3@IULLbaDLȋC/둚zDz!ڳᗾuM!sgNl5{q4.tH1bĈ#F1(9%i5zؽ MpC {Nk/C:qs./QF Ć@L6-H$*i: H!jWH^7*HaR23%{<@Q *FTVԪP?VuDf„DA)'pFMrD9 ï%mwSs8_7coyJ ɗ^~zߴ/N8^~,/8+vke7F1bĈ#F%c~.VxՓnA @59,e \'&̞mKQVE[a؝s[!/\hD-!` 5͉Sڣu ؎ƉVsε 2؎։&8 h cr;lŗ-u\eϐU\/t"P:ʖH-lÉb%o?!R|)FQ$D!Lر"ATB<8FNHOHOd/}-N*!R _}Q'Dr$qGחlL { @yy :c/bB$uqZ_>S-p4vG/+@:ܹڻͺ!,t 璌7|7bĈ#F1b/0| _`/0| 1bĈ#FR*)-X sKJ)uN L7/0mt /E_sV^%CsRѳ箞{Qnʕ-6N]t\/Y,0~ <ܺ~{#VYX>2 =p},RV@^vmC+WV&{ْQ?c=UΝV% oqXc׮ zY2{\IQnt{ ok|>;;wnXmeɁY  ={NOT}ʜ9 F]?ŪTjx> <Ӧ)%<gߺjifٷ,[v+B . .ժ+FydzaUy Ռ%6$&JJkn5g<8U[`{5[ _V&KtIfvDi\L5I{=цotx:_g*1L`!1Ж>Չ-$>[gEB|aWUm~|lc-}苎T}&9>99Lq3vr6}=55=ܺɼNAL%c:iB&Lt҇@WKڥ!PQ򎗗3Ghл}с.t EI}S^rϷvnBgKfѽ\Pi߉ ⩩~~{'}с.tr3"/y?Ӝ0{IyI8"Ӷ'Tj\&.Ih4('͍t$䄊mP ;B N$ +**4s,Y0p'}) a4&ʑAv!Sșek/_w<-'ʅ=̫#F1bĈ/0| _`/0| _`Ĉ#F1RݫO}7߶>-v[~~Nmv;$;nur\ $U¶1"|{F0{UN.<8ʲBi,ї#pOoj)JxC5B_rHΞ 6 s*5p`@axQ"_50C52'1ŋR]ukt7轳I䂛'5X4Xw_GY!{gP–"_H&kKkr3u;ˁ?s{Hhxx6 z8w_#@Rq+\{n2 ?9g_Zʲ@ /rJS_LE-Nꀷ@4<Mg dxFva!V0k~~v 7\)ǫ:PXZ1rd2?״g8Dd?=1ӕNN-^i5g-޴FO|ͫ"!!r׿^2Ior@]J!!2KL1j7+Y=m/[L@ڣoU^ω-ÉB^|k>Aٔq?7< 7xj}$sԲ5V{9l}]]@t.жcGn=wCwm@܀hto;yQ&\Q w$H>r$U}D dl}‰FtܸZ}ݕ+ _Pe\d=M=B%B{ {BCs0rP2V%`mxeeZ.+nݮ 9!v{oo ~uSOa肰0o^0|j6QN)=Mӥje"<+ 9-a?8r0tv$ 4,Z$K]aOLZ}_^)=K7L! ɑ/|+wq <ث5|Ϩ[1bĈ#F)v Dž+mqiwE;-[5ew% >цN%K/;Zh-}|T*?~&x }Jݜ| ?S֬Yo3M;8=mNb32׬]a!h .[ɍL"5aݧ=<-q"KRVN`1+LRi]?~KZ&~/~c12,XI̒Seap^9j*:>Yg2A# g<+&~$ qzH0 GWtG|:uzv ob)p͙ q#@=cfO Mdϙ&|cu{UcSwb08IE. =ergp= s_ж:э 4vݽ'8sfO3G05u#ó*3y э l5ro^q&;<>g<~!CpE8WUUu Cэ l5&/G7 ^,'>?,:T3qj\巼 iy5図?-tpϗqZcrJ L֐Zx!\X!n]V;%1w=ӵ:׾}8q-l A5/rCCzЍ l5r@QmҰgV4sxM;WFveŃ-h(/)nؐj_M*a1Mcړ~Gy{u 88:B@-5&}33Osf)ņ=vHX- $K [8c ]}Aoy ɩ{[bOt901Ynl`8 ZFz۫ZҹV811yQs{؈+fd\ff|^^8fPdMը1OV_X]F76nLKIa;k׫9s#uԣ~±YEG.PA,-a~5u Z!0ZrA'ƄkB\T0| rVύfዥYЁ.tmu]vҥX,aX#«Y`oTJII9/:{mGbV޽ԫmq6vH˰*q/NTxR fhdĈ#F1bĈ#QrC[s``[Y p֊!jE tfЉzm!!g?Y պ(<Ӗf[BY6l'79(7M`y }Y#_җ~C= \B'@|&hȼqFP4nōЏݤٟ!!=H$ l9#2H >8A p5D *6'ZI /X_>h $#35$%!HbirxW^ʼn jbNb 7Fx9o€~NIpNGJ s\" qz1 %NپksIߢ,]J{V&YVekݴXGV"na dn=Vg|}G761bĈ#F1bĈ-3sGرBoJsFJp֊b-}tӯ[VhV#g^|qURtݾ/P _*"B'm<){&YЉfQĸѨV0ThwҐF P`5xמ=/ P(nmn^hK1\A)Jw70REJǡ{oJ%ok5Oz?aRqBaE[Z*Ç ).{rO u8 o)b[}F)uiwpT{/k'v740Aeܳ@8;]۠}/EzUA P.P`ٽ kDb_^0'`~T.64`}NkV4:HT:ΰGCrU_Zd{|wQY N)Dw ̵ZCAR n("*1$Kn5kNW( ܠ㳖.et nE&O^2d1B'}y饢ן.ӕ@%%Q@:kĈ#F1bĈ#F`rM(u>F BЍ l5_V'tc[ַ9V9Y tjR8[!K'90V(7]'*%0P >Ntc[D tN`[Dڄ; ObB)ekb#V#- EA(Gx];6;ZD<t/p6 'iI-ȞP^q6#IZ@*{+d 6v dv| qv"O6<BSXd f_x?n,`"mX17[6TƱӘPP2a)fP & 0qv @K=d=DExci"??@gv -l&!{XCq8Y-籅Ml'饗,ug}ߵ>]D76Ml')O9"] b޽֞={t`$g:{uAk߾}֏~AǀFǰ-lb;Xә3g'1߿=P6E(>TYI=8@]6կ~g?8+∧qRNvرcǯ&b"^h}ᇡ )[*Q<ɓ'ivC)IT!|K88 &V|_W_??p)U%`4B_׭sY?Oi˨QTBh^|E9-lb;I;Wql<^ӧO['NΟ?- 9+v+99ϭAÿo(na{7}Ӈ%۶BbIT)hC[8}ctWvfNg~ߞЖ>EGg[τe˗nK@ fǐ`yB户kӱZ[8Ju֦/:ЅΖiԩāN;Ɵy2+Lm>6:QQ2v /%7Œba:03㘛 /:5hz ikMA)8$hu])JLmq6.ڣ]D៩ ~uYZC^)-A8lc ЅNtyW%cn 6UPc+Љ xJAfKUXus CMOmh.tYc?/97G!f]Dw:tǔ3o2UwS<  moltYΟi0Ͼ2'Ұmh~cV/rڦ\w#֊&5 g5ECf1knW@wp .(RXȋcTX݇T*2lc ǎ2|x=:g =z2z _'6d l/< N_tTjĜyC҄Ki}+(o=~_DЉns7PAYY!':zFսC_t%.͓~l?͎|泟ݗ~sO4'hK]OSNwGzcVapcfhC[BtqС>M)Ԁ~ڨqƖp~p@;=RSw8s"vc}O lWTU-U$E[L؜ Ӽ%؜)B';͘1uV4p*Q6r`DYY54yY8 F˗,]ZwǁKG;\rP9QOPw%Ɓ8zP)cOJǍrЁe t`u f;Z=[Au0toVD uO׏#lt\0 Gs!I|KEwY(֙Z90$T}啕uݺՉJ݄@̈́9Po` (ԑʫ*tpxDiiIvR.*FQS~eRS̖ TpqII]r:S79srs _64 I^XXשkW˫-ς(:ufA:r S#.NہÆ}䀌QizE_R[q_C:F" LUKR\P~))81_ Mt@%!Fq⸊jGsrYx vP"%)iU8}'~==--V'JtsNXyrP5CƉQ6lFA*/͓QXXѮ]x. 2i\ÁԼVsԡi2Leb V!t ҧK׮srr`L @wrE =fj%fdĈ?1bĈ#Fzfb݈qv=f3] ɼ|ߏ u{v=/rN"m{gcIcM"47q]/NnRup`bl/)΂MlϮǁ=X,Oqr aُX_PY )AMl79~fFD9P)t B6 Q0>PB1 QmO  _;28@kv}~DV{-/Po)=zM71KJL^xWN뵤l?%- R֓BqXwҥNU]Uty?0 ȁi]d*ƟĀmb6K Řg˜?bDgAxzqU Gv`GT."> W5( P90&zT\]S0 ƉG""_hy*1+T xo/ ׫8OcB1gXt@1ra\_U*d<܃a馛NC QTvf6^֫W]Eee*|71SГ /#׮cǨ'h]W8q7E +,T|x=S1"C OT1bĈ#F6Vccė1ŀ͸a ,ƟcHO"8GIbf'Θ+ /$sʌIlz2&Ŝ`/Ƥlbۃ1i`LZ9&=3'6IG`:3L(slʶ&Z!؎'͠ ϋ Tǟ9rlbG_8m QJCZ>"la;Q8wZI^fL>"-O1bĈ#F1b/0| _`/0| 1bĈ#F%]T5.@:D[n ̻wX' N2C Fd)1#0metIb=t)..@:ɶ#V"Lƪ+nOЍ l5rt0de!;J" l%5Ν'A4,<֕ȈD;,kݰ{?.@:ѝdĈ#F1b$F)v Dž+fhw%Ag0$͊>kVC慕*k-ƫ]& 1RY/(W^}/K\N:u~%]=pk^^V*zOzXp<TϮةFm#LsݺB4}ƌ ]{9,T%3>/VktMCUw͚5AXEkNݺuc.r aP2sI/L߬QC `+WqJT+կ_ /vNIʊ ǁQF3#>7u|\v ,q}e.|;sw_;t=OaMǛ|Lfeg33S]sR;Mӿp^rx SSJ|yMu%Jξy  ȸ-ps##,jxp{O-Xn >Bg34"x)­ғVqqUQ:)\U_Vm%@gi;No^7Ux-mnp`9czשqMT~ݏWߎi]>1@:6:w>Pߌs)Β~U V%ӧ6iiig{Eޗc5z舌gIWVcWk#KU_`8 m-@'ݎmq6I#ň#F1bĈU;Sюe$l< э l5r`~C l`byX9n\0UN>NX%l/^85vVr`p u)jξS{[N AJʁbF`JFf)w處ul9DL#bO<̶1 l/Zv\Rp>~}E=}YwdlXބ Bd;8z8m?a{)|v<Ğ\W {n0;B<b9D [^eVUyg,4xEMq%N?Ȳi[ix|;ҨX?N+#PfNjݹmŦmE_#Ng~z_hrK lw$86@H[0sļon|'QkrTy5Wה3Ag'PU]Ma Cr+S6'lNK´ي ~Vtе!bK%:O&u--_#5g]s;xIڵ1Zl=P%6ԭZq#຿۴gNۿ (ɠD:!Á aY`ni1728N$; Hְa^'܁ h ><܁LJ0Z~P\#po.](z6b0(VXZP@Ȯ nz [_}uď'-7PX\ F]q{t5*_pOiie{iW\a nѿRm.jEg_zh=AT1rsϞt~p%37ҁ+7¶#F1bĈ#kSBcKr0{78RߺI߽ z}xJ/7@nau r6lq f+4-)ϟ22Yq Q;Хo߭wҧUk!o]K?K&/19PK۽/AC{޺`Ŀ\Y5JۧnpaJAB;\ ܂IGu1ߏaSϞ[grK}`Ɯ9>QftJMmہ^}9{o+gؿpL>}Iߊk&Oa}+7c;~Ѕ pε4bĈ#;ň#F/0 v 1-'5Mna1bĈ#F/c@ /fh㴍V g LW8CfhC[8}c|BF ];W}DQ`} mCߠ(]Ng* MYW^}ca Ӗ>EZj|r޽_dIR~HR.q68F>E.={^Ruf?K𫀶N B'BTF^b_Hjk nߢv'My%(@:э [TV[nw'7/ '=띲c-}A:э쏚*iK١\ݺ]+U3hC[对H_ x,זw_EKګWwʺ1Ж>F'AI%&O2WrٽݧM1Þ t#(͙SV8FNSΝuj@ɘ1Ǝk׾GJIm%6U.*.ڟj>ц tэ l5.hIeG0Jk֭?sڸڴahC[7L3V#Fg1\D9onl`,Ъ=3sYsIȉ8m<\|睁zY0 D}h F:gD>=W8R.Z7{}9.<&$GJ#pXJ{\y ݥsSq^O` 6)aRWxExpل [mhK~ -T"Xc4Yev}C?@ǀ0KHlc}с.tTp߹ͽ_w{R:q秉I fh/:exEO~ŗ233dfhjO_t#4_#GOж&Ac `}Mv1bĈ#F1b%e2q+ЉZ*-N@:ݬy9JU+** tY wO)+tҥMU򊋣GX"23'hĀ-6j> j XZeM2%&gNt7@znnB2|M7Y]uku}I$? %DbĈ#F1bĈ??x^{}Ay 2;~l(W$f}yx/ 9]u5V_G 8ɟ x2w8|Y_`Y1bĈ#F1bx+G+^A?7pxr=o_{=oUEnni3Mm…ywsf}w??6Mچ[0/oVm܏~cс ;ԆEjN}z1MfrpbF緿{^=Tz؅~dXE=xpߊ+B1bĈ#F/la#RBvyL8YSti._Wy"^9QJx^Vx}G[zp=ݚC~Y]{WGC &+p t`~v3}@)ojvv w]N^5C?0ӄu u]֚5k;XϾ֯x5g[ㅦ Z%%t& [g~s{^1;[ժUϧ*N?V#[ntڵkmooV&x:^.`eW8ƹθR1̢%K"F]c]g\POM;P8ЭĊ8BgH*&,\Z R<1!%4h wR]x]UfgF M:P.[$kb:U: D ߿Utu@W1/[5tx;R9E"s6\pa@CJ ^Pd8"Op f-7C/B4el9aݙ̘.θ@ **v GYcizahhG8p١Cz7jwȐ!JKKhD7!ݔ|dpt8CYqv,\ϿV^^`DmKNgdk08DEY ͪ=5hРݚ`H\ snnn 33?i.[gm&aU ה}oHmɁzĉC?.u›J鼹Zcz:--}Hg9t[1&~Kvb0eI1 Aҍadf7́~Zqn*)naВtäm[+%#{0bĈ#FE +8Bvfػ?#+3kϰw534XPW~az8K8׀icXp&o&o&?J1bĈ#F1JxO8'XM`=Ё.t .5XyP9(7Eۀ(曯X}B'Nv͚=8߹_~]۶BsDiilM5thrؕ#y',Q@*$}9ڷo©_җ}k ;Ե3gNCڡ]D76՘O8\Bdv%:Z(`ŋ@&" -}tV ³ERB\ɪe:uB'<<Q^]}Ǐ]D768J^ZzFa1\\|jڌ @W1F`ď%~w$_'Eb68nK_t 9_Q*[j*77;pmGD76zt&>SG)"',Aat23gee5{mo=͵G'"dk/x0''`Nu 7ufu"rXx{t F]_yҁ_Ax_8x}d'Ё.݈#F1bĈ#F1b_Ю]/ 8Lflxrf bX`} ]Dw|$C̈́ 46"_p%#B'#;sjdwv2UW^h7<@II h A3h8N[nL{ p+ZnQ$d Du֘]{nn_-!UZ,Q %}+_N * ~^e?r'pYp;Ou;Tv7u^g/ 23;)x8˕pZ P뚡IvѣOc>+=NxG?ӽW/N2f`-vBV Gjj]=NB ֤ u _\~w׮!COCݺQcS8N7uye8|AΝQ zxNݺpVq`OFNl~-.샗sJJ@%yyÉ;k~)##8deSX<_NƇ˜c"\t";G!U4(Zw{! 8q7Ώŗ}r`O~DU?8" 7"D<+GN)F1bĈ#F.X-}$K*6"H';2692a_RI ۶w-n^`}KYV[DZEGa>Et@!4RpRHkdɒTPlc93 zbmq5*ӒcfZ#}@V\hZNv_OC P 1'hۄYSR.;V47T;V4ڷ9P2,68{ u*>Eth^{mQ?@h`e@lci(RJȪ2 תGvm> 7bĈ#F1bĈGV3Dd?D=?_? x0#0xy Oċ#F1bĈ#F@9Hە#0Y hC[Dи W d8$ &r q)T8R^S!Bӆ~2%P} BR6iR0TE:n =:ndЃu5mOC/=8@?mʁlS@qiiZVzy2lX`Pqs` >B'FTv{^VP[o z nj} }с.t Ajв2" ;0`>b,ޟ} mC_t869't 9rQ*1rFc-}2Ntcr9n'Z#Æva9>цq)N؂c<qq#Bۚ0`<.bb%)R%IY>цN={Pj0Uo za&mhK6mBٞg|RǙwfhC[h Q={F> RV8/q6!'tV©,~¢:QHJ 0/hÈc-}tV*?Y2IT3l7y< mhK#uK iN$@.">Pƌ'Z^;)8F҇h'`[:k5^G'"lTFoi&҇C76ըs>LƑIhMϗ:'/:BЍ lyef=|a]/::-\TԩoHdHl8J7VKЇh'`[|ҭuͯ %SHݺ9%O3҇-akN^J)"J4 ͎ml1bĈ#F$XQ"v}~[o~dhڷ5aҤF`rX}S 9f9C~c%"G g1{ۛMwT_7Vw;z[g̰7ȃ-Q0z$:J6eYSگnqd.hhAد2QG*)#o .|㍘;mc5UYȨm:vѨQq10;s[\U壃;ȁcco~[l}TToR^nopY >mw}y6>r~o`Q 6>ӿj<4Oā~%8x]rvjv/}5ݧOL@韮Oā+@#F1bĈ%6:}bG }b-88 Ozqe8 O%} ANn!j'g;'p"}/'t9D>s9' D>{ \O{|ߧ=/0| _`#F1bĈ?y⌖}<`Ŋ{ǚlYXv+$?)X&MW uO<0_t|>~aKYXQ*(֑h׮ݪ\ݮwղݐ浺7o$Z$j=)s3$D]5ZokN"]L]䫚GL8" =Gw|~Jjj2z)]O YnL=>Wj99 f_Ǒ+l$&K+?bئoB_O,R}[rBv,UWvگ`W+mX0P4zZ 7֥ПR&r0W}' pZ gk 8-#ۑ-f(Ӥi}bIJb'Ox!O,>w'1~bǑGO X;O?yI!!O,>}c&$O,@l?~s w>|X6$'OLؾ㟖ZB X>1}'_Ԫ a!#Š 7GyA1W6I@x @x;'7/ IQ#F1bĈmtiT*}K* ޸zG8/;ᬳpvֺ wm_:cKYtxv+\Iz:kukwyu`hC[B_'Pի/Us2,ZVV%WOp6}с.tS?]?lh2'8FںG n>qzu]B~?H\хNt7gHP`Game'4 %qҏvСwo8h>P֊%T cvѷ:4C]>Y+h*UR4lLP1kBc Ѧ"]5ZQ }b%YEBQ*PIED4tiȚc Bgh8!Ra3`}M=}mZ XIJG!|tiU4ODʁѥ u|>A$8 R $ v9HarЎM ecDN ~ M/:qO.Dd(d #MF;X_r$TGD)QрP^{_|FؔPN^C苎ߢM:ONR=j;%%Vb[?8}/:<^d*͎]Ų"#uo$#F1bĈOA OAJIOL\ppV> :׏!Nyq} 4+=AEI8ND>ou^o}^o}^;꼂;;w\yo@ b :'O'ZWp>}bAx㻟MX?1bp pHa(^So_tbW@y( #F1b[))} Vlc P`#}>ś/8l#]{71֥L)w:cm/@/Xx1f.]h jTwҥrq@چt !CQ?~{ {F{~5W*5 p6uhхNt7)Uron>ivرq *:КlW*W!a+!rq *hQ!>!%[K}(P?X?`~AA@As`_DHvQQZIBO P,D}'Aak =!C+*[aUUx68N_tDK%0z鋎hyˡg1xz}A`AG{S5g[±.苎D ">5S ̛#Z0z [p;0E/׋f^Pmq}B5pNYN1#0Afdllc /:"/M;_gy)?>P9n\ম]7>/:"/40|nߧOo^s5MW 'v ] F*oFoRq!ÆE^_/%EG@=.hO n`vnn<}%Fk\<}1bĈ#Fl7`XDZ >j}68ܭмX(oUVW_`]wYwi1'p}{}:q 4k?"6~}A~i3gz/(UBM+++=1x/@'} Ǚ/@/`ԩvYuutV-V/ &Mq 0?s\(AyR`#BB \_!鋎Hą "D-q7gcEGI|_< D,j8Fli} UX.^.^r8D{P.rxKBlcnܒq mq:OZaj+X,q8FE08&x;n,q/:^_v.AN<05xK܁Wh?!Clճ\_ N(&/HbbW$Z^z}Aۮ] ɉWonb__йsg[nv}1 +1bĈ#F},""e&,E~JŪ;U;c63d 7l["rVZ;&uMۑ+~X%Em\?(k^y% F+\cV<«7Geajhh,-Vί2QGZn\xCrZUkox,˲#Q$%Ɨ٥ee3V:C{f?8^v ^ [4A?:W~;7%j)JIˁtFX1#hcNJ=u]^7goݸ`jvl CV)8eT8+\~l1bĈ#FĦX'Ol?H\\B\ Ol%wn0 ݒXv~(mO4N)-1D^Nr1lj}8=r"q}N59=? 8ҒQ8ppppppp p =~5\A7CKS[99ɖ~2\܀g)-1ЇBUD\#![8Gq"&p{8@8&$#EX{G0/ yǯ \{q}8Ims:5Oׇ hN\{q}8Ίx3*-p5O xKS[ckps78g$f iw0.Nn{ '-#+3;  @hn!Iq}>܄`!%)-\#b NS "֘DfBcsz A.OY1~.)\܃#_b#8[ 8G ͯcBgN8+p .'v6nĈ#F1bĈ[^i:5B_t+ Y'wsuw/:NTr vmflKR z&hC[j=bh~dZtEl^eOVE@;ljvB_tn¸eى6fͲV^m\ʺmMBb,@Љnl`˳@ݽ˝;pW/Q>1~1o޼}C76 :Tn B,VP&BÇЖ>]j)?W/Z(:*څ#/^EЉnl`q& Ռٳ AB:\J %ц~@WH/6ոt -^yEMN8Ѥ0@WH/6՘RijH@"5@E[/Bz\:M#.`:EJ(9>ʨ2p fhStz:*w,]#{(+H_K1}b1SR;)ʦ69t\JGI&m]]!V#T()P^UzT]y4VڶmmЁ.tjO_th kNOTKO|=iJ7Bit*.fNȘ'8F6{>@/P2AFpI-҇Zz~y݊hCۤzm-1bĈ#F1[j1~ܔ)uwYCd3^~~JH4ٿv'ҺpҀtuƁMFܧ9&Lx`ҤI4+BmGWqF2 0aA3j(CtmbQ:qMu⾷;D% $G@^8 ^GIS]]BE=C[O%Y^!8ss!fOqAὸe/?X闛{R +l+% @c(``Ki8s.8ƉvsoM3<'o֬zXyzPZAڗ]%}z#QC ?摛8jz905xf sa|Bsn5X֧ϡiNUcCǎmMjI/rk̬,xx%Gj#̉/Vr)ڜ}pjH>}m}oj]YZtOK#Q"۵{J &O ;}YKM[y귽^AO*b#5wBm.6~h{K&^ͦKdI'G#.X-0' g/mw{eiId{~B؍t}>ц(vR, Vmܐ[.'"]ǎ%rrrN=5V?p N<(Rn)3O|S{±pI!R?;Cs I'?r#2k^Z%_.]rO2kOz=99q*.#F1bĈ#YV`DwV&'_f7ٝ( B'є[׬[gprpgA'-QspĂNwЉnl`U-G<cgA'ƩZLO !΂Ntc[SA,u5C`ܩJ(5Ϯ׍pʜ9qwN:ЮxFBщnl`q.*R Xq_''хNtc[Z9 `E`)qML @:э t)No(@_t @C@!lI4{}C@TZגt IQ)<ϙ72nĈ#F1}jMl߱z?n w`ǎ6oܹ;~qߠ=ow#h'֐ۿ/`}?/Avj^Ґvǎ픔 f~3رclѮ];_]CP-LA;ӧOǏ΁o9"ZCYcX :pСgΜϞ= Oo7 5+ nBs&)|&؎%p;Fp%\\!}Fo_s/nӦ}M7Emh{/ ,:lO#[z-wޱo7߶V{5vq_!l#~b z~-?q}P@6рKatB?Lv?* f>;~u *[n#[ܵaܳ MX'[k5ȶ4 'Jxf`2bĈ#F1.lg}n7 *wہ;volYvmL8:rʕcmq̽<o;|_lGfSmnjߐ>y\hŻjZeacdۓڶzWe)F!WHǬwUer Fi2!P'Pf'ցbMd'Pf^ D;@a D؟KPisEEʯ"O|'ց\̀'8GG_ $Z~wG'c$K)[Th(_yh7 2B41Ж>tpQIs䷗/.B[#`}n:{uuoЇh*'|G/rrq,[FZqw)ShKvF lCj+ֱqs=-otxyxs׮av㘫iո7#8 }T Mmq,9 ;EPcн Ӗ>E鎱pa_Ghŭ ΟDgĈ#F1bđݷxHz-'l7Pٶxy_u my8:ەwA#XQ]}ʎg_َ>L'&V#CЈ`Xp}sKL + 8*@tx#u,ᗠB9{(oLt'D&@@(7Bo>K0"2` ~P СXEǛK$8HH-)EKޙg’JzmhKF&@"GK+*S:ɤB({mhKX\q&l-EJto~;O[WTyld:"Fן.Ϯ-C>`HF4ˁ.}*bb>*Ϗj?czM}<};l+Ҿ"q  ړԦM9`}y:u&;v|1_R!Tww1Ж>E7p:k68_pNܾ))4:u цp!##c_$<!<!v1bĈ#F1ID"&MJ٦j&xrXO՚ B-[얈'̞md|RȪ䤽tEmE3ͯf;`K4ɮҁMyy$=_ݼ9*N--6hdu~a8R)ƧL7h o{X/V/x#fN=VQq1m=vhԨ?ĶOLJmrb#32~Eh ȁc:tF+7Um;uz«^'Nnj;tW=^r՗\gXGaхNjTzKAL9*Y&;{ێ,s:[4c1CJ)ҿScܹo\V>%eP<=U'lJ4d3ͳQ%5<XԞ}i>RmԡLfdt}oРgfH9j,kRmkg hTVsBJhY]~n;w06bv'73 jTfԩu0+!eeXaLrB?zOM ::DہRx3aZBkCb1J6h2nfԘ1m"Ă "4IՐjb':}2,+B3ͺ3b籴ÿ>GG@75%<.1tӯ}^.~\߇p !'\C>s>!qhyso#pA3;C~y: p/^3;Cr a .Nn tcp p z p:!)C' 'GpS[cCF>}'LT?8Q 9=v>}'Rnp8I[89dw .Nn%O8A8'-nuT v.!Tʕ+;w'#ǽ>eUuKpu(( F+'1^m:Ni^۶ s,9^U;hHHU 5 7 ŕJJx>z NU'JH)qQonl XR]r`NS7ͳckjT飗(7<)Сע09~3趆 1!) >bfKn{#:*Qmq1-҂K27g 2tvU&.;9[/ Oon={H.l' \ߖQJկ_#tD^8ގzu~8Mҷz3h^>%haИ~[n``:lt^v.)~4]%Pz+ǸoƈSi9.T8_h`^M7ߌ.G+5J }gu߄=!o )W5k:'бK%f`n.̻>HKK;<ȰMA߿.] Q49HtUg#3L ]3իsspPUm.]Sjq*%ؓ|Gu={l@jjjݺu똜|z޽6ןu+;Y}`q¥fDŽ҈#F1bĈQNۍ2-7_~rOW`:A̚s33+{{m@3iBDٰVaUk:y:b9(ʱ^}3O3g3xٲȍi{̛WBm˷^'>arFh ?8߁WTHޡlG?~Sٳ,dvΜ=/d-v۝9εfpV n5q&͙S'?+׮ՏZAZbgoߜYm2܁j?i#R;o{ 䤆~?qF҂+=UZ1cglGiznuaډs ,CZ-b9 7r``9h<9>u@s\/Y^!M\_m48aƁ{@!Afͺhbܥ K4}UVMt[QU DSoNknfˁ? %tf \`:53PZ_iMIӦ]NNOD90SXWL~}SzKҽ_`b{۷M%ἢ"8[t/~npAu%Pͬ#ں՚Ѩ4g|opf߲pa xa skP8sov^M-}gڹۢh|khKo_V]Y *~h=THHK_DBЎ䙳gvD/O|]\$9  ל}!b#@<}V \҇eWU욨/ջo߾6nWIVŘ1,VVg-yGHN̲ѣOe5RtFjsݣBzDcƜ?ș^b1~cM8O'9a _zu|אRTnNd<dxawqm8~g퇡!'p\ "3"M21/W;lb4`ŭ6h%]}Έ %64:T{?q# )RUIC  %Eܥh#<)XHaQ^pq"?-srrr˙ia:%ypJ8Tٛy3v w8!'awXZuX-P#Ώ]7.FDIc5"V :?O\kUUN 9߭3 تR)K>}^[sO7_H3yPȭݠWSGGa |fo(I1bĈ#F1bĈ-Bf N9B ]BNAX(7-ο۩q@UH!&3p An G4CS94v  {q DbA1?\gG@X) AE]G?g07_'}G ZN7Ds!Q:}  rEI+EL>1Dx?Jvqt7"49[f@'O̟?\\t%g9`KPo7aWb9[b=c!!:\C(-lj.Mb'Up[n!΀˂an!n^"zX>1}bN_)xR 8k8Wzbb;w ͒ppp{h>|b%ppp7O!O,_(mI?8E|1|aF"#2L>"#2L>"#2bĈ#F1bĈ DQ+RDA KYM͹ۚ-;7#?s6[\|H"ʆ ǮZ6)-Q4c-\aq^}3,qsdγ{~mwXlYvsͫ_ nj׮?OصrK9OI?$}L^+WPjTGCCiekJN6rrzz&ʁr"?e_|mԧ^ nKҽ_CȐH {۷$֗WTwPh~yt;І W/Ag㍏8\ x}/ƚ~YYvuKo}mU쵇*޷ɗu uh^1o3gZ*'{DU~/U;>_vs3bD+\s= X~:$ oEM8PnBpPx閥f̚ED.ջo߾6zWIVŘ1~4G`PEW}VؒwD,=|}Y8['3R#3>!8Я]6dX_9XNdsB\T8իWxHzr(/w"cde g-:.V%g!Goi~/*tebA'@iEq֙:6I;t9ƷdYw]AG>IENDB`PK!TT;abilian/web/resources/ckeditor/skins/moono/images/close.pngPNG  IHDR7IDATxnDaONPln{Ag6my!x9 6?(%lbLm4e:N%+,X%tXUuh-v.}jRx{Cd]R }.uAD Rk]kRWM\ede& [e.zPwSnxh$sv|&by~BstTs̘ F\Kx&t|A ߓ)>U<[Μ1Mx7^ئMK!x|[98pѠe8Xʼ?#NT 0@ H,_͞mcbE<xuFgð8tMZ[[MY5c; `LhxSqinrCM--,-`f࣏D!`Lhxvw:6u*ˈ&LbCc4*i98pѠ/<{YMcz(L-#.8eVibJcWzRcqg]?96o6w7S[{!H:@hXW7:};(L`2@hn>xbDBbEcoi{-硇NtT=h:5:3F@"P$r0&Es.cT(IL%BR^;11rpA^x>/-^Lz.H0p>_+*.l111rpA^x;LճtVS@r6onj.5h OcGgO+Պҟ6uhxSBvy /odiETTU  n.x< 0z'o\x̩ǙNޮdUT{<oWA@"k^ ot)sⅧ"ʸFwOW_uފ^tR| biu6@ĊIENDB`PK!Z%Eabilian/web/resources/ckeditor/skins/moono/images/hidpi/lock-open.pngPNG  IHDR szzIDATx,Wolx7YN)8)یʱg۶ W'զ=սov;}O9;2gA9vvƘیkULummcsY3, K_~i-[F+|G}on pv^(t\s 1 //%fklDYJ9 Mw&\[/׵ 5`cS4UU r=L M7T^[gcK4o5kIM5hzUe] 3AS:s}f޽#_3FcU S2c&H!ĉ>2`kF޺chz: ^ ̈́{BAoWѩA'U?w޻אZ =iڵx+!08˥BJd^bm=wNlfRTR"ŲIJ/}1v=- i{>ti5\I^AP%[v}]HbN;dv%_#Νsz.u`\q3gJHX\pZZZ51i,^L4/|X0a{N?:7[X-]*,II0`Ԁ:]%{#uk؁5L0A&GLIm <=g Q`IENDB`PK!ѓ@abilian/web/resources/ckeditor/skins/moono/images/hidpi/lock.pngPNG  IHDR szzZIDATxbb9*r- pFm۶kڶm =g^}IMϙMtM_SʸQNRT2)tZ .܊dŋ'NI&uu^-KN+HvmS9_+"Y⍍2Slrͩ'|gOKQS!`mo{9[ZrEPRKΪNR@RٹobN:xΨ?U G \rE 6759qurM| S6>bpC.j HT>-IV6Kq)_7Ǣ?KhQxcc/pvw ȟ/18p!;.1c~a* eҥbtT6>bpC.6Z@ OB|zC`#.9ae qIhM/B-%P``#@xR\r9FlUr<1Se2818' D;$Χ,;찅OvY9gm.,˃ G E-4NMT@0zwk7]wݍ: g Cb]*&tGq#䢁b.aϞ9s#5 @w b|4%<ϓp0 h}Tv97bz9d0pz6>g!q8 "fRŲ+7ާxbc/ppCmW_=KO9vhF#, "K0l|\0 BQK\@3QBdWm}}I@3KþJlkux&ܕ` 6>b슏 w[-6蘝w3ōkTrjT?6!7xvEG008*8y16&"sq@ ͒G`5Iӿ'ah@ Me8;$_ognKfbTC-4f ʿTSFFh6kط4+IENDB`PK!E  Cabilian/web/resources/ckeditor/skins/moono/images/hidpi/refresh.pngPNG  IHDR szzIDATxWKEʚ:6k۶w=1mۊm۶ӽ'olf_|~OnbW_͸sOM gfW,Yl)i{f\)ˀI08$0.!5U9;Aʊo7?傛mX|? e='k륽><)׋^;`#$69fmq_ŹsxP/*[o]r-[_ƻaʪU/[H/ϚutFa0S?)_$ŠA=T HRNhʨ[Gg`AArȑ22:ZFzzzdkkj?N1'[YZ>]ۿ df43vO@Ysb,)+SezJn<>k3u@^s<eu<N(32{)S(1ZesKKXSSlll }gH{l"/_`)y 5-$P@{> tF(<*\\eĩi$u;od.^^1l@YfEee wm{.%=}IN3K^ Ł~[PI&!Km?)kג P}Uѓ'o^] zJNȘ#_Xgsݍʐmն1bя(kֈsFNq =/,+;)kK`F[h-5*o< x55 `NMư\,#N U ZHYHsMي9`f3h=LkI D.nlVg!ɵ]W=, RV K)S/XJg`f?gީfU ? -;[N_Ahh'nA.LB$G@ .S^VVFJ|k2Rf5'Xg\\尗-,$S7WRZ*KalC췡q/~d0H,Lrq%g#9X37ʢbo-7m^GK\9ibvXj0>aa"(A8po70A;jCLu~1M=0eVKeb~G.R()Xbs.6vc^!sґfzwMz P F4KP&xs y3nʔ=_y֤y*ˋTG.kQÆ-3$&^L(" [2m{cKu6?\a#`ycK 3 : Yn;h6CIENDB`PK!q4OO?abilian/web/resources/ckeditor/skins/moono/images/lock-open.pngPNG  IHDR7IDATx]va)m1m`O3 {ضYzb8ڱ]>( ڝ]5aUCBox$.-7qw/ SAK^_g$AӦa 9%.L"MJ,@z 'tUkgZYi縀,":kZ}?M]XkB}7L `Q,`i<(rԧ4{'j]HdhIENDB`PK!KOO:abilian/web/resources/ckeditor/skins/moono/images/lock.pngPNG  IHDR7IDATx]`D'Z۶7XzާG%6ͧיW'8nq%>+W]ą3|h-HY$ҭ.LԖERD5$8&ARy P@|PEeg?$4bN%~܈z_u8yu d=-p;Dž^sM<{B7g*!ȯϲ;.qB]&d[\1NZSbu`W)h`[UN) {uzQIENDB`PK! +=abilian/web/resources/ckeditor/skins/moono/images/refresh.pngPNG  IHDR7^IDATxMlsʶm۶ِySc)w|u̷L/."DQǨ!Bx- (NTZ[c e'gk_:Y|Q jsI&ؚcIa-ZQ>F C,Ÿ`(P^**lU.U[p"InHQbJT""P xRR"WrD_lqD$(%yXB!}: ~Ry49I;-6h&82U{5B3న.  'ګFiZ^۾eKݾNȎhEG,eȠ.vf\X$IENDB`PK!Gac =abilian/web/resources/ckeditor/skins/moono/images/spinner.gifGIF89agggoooxxxqqqfffrrreeeiiipppnnnvvvkkkyyymmmhhhjjjwwwllltttڠ! NETSCAPE2.0! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455! ImageMagick gamma=0.45455!,@>Iy)bңRyZliMV*f(hl{!y^s]ⲗD!,@:PHy=WvJK^)  7ŕL@Rp΍"SPM!,@;Hy=YLMg4y +h'p=Hژ:g ^&!,@@ Gi䁮#%BCʁ;}2^>9{0`BYU-^RcG9)o!,@B Gi䁮$%0ͺoj.pMF&J:UH_T5 )+"Ѯ\5b1ǃ&̦ X!,@A` Gi䁮u%0Z5~ֲR%<Ά'QAcZt]VYɋ !,@=` Gi䁮cl0rMzFfnejr3VBR1f !,@>` Gi䁮cl0\բv7f29O *uPkM(d (-Q!,@> Gi䁮c lN3 ÷T6dȌ23aCnu:Aߔƀ%jic)bT!,@@` Gi䁮cl/C8$`0\u">_I`u5hx!,@@ Gi䁮c l/ َ3d3 te5]ugf!,@@ GiuXo"gp;҅F6cЧu:Mt/Qx#!,@FPx(BϦ (hV ,Cb<2p/;~V rQ8ϯ~OXZ|]RmLA!,@G@Px(P#H(#QSf s\j`tR:LATFfDJEkVX TYyytߧn{81|kXY^klnOqPqBrzCA!,@G@PhDDR:L"TFf5;D&Zfe88X(']^Xmh}QmdgVJA!,@DPpP:@ mJO5@**֒Uz, Dyp>Tzt[jX{CA!,@@ Sfxi; Д_l7{3xt9H&*ͤ3[t4KdKrX!,@L@PhD<ȡtR:L@9LJIM efe )mbL;8zzhNHf~[]~p$Jp{pNA!,@A Q]5Uʨ3]-oyt-OPsEUMbR%^=dn-W3, ;PK!E 4abilian/web/resources/ckeditor/skins/moono/readme.md"Moono" Skin ==================== This skin has been chosen for the **default skin** of CKEditor 4.x, elected from the CKEditor [skin contest](http://ckeditor.com/blog/new_ckeditor_4_skin) and further shaped by the CKEditor team. "Moono" is maintained by the core developers. For more information about skins, please check the [CKEditor Skin SDK](http://docs.cksource.com/CKEditor_4.x/Skin_SDK) documentation. Features ------------------- "Moono" is a monochromatic skin, which offers a modern look coupled with gradients and transparency. It comes with the following features: - Chameleon feature with brightness, - high-contrast compatibility, - graphics source provided in SVG. Directory Structure ------------------- CSS parts: - **editor.css**: the main CSS file. It's simply loading several other files, for easier maintenance, - **mainui.css**: the file contains styles of entire editor outline structures, - **toolbar.css**: the file contains styles of the editor toolbar space (top), - **richcombo.css**: the file contains styles of the rich combo ui elements on toolbar, - **panel.css**: the file contains styles of the rich combo drop-down, it's not loaded until the first panel open up, - **elementspath.css**: the file contains styles of the editor elements path bar (bottom), - **menu.css**: the file contains styles of all editor menus including context menu and button drop-down, it's not loaded until the first menu open up, - **dialog.css**: the CSS files for the dialog UI, it's not loaded until the first dialog open, - **reset.css**: the file defines the basis of style resets among all editor UI spaces, - **preset.css**: the file defines the default styles of some UI elements reflecting the skin preference, - **editor_XYZ.css** and **dialog_XYZ.css**: browser specific CSS hacks. Other parts: - **skin.js**: the only JavaScript part of the skin that registers the skin, its browser specific files and its icons and defines the Chameleon feature, - **icons/**: contains all skin defined icons, - **images/**: contains a fill general used images, - **dev/**: contains SVG source of the skin icons. License ------- Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. Licensed under the terms of any of the following licenses at your choice: [GPL](http://www.gnu.org/licenses/gpl.html), [LGPL](http://www.gnu.org/licenses/lgpl.html) and [MPL](http://www.mozilla.org/MPL/MPL-1.1.html). See LICENSE.md for more information. PK!)  (abilian/web/resources/ckeditor/styles.js/** * Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved. * For licensing, see LICENSE.md or http://ckeditor.com/license */ // This file contains style definitions that can be used by CKEditor plugins. // // The most common use for it is the "stylescombo" plugin, which shows a combo // in the editor toolbar, containing all styles. Other plugins instead, like // the div plugin, use a subset of the styles on their feature. // // If you don't have plugins that depend on this file, you can simply ignore it. // Otherwise it is strongly recommended to customize this file to match your // website requirements and design properly. CKEDITOR.stylesSet.add( 'default', [ /* Block Styles */ // These styles are already available in the "Format" combo ("format" plugin), // so they are not needed here by default. You may enable them to avoid // placing the "Format" combo in the toolbar, maintaining the same features. /* { name: 'Paragraph', element: 'p' }, { name: 'Heading 1', element: 'h1' }, { name: 'Heading 2', element: 'h2' }, { name: 'Heading 3', element: 'h3' }, { name: 'Heading 4', element: 'h4' }, { name: 'Heading 5', element: 'h5' }, { name: 'Heading 6', element: 'h6' }, { name: 'Preformatted Text',element: 'pre' }, { name: 'Address', element: 'address' }, */ { name: 'Italic Title', element: 'h2', styles: { 'font-style': 'italic' } }, { name: 'Subtitle', element: 'h3', styles: { 'color': '#aaa', 'font-style': 'italic' } }, { name: 'Special Container', element: 'div', styles: { padding: '5px 10px', background: '#eee', border: '1px solid #ccc' } }, /* Inline Styles */ // These are core styles available as toolbar buttons. You may opt enabling // some of them in the Styles combo, removing them from the toolbar. // (This requires the "stylescombo" plugin) /* { name: 'Strong', element: 'strong', overrides: 'b' }, { name: 'Emphasis', element: 'em' , overrides: 'i' }, { name: 'Underline', element: 'u' }, { name: 'Strikethrough', element: 'strike' }, { name: 'Subscript', element: 'sub' }, { name: 'Superscript', element: 'sup' }, */ { name: 'Marker', element: 'span', attributes: { 'class': 'marker' } }, { name: 'Big', element: 'big' }, { name: 'Small', element: 'small' }, { name: 'Typewriter', element: 'tt' }, { name: 'Computer Code', element: 'code' }, { name: 'Keyboard Phrase', element: 'kbd' }, { name: 'Sample Text', element: 'samp' }, { name: 'Variable', element: 'var' }, { name: 'Deleted Text', element: 'del' }, { name: 'Inserted Text', element: 'ins' }, { name: 'Cited Work', element: 'cite' }, { name: 'Inline Quotation', element: 'q' }, { name: 'Language: RTL', element: 'span', attributes: { 'dir': 'rtl' } }, { name: 'Language: LTR', element: 'span', attributes: { 'dir': 'ltr' } }, /* Object Styles */ { name: 'Styled image (left)', element: 'img', attributes: { 'class': 'left' } }, { name: 'Styled image (right)', element: 'img', attributes: { 'class': 'right' } }, { name: 'Compact table', element: 'table', attributes: { cellpadding: '5', cellspacing: '0', border: '1', bordercolor: '#ccc' }, styles: { 'border-collapse': 'collapse' } }, { name: 'Borderless Table', element: 'table', styles: { 'border-style': 'hidden', 'background-color': '#E6E6FA' } }, { name: 'Square Bulleted List', element: 'ul', styles: { 'list-style-type': 'square' } } ] ); PK!d::abilian/web/resources/datatables/css/jquery.dataTables.css /* * Table */ table.dataTable { margin: 0 auto; clear: both; width: 100%; } table.dataTable thead th { padding: 3px 18px 3px 10px; border-bottom: 1px solid black; font-weight: bold; cursor: pointer; *cursor: hand; } table.dataTable tfoot th { padding: 3px 18px 3px 10px; border-top: 1px solid black; font-weight: bold; } table.dataTable td { padding: 3px 10px; } table.dataTable td.center, table.dataTable td.dataTables_empty { text-align: center; } table.dataTable tr.odd { background-color: #E2E4FF; } table.dataTable tr.even { background-color: white; } table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; } table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; } table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; } table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; } table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; } table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; } /* * Table wrapper */ .dataTables_wrapper { position: relative; clear: both; *zoom: 1; } /* * Page length menu */ .dataTables_length { float: left; } /* * Filter */ .dataTables_filter { float: right; text-align: right; } /* * Table information */ .dataTables_info { clear: both; float: left; } /* * Pagination */ .dataTables_paginate { float: right; text-align: right; } /* Two button pagination - previous / next */ .paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next { height: 19px; float: left; cursor: pointer; *cursor: hand; color: #111 !important; } .paginate_disabled_previous:hover, .paginate_enabled_previous:hover, .paginate_disabled_next:hover, .paginate_enabled_next:hover { text-decoration: none !important; } .paginate_disabled_previous:active, .paginate_enabled_previous:active, .paginate_disabled_next:active, .paginate_enabled_next:active { outline: none; } .paginate_disabled_previous, .paginate_disabled_next { color: #666 !important; } .paginate_disabled_previous, .paginate_enabled_previous { padding-left: 23px; } .paginate_disabled_next, .paginate_enabled_next { padding-right: 23px; margin-left: 10px; } .paginate_enabled_previous { background: url('../images/back_enabled.png') no-repeat top left; } .paginate_enabled_previous:hover { background: url('../images/back_enabled_hover.png') no-repeat top left; } .paginate_disabled_previous { background: url('../images/back_disabled.png') no-repeat top left; } .paginate_enabled_next { background: url('../images/forward_enabled.png') no-repeat top right; } .paginate_enabled_next:hover { background: url('../images/forward_enabled_hover.png') no-repeat top right; } .paginate_disabled_next { background: url('../images/forward_disabled.png') no-repeat top right; } /* Full number pagination */ .paging_full_numbers { height: 22px; line-height: 22px; } .paging_full_numbers a:active { outline: none } .paging_full_numbers a:hover { text-decoration: none; } .paging_full_numbers a.paginate_button, .paging_full_numbers a.paginate_active { border: 1px solid #aaa; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; padding: 2px 5px; margin: 0 3px; cursor: pointer; *cursor: hand; color: #333 !important; } .paging_full_numbers a.paginate_button { background-color: #ddd; } .paging_full_numbers a.paginate_button:hover { background-color: #ccc; text-decoration: none !important; } .paging_full_numbers a.paginate_active { background-color: #99B3FF; } /* * Processing indicator */ .dataTables_processing { position: absolute; top: 50%; left: 50%; width: 250px; height: 30px; margin-left: -125px; margin-top: -15px; padding: 14px 0 2px 0; border: 1px solid #ddd; text-align: center; color: #999; font-size: 14px; background-color: white; } /* * Sorting */ .sorting { background: url('../images/sort_both.png') no-repeat center right; } .sorting_asc { background: url('../images/sort_asc.png') no-repeat center right; } .sorting_desc { background: url('../images/sort_desc.png') no-repeat center right; } .sorting_asc_disabled { background: url('../images/sort_asc_disabled.png') no-repeat center right; } .sorting_desc_disabled { background: url('../images/sort_desc_disabled.png') no-repeat center right; } table.dataTable thead th:active, table.dataTable thead td:active { outline: none; } /* * Scrolling */ .dataTables_scroll { clear: both; } .dataTables_scrollBody { *margin-top: -1px; -webkit-overflow-scrolling: touch; } PK!}}Fabilian/web/resources/datatables/css/jquery.dataTables_themeroller.css /* * Table */ table.dataTable { margin: 0 auto; clear: both; width: 100%; border-collapse: collapse; } table.dataTable thead th { padding: 3px 0px 3px 10px; cursor: pointer; } table.dataTable tfoot th { padding: 3px 10px; } table.dataTable td { padding: 3px 10px; } table.dataTable td.center, table.dataTable td.dataTables_empty { text-align: center; } table.dataTable tr.odd { background-color: #E2E4FF; } table.dataTable tr.even { background-color: white; } table.dataTable tr.odd td.sorting_1 { background-color: #D3D6FF; } table.dataTable tr.odd td.sorting_2 { background-color: #DADCFF; } table.dataTable tr.odd td.sorting_3 { background-color: #E0E2FF; } table.dataTable tr.even td.sorting_1 { background-color: #EAEBFF; } table.dataTable tr.even td.sorting_2 { background-color: #F2F3FF; } table.dataTable tr.even td.sorting_3 { background-color: #F9F9FF; } /* * Table wrapper */ .dataTables_wrapper { position: relative; clear: both; *zoom: 1; } .dataTables_wrapper .ui-widget-header { font-weight: normal; } .dataTables_wrapper .ui-toolbar { padding: 5px; } /* * Page length menu */ .dataTables_length { float: left; } /* * Filter */ .dataTables_filter { float: right; text-align: right; } /* * Table information */ .dataTables_info { padding-top: 3px; clear: both; float: left; } /* * Pagination */ .dataTables_paginate { float: right; text-align: right; } .dataTables_paginate .ui-button { margin-right: -0.1em !important; } .paging_two_button .ui-button { float: left; cursor: pointer; } .paging_full_numbers .ui-button { padding: 2px 6px; margin: 0; cursor: pointer; color: #333 !important; } /* Two button pagination - previous / next */ .paginate_disabled_previous, .paginate_enabled_previous, .paginate_disabled_next, .paginate_enabled_next { height: 19px; float: left; cursor: pointer; color: #111 !important; } .paginate_disabled_previous:hover, .paginate_enabled_previous:hover, .paginate_disabled_next:hover, .paginate_enabled_next:hover { text-decoration: none !important; } .paginate_disabled_previous:active, .paginate_enabled_previous:active, .paginate_disabled_next:active, .paginate_enabled_next:active { outline: none; } .paginate_disabled_previous, .paginate_disabled_next { color: #666 !important; } .paginate_disabled_previous, .paginate_enabled_previous { padding-left: 23px; } .paginate_disabled_next, .paginate_enabled_next { padding-right: 23px; margin-left: 10px; } .paginate_enabled_previous { background: url('../images/back_enabled.png') no-repeat top left; } .paginate_enabled_previous:hover { background: url('../images/back_enabled_hover.png') no-repeat top left; } .paginate_disabled_previous { background: url('../images/back_disabled.png') no-repeat top left; } .paginate_enabled_next { background: url('../images/forward_enabled.png') no-repeat top right; } .paginate_enabled_next:hover { background: url('../images/forward_enabled_hover.png') no-repeat top right; } .paginate_disabled_next { background: url('../images/forward_disabled.png') no-repeat top right; } /* Full number pagination */ .paging_full_numbers a:active { outline: none } .paging_full_numbers a:hover { text-decoration: none; } .paging_full_numbers a.paginate_button, .paging_full_numbers a.paginate_active { border: 1px solid #aaa; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; padding: 2px 5px; margin: 0 3px; cursor: pointer; color: #333 !important; } .paging_full_numbers a.paginate_button { background-color: #ddd; } .paging_full_numbers a.paginate_button:hover { background-color: #ccc; text-decoration: none !important; } .paging_full_numbers a.paginate_active { background-color: #99B3FF; } /* * Processing indicator */ .dataTables_processing { position: absolute; top: 50%; left: 50%; width: 250px; height: 30px; margin-left: -125px; margin-top: -15px; padding: 14px 0 2px 0; border: 1px solid #ddd; text-align: center; color: #999; font-size: 14px; background-color: white; } /* * Sorting */ table.dataTable thead th div.DataTables_sort_wrapper { position: relative; padding-right: 20px; } table.dataTable thead th div.DataTables_sort_wrapper span { position: absolute; top: 50%; margin-top: -8px; right: 0; } table.dataTable th:active { outline: none; } /* * Scrolling */ .dataTables_scroll { clear: both; } .dataTables_scrollBody { *margin-top: -1px; -webkit-overflow-scrolling: touch; } PK!lbkbk9abilian/web/resources/datatables/images/Sorting icons.psd8BPSY:8BIM%8BIM$9K application/vnd.adobe.photoshop Adobe Photoshop CS2 Windows 2010-01-17T08:43:39Z 2010-01-17T09:53:06Z 2010-01-17T09:53:06Z uuid:220CFA684403DF11A9A8BDB603A4D90D uuid:C7B5E33A4603DF11A9A8BDB603A4D90D 1 720090/10000 720090/10000 2 256,257,258,259,262,274,277,284,530,531,282,283,296,301,318,319,529,532,306,270,271,272,305,315,33432;B41D6D118D265E2E28AF557E99C071A1 19 19 1 36864,40960,40961,37121,37122,40962,40963,37510,40964,36867,36868,33434,33437,34850,34852,34855,34856,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37396,41483,41484,41486,41487,41488,41492,41493,41495,41728,41729,41730,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,42016,0,2,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,28,30;7A673769D20BEC7273BEFB09FBCCF7C5 3 sRGB IEC61966-2.1 8BIMHNHN8BIM&?8BIM Transparency8BIM Transparency8BIMd8BIM8BIM x8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM8BIM 8BIM08BIM-8BIM@@8BIM8BIMnullbaseNameTEXTUserboundsObjcRct1Top longLeftlongBtomlongRghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlongRghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM H HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km8BIM8BIM x<t\JFIFHH Adobe_CMAdobed            "?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?TCW&ϵrJn$I)U}ܟ+tSRKTS8BIM!UAdobe PhotoshopAdobe Photoshop CS28BIM".MM*bj(1r2i ' 'Adobe Photoshop CS2 Windows2010:01:17 09:53:06&(.HH8BIM`moptdTargetSettingsClrTObjc ColorTableClrsVlLsisExactboolMttCObjc NativeQuadBl longGrn longRd longTrnsbool addMetadatabool autoReduceboolcolorTableControlObjcColorTableControl lockedColorsVlLs shiftEntriesVlLsditherAlgorithmenumDitherAlgorithmDfsn ditherPercentlongd fileFormatenum FileFormatPNG8 interlacedbool noMatteColorbool numColorslongreductionAlgorithmenumReductionAlgorithmSelerolloverMasterPalettebooltransparencyDitherAlgorithmenumDitherAlgorithmNonetransparencyDitherAmountlongdwebShiftPercentlong zonedDitherObjc ZonedInfo channelIDlong emphasizeTextboolemphasizeVectorsboolfloorlongzonedHistogramWeightObjc ZonedInfo channelIDlong emphasizeTextboolemphasizeVectorsboolfloorlong8BIM-msetnullVersionlong8BIMms4w8BIMmaniIRFR8BIMAnDsnullAFStlongFrInVlLsObjcnullFrIDlongA$FStsVlLsObjcnullFsIDlongAFrmlongFsFrVlLslongA$LCntlong8BIMRoll8BIMmfriNNNN8BIMnorm ( Background8BIMluni Background8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp J"""8BIMnorm ( Down enabled8BIMluni Down enabled8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp@2̲@7 j J"""8BIMnorm ( Up enabled8BIMluni Up enabled8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp JJJJ8BIMnorm( Down disabled8BIMlfx2nullScl UntF#Prc@YqmasterFXSwitchboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@IClr ObjcRGBCRd doub@oGrn doub@oBl doub@o8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul 8BIMisdw3x8BIMmul 8BIMoglw*8BIMscrn8BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluni Down disabled8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrp JJJJ8BIMnorm ( Up Disabled8BIMlfx2nullScl UntF#Prc@YqmasterFXSwitchboolSoFiObjcSoFienabboolMd enumBlnMNrmlOpctUntF#Prc@IClr ObjcRGBCRd doub@oGrn doub@oBl doub@o8BIMlrFX8BIMcmnS8BIMdsdw3x8BIMmul 8BIMisdw3x8BIMmul 8BIMoglw*8BIMscrn8BIMiglw+8BIMscrn8BIMbevlNx8BIMscrn8BIMmul 8BIMsofi"8BIMnorm8BIMluni Up Disabled8BIMlyid8BIMclbl8BIMinfx8BIMknko8BIMlspf8BIMlclr8BIMfxrpxZZ00x  x00ZZxxZZ00x x00ZZx8BIMPatt    xZZ00x PK!OvYY9abilian/web/resources/datatables/images/back_disabled.pngPNG  IHDRYG IDATxbO2@_k`xm۶5\Ք=eaflqlcwsleHW[d$$l28MV}G$8.s +;W/xT3 Gn,o"KUC+ )HL*V[ulP/3vO ~Q9y7X04._ROŢ=r|١0}f:s-zUn^lg\pYWY>)lng 9yN#3UUd-ԮT1IENDB`PK!|8abilian/web/resources/datatables/images/back_enabled.pngPNG  IHDRrP6IDATxᕳm۶m۶mƳF/:F3hS4-ߔX6ub^@˩ioYr9?А3~R˙>X] e+vdDRq6u>cssT4r{3E'A3`ɳ؍<Z0"7P󀹙s^g> ^L8p,6uYCg߽4̜=(6m;.cPP{^0w/ *1=1qG7nl0bڳN/O~bgX1NK-d”GY:PҊPP}0C5ӟ٥WD]@+4@lNQAe*bbTEFTѮIENDB`PK!d[>abilian/web/resources/datatables/images/back_enabled_hover.pngPNG  IHDRrP6IDATx@Ѯm۶mUQmqRaml#8hoOAjL#Up-Z;hQdyhŐAfkbAv:DtC胾NA(Z!P,ȑJqWL6o>IENDB`PK!p~~3abilian/web/resources/datatables/images/favicon.icoh(   mqq=>>>98@:8???_dd=63rQIvlˈ}ЃylcRKP=:immorr4%wݍ{r吊쬦wwo_:5SUU8)$ʏֆ{xozs멥wpf<8djk1/.thԎuxo䛕벮䚕ێhbE42ڱT>7ҘЇ{tۈ컶ÿ吋oh}wytA={mnnbVә΍Џ޶ضlj}tmpk統~{OLBAANNNqcњȓЦÜvwlniqpSR922UUTqcМ˝ùֳĕr͈]\NL811~bVԡ׳Ż͟Ɩޮ︸}|QQA?ECCQ>8ԣڹƒĒҮ읜ZZUUv)'EDDn`޳ԱټlkPPGF2 :/+zҜڻ꽹xuPOTSI}3)%ugԝןݠ⑉snZXFE=kppLHGbIAZOcYVP;8u''G32^`a:99533NQQPK!ԑ^^<abilian/web/resources/datatables/images/forward_disabled.pngPNG  IHDRYG%IDATxh?Qo۶m۶mۘm/sHSkK 3t~q>h=!Ds"|&="|.h1ZtSHaTs֎dU}% b㍅D߇(Lu{k!? TD:gu2<]Q_#` P:d}<8>F z:ם(":?gqSlg S0w9Ia3q,`-8"!tX g"ӌ87jeΘhfNGLZ.tIENDB`PK!;abilian/web/resources/datatables/images/forward_enabled.pngPNG  IHDRrP6IDATxlPW>۶m۶m۶=;MͶmirquAZL'C~ՋO} Td诿KҬt~1Ȗo9TcØw_2a5<{x ^L%Is>%~tž+<紇75zJ Ѥ{!2:tLo&}SVES&צ9Ϫ<Yu;6T\^MܵU_e8+`!59 Im0-3O>bY04l0DayMZV ^NprlS&,t#x4* [P=aZz@qfr6dE~u7̥t<f;}.NqܤR5a!`[7OۻRʈ06 @ass۔a^'˰ț]}vm3ɐvb .ۯiOcffsbu  цy~kTK ( A@lĊ@̏e(qB-@, b 6b% bPq\`Z;^uI<\$gҰvogdўu;1(}ICŎn.X v b,[ EXJ,!'o2B5r@1kH6 `Bj/IENDB`PK!dM44abilian/web/resources/datatables/images/sort_asc.pngPNG  IHDRrP6uIDATxc?0} j/ &AZ@m V&0FF 6'1ߡ mH2  ;'GPHaaبa"^lIENDB`PK!dM4=abilian/web/resources/datatables/images/sort_asc_disabled.pngPNG  IHDRrP6uIDATxc?0} j/ &AZ@m V&0FF 6'1ߡ mH2  ;'GPHaaبa"^lIENDB`PK!q5abilian/web/resources/datatables/images/sort_both.pngPNG  IHDRYGIDATxѵ@@g :VAIM0{P'}wy)gB­t6haL㈋X$z lBӏq8>M?SY|5л)_Y38ndrGzAfޙE:$\xaA"M/,IENDB`PK!\5abilian/web/resources/datatables/images/sort_desc.pngPNG  IHDRrP6sIDATxc?0l԰QêFO ≤;?yi B3;I5'6$Na6Ԡ@E^l" _@\ SjObh"IENDB`PK!yĹ'>abilian/web/resources/datatables/images/sort_desc_disabled.pngPNG  IHDRYGfIDATxcOQew"DŮ͝OPE8aD@6e |6P;Z@6e}םR M@۝ w,/:U|cIENDB`PK!l VV8abilian/web/resources/datatables/js/jquery.dataTables.js/** * @summary DataTables * @description Paginate, search and sort HTML tables * @version 1.9.4 * @file jquery.dataTables.js * @author Allan Jardine (www.sprymedia.co.uk) * @contact www.sprymedia.co.uk/contact * * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved. * * This source file is free software, under either the GPL v2 license or a * BSD style license, available at: * http://datatables.net/license_gpl2 * http://datatables.net/license_bsd * * This source file 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 license files for details. * * For details please refer to: http://www.datatables.net */ /*jslint evil: true, undef: true, browser: true */ /*globals $, jQuery,define,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros,_fnBrowserDetect,_fnGetColumns*/ (/** @lends */function( window, document, undefined ) { (function( factory ) { "use strict"; // Define as an AMD module if possible if ( typeof define === 'function' && define.amd ) { define('jquery.dataTables', ['jquery'], factory ); } /* Define using browser globals otherwise * Prevent multiple instantiations if the script is loaded twice */ else if ( jQuery && !jQuery.fn.dataTable ) { factory( jQuery ); } } (/** @lends */function( $ ) { "use strict"; /** * DataTables is a plug-in for the jQuery Javascript library. It is a * highly flexible tool, based upon the foundations of progressive * enhancement, which will add advanced interaction controls to any * HTML table. For a full list of features please refer to * DataTables.net. * * Note that the DataTable object is not a global variable but is * aliased to jQuery.fn.DataTable and jQuery.fn.dataTable through which * it may be accessed. * * @class * @param {object} [oInit={}] Configuration object for DataTables. Options * are defined by {@link DataTable.defaults} * @requires jQuery 1.3+ * * @example * // Basic initialisation * $(document).ready( function { * $('#example').dataTable(); * } ); * * @example * // Initialisation with configuration options - in this case, disable * // pagination and sorting. * $(document).ready( function { * $('#example').dataTable( { * "bPaginate": false, * "bSort": false * } ); * } ); */ var DataTable = function( oInit ) { /** * Add a column to the list used for the table with default values * @param {object} oSettings dataTables settings object * @param {node} nTh The th element for this column * @memberof DataTable#oApi */ function _fnAddColumn( oSettings, nTh ) { var oDefaults = DataTable.defaults.columns; var iCol = oSettings.aoColumns.length; var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, { "sSortingClass": oSettings.oClasses.sSortable, "sSortingClassJUI": oSettings.oClasses.sSortJUI, "nTh": nTh ? nTh : document.createElement('th'), "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], "mData": oDefaults.mData ? oDefaults.oDefaults : iCol } ); oSettings.aoColumns.push( oCol ); /* Add a column specific filter */ if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null ) { oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch ); } else { var oPre = oSettings.aoPreSearchCols[ iCol ]; /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */ if ( oPre.bRegex === undefined ) { oPre.bRegex = true; } if ( oPre.bSmart === undefined ) { oPre.bSmart = true; } if ( oPre.bCaseInsensitive === undefined ) { oPre.bCaseInsensitive = true; } } /* Use the column options function to initialise classes etc */ _fnColumnOptions( oSettings, iCol, null ); } /** * Apply options for a column * @param {object} oSettings dataTables settings object * @param {int} iCol column index to consider * @param {object} oOptions object with sType, bVisible and bSearchable etc * @memberof DataTable#oApi */ function _fnColumnOptions( oSettings, iCol, oOptions ) { var oCol = oSettings.aoColumns[ iCol ]; /* User specified column options */ if ( oOptions !== undefined && oOptions !== null ) { /* Backwards compatibility for mDataProp */ if ( oOptions.mDataProp && !oOptions.mData ) { oOptions.mData = oOptions.mDataProp; } if ( oOptions.sType !== undefined ) { oCol.sType = oOptions.sType; oCol._bAutoType = false; } $.extend( oCol, oOptions ); _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" ); /* iDataSort to be applied (backwards compatibility), but aDataSort will take * priority if defined */ if ( oOptions.iDataSort !== undefined ) { oCol.aDataSort = [ oOptions.iDataSort ]; } _fnMap( oCol, oOptions, "aDataSort" ); } /* Cache the data get and set functions for speed */ var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null; var mData = _fnGetObjectDataFn( oCol.mData ); oCol.fnGetData = function (oData, sSpecific) { var innerData = mData( oData, sSpecific ); if ( oCol.mRender && (sSpecific && sSpecific !== '') ) { return mRender( innerData, sSpecific, oData ); } return innerData; }; oCol.fnSetData = _fnSetObjectDataFn( oCol.mData ); /* Feature sorting overrides column specific when off */ if ( !oSettings.oFeatures.bSort ) { oCol.bSortable = false; } /* Check that the class assignment is correct for sorting */ if ( !oCol.bSortable || ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) ) { oCol.sSortingClass = oSettings.oClasses.sSortableNone; oCol.sSortingClassJUI = ""; } else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 ) { oCol.sSortingClass = oSettings.oClasses.sSortable; oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI; } else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 ) { oCol.sSortingClass = oSettings.oClasses.sSortableAsc; oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed; } else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 ) { oCol.sSortingClass = oSettings.oClasses.sSortableDesc; oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed; } } /** * Adjust the table column widths for new data. Note: you would probably want to * do a redraw after calling this function! * @param {object} oSettings dataTables settings object * @memberof DataTable#oApi */ function _fnAdjustColumnSizing ( oSettings ) { /* Not interested in doing column width calculation if auto-width is disabled */ if ( oSettings.oFeatures.bAutoWidth === false ) { return false; } _fnCalculateColumnWidths( oSettings ); for ( var i=0 , iLen=oSettings.aoColumns.length ; i
  • ')[0]; oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable ); /* * All DataTables are wrapped in a div */ oSettings.nTableWrapper = $('
    ')[0]; oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling; /* Track where we want to insert the option */ var nInsertNode = oSettings.nTableWrapper; /* Loop over the user set positioning and place the elements as needed */ var aDom = oSettings.sDom.split(''); var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j; for ( var i=0 ; i')[0]; /* Check to see if we should append an id and/or a class name to the container */ cNext = aDom[i+1]; if ( cNext == "'" || cNext == '"' ) { sAttr = ""; j = 2; while ( aDom[i+j] != cNext ) { sAttr += aDom[i+j]; j++; } /* Replace jQuery UI constants */ if ( sAttr == "H" ) { sAttr = oSettings.oClasses.sJUIHeader; } else if ( sAttr == "F" ) { sAttr = oSettings.oClasses.sJUIFooter; } /* The attribute can be in the format of "#id.class", "#id" or "class" This logic * breaks the string into parts and applies them as needed */ if ( sAttr.indexOf('.') != -1 ) { var aSplit = sAttr.split('.'); nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1); nNewNode.className = aSplit[1]; } else if ( sAttr.charAt(0) == "#" ) { nNewNode.id = sAttr.substr(1, sAttr.length-1); } else { nNewNode.className = sAttr; } i += j; /* Move along the position array */ } nInsertNode.appendChild( nNewNode ); nInsertNode = nNewNode; } else if ( cOption == '>' ) { /* End container div */ nInsertNode = nInsertNode.parentNode; } else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange ) { /* Length */ nTmp = _fnFeatureHtmlLength( oSettings ); iPushFeature = 1; } else if ( cOption == 'f' && oSettings.oFeatures.bFilter ) { /* Filter */ nTmp = _fnFeatureHtmlFilter( oSettings ); iPushFeature = 1; } else if ( cOption == 'r' && oSettings.oFeatures.bProcessing ) { /* pRocessing */ nTmp = _fnFeatureHtmlProcessing( oSettings ); iPushFeature = 1; } else if ( cOption == 't' ) { /* Table */ nTmp = _fnFeatureHtmlTable( oSettings ); iPushFeature = 1; } else if ( cOption == 'i' && oSettings.oFeatures.bInfo ) { /* Info */ nTmp = _fnFeatureHtmlInfo( oSettings ); iPushFeature = 1; } else if ( cOption == 'p' && oSettings.oFeatures.bPaginate ) { /* Pagination */ nTmp = _fnFeatureHtmlPaginate( oSettings ); iPushFeature = 1; } else if ( DataTable.ext.aoFeatures.length !== 0 ) { /* Plug-in features */ var aoFeatures = DataTable.ext.aoFeatures; for ( var k=0, kLen=aoFeatures.length ; k') : sSearchStr==="" ? '' : sSearchStr+' '; var nFilter = document.createElement( 'div' ); nFilter.className = oSettings.oClasses.sFilter; nFilter.innerHTML = ''; if ( !oSettings.aanFeatures.f ) { nFilter.id = oSettings.sTableId+'_filter'; } var jqFilter = $('input[type="text"]', nFilter); // Store a reference to the input element, so other input elements could be // added to the filter wrapper if needed (submit button for example) nFilter._DT_Input = jqFilter[0]; jqFilter.val( oPreviousSearch.sSearch.replace('"','"') ); jqFilter.bind( 'keyup.DT', function(e) { /* Update all other filter input elements for the new display */ var n = oSettings.aanFeatures.f; var val = this.value==="" ? "" : this.value; // mental IE8 fix :-( for ( var i=0, iLen=n.length ; i=0 ; i-- ) { var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ), oSettings.aoColumns[iColumn].sType ); if ( ! rpSearch.test( sData ) ) { oSettings.aiDisplay.splice( i, 1 ); iIndexCorrector++; } } } /** * Filter the data table based on user input and draw the table * @param {object} oSettings dataTables settings object * @param {string} sInput string to filter on * @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0) * @param {bool} bRegex treat as a regular expression or not * @param {bool} bSmart perform smart filtering or not * @param {bool} bCaseInsensitive Do case insenstive matching or not * @memberof DataTable#oApi */ function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive ) { var i; var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive ); var oPrevSearch = oSettings.oPreviousSearch; /* Check if we are forcing or not - optional parameter */ if ( !iForce ) { iForce = 0; } /* Need to take account of custom filtering functions - always filter */ if ( DataTable.ext.afnFiltering.length !== 0 ) { iForce = 1; } /* * If the input is blank - we want the full data set */ if ( sInput.length <= 0 ) { oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); } else { /* * We are starting a new search or the new search string is smaller * then the old one (i.e. delete). Search from the master array */ if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length || oPrevSearch.sSearch.length > sInput.length || iForce == 1 || sInput.indexOf(oPrevSearch.sSearch) !== 0 ) { /* Nuke the old display array - we are going to rebuild it */ oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length); /* Force a rebuild of the search array */ _fnBuildSearchArray( oSettings, 1 ); /* Search through all records to populate the search array * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1 * mapping */ for ( i=0 ; i').html(sSearch).text(); } // Strip newline characters return sSearch.replace( /[\n\r]/g, " " ); } /** * Build a regular expression object suitable for searching a table * @param {string} sSearch string to search for * @param {bool} bRegex treat as a regular expression or not * @param {bool} bSmart perform smart filtering or not * @param {bool} bCaseInsensitive Do case insensitive matching or not * @returns {RegExp} constructed object * @memberof DataTable#oApi */ function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive ) { var asSearch, sRegExpString; if ( bSmart ) { /* Generate the regular expression to use. Something along the lines of: * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$ */ asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' ); sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$'; return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" ); } else { sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch ); return new RegExp( sSearch, bCaseInsensitive ? "i" : "" ); } } /** * Convert raw data into something that the user can search on * @param {string} sData data to be modified * @param {string} sType data type * @returns {string} search string * @memberof DataTable#oApi */ function _fnDataToSearch ( sData, sType ) { if ( typeof DataTable.ext.ofnSearch[sType] === "function" ) { return DataTable.ext.ofnSearch[sType]( sData ); } else if ( sData === null ) { return ''; } else if ( sType == "html" ) { return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" ); } else if ( typeof sData === "string" ) { return sData.replace(/[\r\n]/g," "); } return sData; } /** * scape a string such that it can be used in a regular expression * @param {string} sVal string to escape * @returns {string} escaped string * @memberof DataTable#oApi */ function _fnEscapeRegex ( sVal ) { var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ]; var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' ); return sVal.replace(reReplace, '\\$1'); } /** * Generate the node required for the info display * @param {object} oSettings dataTables settings object * @returns {node} Information element * @memberof DataTable#oApi */ function _fnFeatureHtmlInfo ( oSettings ) { var nInfo = document.createElement( 'div' ); nInfo.className = oSettings.oClasses.sInfo; /* Actions that are to be taken once only for this feature */ if ( !oSettings.aanFeatures.i ) { /* Add draw callback */ oSettings.aoDrawCallback.push( { "fn": _fnUpdateInfo, "sName": "information" } ); /* Add id */ nInfo.id = oSettings.sTableId+'_info'; } oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' ); return nInfo; } /** * Update the information elements in the display * @param {object} oSettings dataTables settings object * @memberof DataTable#oApi */ function _fnUpdateInfo ( oSettings ) { /* Show information about the table */ if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 ) { return; } var oLang = oSettings.oLanguage, iStart = oSettings._iDisplayStart+1, iEnd = oSettings.fnDisplayEnd(), iMax = oSettings.fnRecordsTotal(), iTotal = oSettings.fnRecordsDisplay(), sOut; if ( iTotal === 0 ) { /* Empty record set */ sOut = oLang.sInfoEmpty; } else { /* Normal record set */ sOut = oLang.sInfo; } if ( iTotal != iMax ) { /* Record set after filtering */ sOut += ' ' + oLang.sInfoFiltered; } // Convert the macros sOut += oLang.sInfoPostFix; sOut = _fnInfoMacros( oSettings, sOut ); if ( oLang.fnInfoCallback !== null ) { sOut = oLang.fnInfoCallback.call( oSettings.oInstance, oSettings, iStart, iEnd, iMax, iTotal, sOut ); } var n = oSettings.aanFeatures.i; for ( var i=0, iLen=n.length ; i'; var i, iLen; var aLengthMenu = oSettings.aLengthMenu; if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' && typeof aLengthMenu[1] === 'object' ) { for ( i=0, iLen=aLengthMenu[0].length ; i'+aLengthMenu[1][i]+''; } } else { for ( i=0, iLen=aLengthMenu.length ; i'+aLengthMenu[i]+''; } } sStdMenu += ''; var nLength = document.createElement( 'div' ); if ( !oSettings.aanFeatures.l ) { nLength.id = oSettings.sTableId+'_length'; } nLength.className = oSettings.oClasses.sLength; nLength.innerHTML = ''; /* * Set the length to the current display length - thanks to Andrea Pavlovic for this fix, * and Stefan Skopnik for fixing the fix! */ //original line modified to avoid jquery migrate warning // $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true); $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).prop("selected", true); $('select', nLength).bind( 'change.DT', function(e) { var iVal = $(this).val(); /* Update all other length options for the new display */ var n = oSettings.aanFeatures.l; for ( i=0, iLen=n.length ; i oSettings.aiDisplay.length || oSettings._iDisplayLength == -1 ) { oSettings._iDisplayEnd = oSettings.aiDisplay.length; } else { oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength; } } } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Note that most of the paging logic is done in * DataTable.ext.oPagination */ /** * Generate the node required for default pagination * @param {object} oSettings dataTables settings object * @returns {node} Pagination feature node * @memberof DataTable#oApi */ function _fnFeatureHtmlPaginate ( oSettings ) { if ( oSettings.oScroll.bInfinite ) { return null; } var nPaginate = document.createElement( 'div' ); nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType; DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate, function( oSettings ) { _fnCalculateEnd( oSettings ); _fnDraw( oSettings ); } ); /* Add a draw callback for the pagination on first instance, to update the paging display */ if ( !oSettings.aanFeatures.p ) { oSettings.aoDrawCallback.push( { "fn": function( oSettings ) { DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) { _fnCalculateEnd( oSettings ); _fnDraw( oSettings ); } ); }, "sName": "pagination" } ); } return nPaginate; } /** * Alter the display settings to change the page * @param {object} oSettings dataTables settings object * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" * or page number to jump to (integer) * @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1 * @memberof DataTable#oApi */ function _fnPageChange ( oSettings, mAction ) { var iOldStart = oSettings._iDisplayStart; if ( typeof mAction === "number" ) { oSettings._iDisplayStart = mAction * oSettings._iDisplayLength; if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() ) { oSettings._iDisplayStart = 0; } } else if ( mAction == "first" ) { oSettings._iDisplayStart = 0; } else if ( mAction == "previous" ) { oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ? oSettings._iDisplayStart - oSettings._iDisplayLength : 0; /* Correct for under-run */ if ( oSettings._iDisplayStart < 0 ) { oSettings._iDisplayStart = 0; } } else if ( mAction == "next" ) { if ( oSettings._iDisplayLength >= 0 ) { /* Make sure we are not over running the display array */ if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() ) { oSettings._iDisplayStart += oSettings._iDisplayLength; } } else { oSettings._iDisplayStart = 0; } } else if ( mAction == "last" ) { if ( oSettings._iDisplayLength >= 0 ) { var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1; oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength; } else { oSettings._iDisplayStart = 0; } } else { _fnLog( oSettings, 0, "Unknown paging action: "+mAction ); } $(oSettings.oInstance).trigger('page', oSettings); return iOldStart != oSettings._iDisplayStart; } /** * Generate the node required for the processing node * @param {object} oSettings dataTables settings object * @returns {node} Processing element * @memberof DataTable#oApi */ function _fnFeatureHtmlProcessing ( oSettings ) { var nProcessing = document.createElement( 'div' ); if ( !oSettings.aanFeatures.r ) { nProcessing.id = oSettings.sTableId+'_processing'; } nProcessing.innerHTML = oSettings.oLanguage.sProcessing; nProcessing.className = oSettings.oClasses.sProcessing; oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable ); return nProcessing; } /** * Display or hide the processing indicator * @param {object} oSettings dataTables settings object * @param {bool} bShow Show the processing indicator (true) or not (false) * @memberof DataTable#oApi */ function _fnProcessingDisplay ( oSettings, bShow ) { if ( oSettings.oFeatures.bProcessing ) { var an = oSettings.aanFeatures.r; for ( var i=0, iLen=an.length ; i 0 ) { nCaption = nCaption[0]; if ( nCaption._captionSide === "top" ) { nScrollHeadTable.appendChild( nCaption ); } else if ( nCaption._captionSide === "bottom" && nTfoot ) { nScrollFootTable.appendChild( nCaption ); } } /* * Sizing */ /* When x-scrolling add the width and a scroller to move the header with the body */ if ( oSettings.oScroll.sX !== "" ) { nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX ); nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX ); if ( nTfoot !== null ) { nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX ); } /* When the body is scrolled, then we also want to scroll the headers */ $(nScrollBody).scroll( function (e) { nScrollHead.scrollLeft = this.scrollLeft; if ( nTfoot !== null ) { nScrollFoot.scrollLeft = this.scrollLeft; } } ); } /* When yscrolling, add the height */ if ( oSettings.oScroll.sY !== "" ) { nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY ); } /* Redraw - align columns across the tables */ oSettings.aoDrawCallback.push( { "fn": _fnScrollDraw, "sName": "scrolling" } ); /* Infinite scrolling event handlers */ if ( oSettings.oScroll.bInfinite ) { $(nScrollBody).scroll( function() { /* Use a blocker to stop scrolling from loading more data while other data is still loading */ if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 ) { /* Check if we should load the next data set */ if ( $(this).scrollTop() + $(this).height() > $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap ) { /* Only do the redraw if we have to - we might be at the end of the data */ if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() ) { _fnPageChange( oSettings, 'next' ); _fnCalculateEnd( oSettings ); _fnDraw( oSettings ); } } } } ); } oSettings.nScrollHead = nScrollHead; oSettings.nScrollFoot = nScrollFoot; return nScroller; } /** * Update the various tables for resizing. It's a bit of a pig this function, but * basically the idea to: * 1. Re-create the table inside the scrolling div * 2. Take live measurements from the DOM * 3. Apply the measurements * 4. Clean up * @param {object} o dataTables settings object * @returns {node} Node to add to the DOM * @memberof DataTable#oApi */ function _fnScrollDraw ( o ) { var nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0], nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0], nScrollBody = o.nTable.parentNode, i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis, nTheadSize, nTfootSize, iWidth, aApplied=[], aAppliedFooter=[], iSanityWidth, nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null, nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null, ie67 = o.oBrowser.bScrollOversize, zeroOut = function(nSizer) { oStyle = nSizer.style; oStyle.paddingTop = "0"; oStyle.paddingBottom = "0"; oStyle.borderTopWidth = "0"; oStyle.borderBottomWidth = "0"; oStyle.height = 0; }; /* * 1. Re-create the table inside the scrolling div */ /* Remove the old minimised thead and tfoot elements in the inner table */ $(o.nTable).children('thead, tfoot').remove(); /* Clone the current header and footer elements and then place it into the inner table */ nTheadSize = $(o.nTHead).clone()[0]; o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] ); anHeadToSize = o.nTHead.getElementsByTagName('tr'); anHeadSizers = nTheadSize.getElementsByTagName('tr'); if ( o.nTFoot !== null ) { nTfootSize = $(o.nTFoot).clone()[0]; o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] ); anFootToSize = o.nTFoot.getElementsByTagName('tr'); anFootSizers = nTfootSize.getElementsByTagName('tr'); } /* * 2. Take live measurements from the DOM - do not alter the DOM itself! */ /* Remove old sizing and apply the calculated column widths * Get the unique column headers in the newly created (cloned) header. We want to apply the * calculated sizes to this header */ if ( o.oScroll.sX === "" ) { nScrollBody.style.width = '100%'; nScrollHeadInner.parentNode.style.width = '100%'; } var nThs = _fnGetUniqueThs( o, nTheadSize ); for ( i=0, iLen=nThs.length ; i nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") ) { o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth); } } else { if ( o.oScroll.sXInner !== "" ) { /* x scroll inner has been given - use it */ o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner); } else if ( iSanityWidth == $(nScrollBody).width() && $(nScrollBody).height() < $(o.nTable).height() ) { /* There is y-scrolling - try to take account of the y scroll bar */ o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth ); if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth ) { /* Not possible to take account of it */ o.nTable.style.width = _fnStringToCss( iSanityWidth ); } } else { /* All else fails */ o.nTable.style.width = _fnStringToCss( iSanityWidth ); } } /* Recalculate the sanity width - now that we've applied the required width, before it was * a temporary variable. This is required because the column width calculation is done * before this table DOM is created. */ iSanityWidth = $(o.nTable).outerWidth(); /* We want the hidden header to have zero height, so remove padding and borders. Then * set the width based on the real headers */ // Apply all styles in one pass. Invalidates layout only once because we don't read any // DOM properties. _fnApplyToChildren( zeroOut, anHeadSizers ); // Read all widths in next pass. Forces layout only once because we do not change // any DOM properties. _fnApplyToChildren( function(nSizer) { aApplied.push( _fnStringToCss( $(nSizer).width() ) ); }, anHeadSizers ); // Apply all widths in final pass. Invalidates layout only once because we do not // read any DOM properties. _fnApplyToChildren( function(nToSize, i) { nToSize.style.width = aApplied[i]; }, anHeadToSize ); $(anHeadSizers).height(0); /* Same again with the footer if we have one */ if ( o.nTFoot !== null ) { _fnApplyToChildren( zeroOut, anFootSizers ); _fnApplyToChildren( function(nSizer) { aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) ); }, anFootSizers ); _fnApplyToChildren( function(nToSize, i) { nToSize.style.width = aAppliedFooter[i]; }, anFootToSize ); $(anFootSizers).height(0); } /* * 3. Apply the measurements */ /* "Hide" the header and footer that we used for the sizing. We want to also fix their width * to what they currently are */ _fnApplyToChildren( function(nSizer, i) { nSizer.innerHTML = ""; nSizer.style.width = aApplied[i]; }, anHeadSizers ); if ( o.nTFoot !== null ) { _fnApplyToChildren( function(nSizer, i) { nSizer.innerHTML = ""; nSizer.style.width = aAppliedFooter[i]; }, anFootSizers ); } /* Sanity check that the table is of a sensible width. If not then we are going to get * misalignment - try to prevent this by not allowing the table to shrink below its min width */ if ( $(o.nTable).outerWidth() < iSanityWidth ) { /* The min width depends upon if we have a vertical scrollbar visible or not */ var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll")) ? iSanityWidth+o.oScroll.iBarWidth : iSanityWidth; /* IE6/7 are a law unto themselves... */ if ( ie67 && (nScrollBody.scrollHeight > nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") ) { o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth ); } /* Apply the calculated minimum width to the table wrappers */ nScrollBody.style.width = _fnStringToCss( iCorrection ); o.nScrollHead.style.width = _fnStringToCss( iCorrection ); if ( o.nTFoot !== null ) { o.nScrollFoot.style.width = _fnStringToCss( iCorrection ); } /* And give the user a warning that we've stopped the table getting too small */ if ( o.oScroll.sX === "" ) { _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ " misalignment. The table has been drawn at its minimum possible width." ); } else if ( o.oScroll.sXInner !== "" ) { _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+ " misalignment. Increase the sScrollXInner value or remove it to allow automatic"+ " calculation" ); } } else { nScrollBody.style.width = _fnStringToCss( '100%' ); o.nScrollHead.style.width = _fnStringToCss( '100%' ); if ( o.nTFoot !== null ) { o.nScrollFoot.style.width = _fnStringToCss( '100%' ); } } /* * 4. Clean up */ if ( o.oScroll.sY === "" ) { /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting * the scrollbar height from the visible display, rather than adding it on. We need to * set the height in order to sort this. Don't want to do it in any other browsers. */ if ( ie67 ) { nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth ); } } if ( o.oScroll.sY !== "" && o.oScroll.bCollapse ) { nScrollBody.style.height = _fnStringToCss( o.oScroll.sY ); var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ? o.oScroll.iBarWidth : 0; if ( o.nTable.offsetHeight < nScrollBody.offsetHeight ) { nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra ); } } /* Finally set the width's of the header and footer tables */ var iOuterWidth = $(o.nTable).outerWidth(); nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth ); nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth ); // Figure out if there are scrollbar present - if so then we need a the header and footer to // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar) var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll"; nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; if ( o.nTFoot !== null ) { nScrollFootTable.style.width = _fnStringToCss( iOuterWidth ); nScrollFootInner.style.width = _fnStringToCss( iOuterWidth ); nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px"; } /* Adjust the position of the header in case we loose the y-scrollbar */ $(nScrollBody).scroll(); /* If sorting or filtering has occurred, jump the scrolling back to the top */ if ( o.bSorted || o.bFiltered ) { nScrollBody.scrollTop = 0; } } /** * Apply a given function to the display child nodes of an element array (typically * TD children of TR rows * @param {function} fn Method to apply to the objects * @param array {nodes} an1 List of elements to look through for display children * @param array {nodes} an2 Another list (identical structure to the first) - optional * @memberof DataTable#oApi */ function _fnApplyToChildren( fn, an1, an2 ) { var index=0, i=0, iLen=an1.length; var nNode1, nNode2; while ( i < iLen ) { nNode1 = an1[i].firstChild; nNode2 = an2 ? an2[i].firstChild : null; while ( nNode1 ) { if ( nNode1.nodeType === 1 ) { if ( an2 ) { fn( nNode1, nNode2, index ); } else { fn( nNode1, index ); } index++; } nNode1 = nNode1.nextSibling; nNode2 = an2 ? nNode2.nextSibling : null; } i++; } } /** * Convert a CSS unit width to pixels (e.g. 2em) * @param {string} sWidth width to be converted * @param {node} nParent parent to get the with for (required for relative widths) - optional * @returns {int} iWidth width in pixels * @memberof DataTable#oApi */ function _fnConvertToWidth ( sWidth, nParent ) { if ( !sWidth || sWidth === null || sWidth === '' ) { return 0; } if ( !nParent ) { nParent = document.body; } var iWidth; var nTmp = document.createElement( "div" ); nTmp.style.width = _fnStringToCss( sWidth ); nParent.appendChild( nTmp ); iWidth = nTmp.offsetWidth; nParent.removeChild( nTmp ); return ( iWidth ); } /** * Calculate the width of columns for the table * @param {object} oSettings dataTables settings object * @memberof DataTable#oApi */ function _fnCalculateColumnWidths ( oSettings ) { var iTableWidth = oSettings.nTable.offsetWidth; var iUserInputs = 0; var iTmpWidth; var iVisibleColumns = 0; var iColums = oSettings.aoColumns.length; var i, iIndex, iCorrector, iWidth; var oHeaders = $('th', oSettings.nTHead); var widthAttr = oSettings.nTable.getAttribute('width'); var nWrapper = oSettings.nTable.parentNode; /* Convert any user input sizes into pixel sizes */ for ( i=0 ; itd', nCalcTmp); } /* Apply custom sizing to the cloned header */ var nThs = _fnGetUniqueThs( oSettings, nTheadClone ); iCorrector = 0; for ( i=0 ; i 0 ) { oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth ); } iCorrector++; } } var cssWidth = $(nCalcTmp).css('width'); oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ? cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() ); nCalcTmp.parentNode.removeChild( nCalcTmp ); } if ( widthAttr ) { oSettings.nTable.style.width = _fnStringToCss( widthAttr ); } } /** * Adjust a table's width to take account of scrolling * @param {object} oSettings dataTables settings object * @param {node} n table node * @memberof DataTable#oApi */ function _fnScrollingWidthAdjust ( oSettings, n ) { if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" ) { /* When y-scrolling only, we want to remove the width of the scroll bar so the table * + scroll bar will fit into the area avaialble. */ var iOrigWidth = $(n).width(); n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth ); } else if ( oSettings.oScroll.sX !== "" ) { /* When x-scrolling both ways, fix the table at it's current size, without adjusting */ n.style.width = _fnStringToCss( $(n).outerWidth() ); } } /** * Get the widest node * @param {object} oSettings dataTables settings object * @param {int} iCol column of interest * @returns {node} widest table node * @memberof DataTable#oApi */ function _fnGetWidestNode( oSettings, iCol ) { var iMaxIndex = _fnGetMaxLenString( oSettings, iCol ); if ( iMaxIndex < 0 ) { return null; } if ( oSettings.aoData[iMaxIndex].nTr === null ) { var n = document.createElement('td'); n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' ); return n; } return _fnGetTdNodes(oSettings, iMaxIndex)[iCol]; } /** * Get the maximum strlen for each data column * @param {object} oSettings dataTables settings object * @param {int} iCol column of interest * @returns {string} max string length for each column * @memberof DataTable#oApi */ function _fnGetMaxLenString( oSettings, iCol ) { var iMax = -1; var iMaxIndex = -1; for ( var i=0 ; i/g, "" ); if ( s.length > iMax ) { iMax = s.length; iMaxIndex = i; } } return iMaxIndex; } /** * Append a CSS unit (only if required) to a string * @param {array} aArray1 first array * @param {array} aArray2 second array * @returns {int} 0 if match, 1 if length is different, 2 if no match * @memberof DataTable#oApi */ function _fnStringToCss( s ) { if ( s === null ) { return "0px"; } if ( typeof s == 'number' ) { if ( s < 0 ) { return "0px"; } return s+"px"; } /* Check if the last character is not 0-9 */ var c = s.charCodeAt( s.length-1 ); if (c < 0x30 || c > 0x39) { return s; } return s+"px"; } /** * Get the width of a scroll bar in this browser being used * @returns {int} width in pixels * @memberof DataTable#oApi */ function _fnScrollBarWidth () { var inner = document.createElement('p'); var style = inner.style; style.width = "100%"; style.height = "200px"; style.padding = "0px"; var outer = document.createElement('div'); style = outer.style; style.position = "absolute"; style.top = "0px"; style.left = "0px"; style.visibility = "hidden"; style.width = "200px"; style.height = "150px"; style.padding = "0px"; style.overflow = "hidden"; outer.appendChild(inner); document.body.appendChild(outer); var w1 = inner.offsetWidth; outer.style.overflow = 'scroll'; var w2 = inner.offsetWidth; if ( w1 == w2 ) { w2 = outer.clientWidth; } document.body.removeChild(outer); return (w1 - w2); } /** * Change the order of the table * @param {object} oSettings dataTables settings object * @param {bool} bApplyClasses optional - should we apply classes or not * @memberof DataTable#oApi */ function _fnSort ( oSettings, bApplyClasses ) { var i, iLen, j, jLen, k, kLen, sDataType, nTh, aaSort = [], aiOrig = [], oSort = DataTable.ext.oSort, aoData = oSettings.aoData, aoColumns = oSettings.aoColumns, oAria = oSettings.oLanguage.oAria; /* No sorting required if server-side or no sorting array */ if ( !oSettings.oFeatures.bServerSide && (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) ) { aaSort = ( oSettings.aaSortingFixed !== null ) ? oSettings.aaSortingFixed.concat( oSettings.aaSorting ) : oSettings.aaSorting.slice(); /* If there is a sorting data type, and a function belonging to it, then we need to * get the data from the developer's function and apply it for this column */ for ( i=0 ; i/g, "" ); nTh = aoColumns[i].nTh; nTh.removeAttribute('aria-sort'); nTh.removeAttribute('aria-label'); /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */ if ( aoColumns[i].bSortable ) { if ( aaSort.length > 0 && aaSort[0][0] == i ) { nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" ); var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ? aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0]; nTh.setAttribute('aria-label', sTitle+ (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); } else { nTh.setAttribute('aria-label', sTitle+ (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) ); } } else { nTh.setAttribute('aria-label', sTitle); } } /* Tell the draw function that we have sorted the data */ oSettings.bSorted = true; $(oSettings.oInstance).trigger('sort', oSettings); /* Copy the master data into the draw array and re-draw */ if ( oSettings.oFeatures.bFilter ) { /* _fnFilter() will redraw the table for us */ _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 ); } else { oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); oSettings._iDisplayStart = 0; /* reset display back to page 0 */ _fnCalculateEnd( oSettings ); _fnDraw( oSettings ); } } /** * Attach a sort handler (click) to a node * @param {object} oSettings dataTables settings object * @param {node} nNode node to attach the handler to * @param {int} iDataIndex column sorting index * @param {function} [fnCallback] callback function * @memberof DataTable#oApi */ function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback ) { _fnBindAction( nNode, {}, function (e) { /* If the column is not sortable - don't to anything */ if ( oSettings.aoColumns[iDataIndex].bSortable === false ) { return; } /* * This is a little bit odd I admit... I declare a temporary function inside the scope of * _fnBuildHead and the click handler in order that the code presented here can be used * twice - once for when bProcessing is enabled, and another time for when it is * disabled, as we need to perform slightly different actions. * Basically the issue here is that the Javascript engine in modern browsers don't * appear to allow the rendering engine to update the display while it is still executing * it's thread (well - it does but only after long intervals). This means that the * 'processing' display doesn't appear for a table sort. To break the js thread up a bit * I force an execution break by using setTimeout - but this breaks the expected * thread continuation for the end-developer's point of view (their code would execute * too early), so we only do it when we absolutely have to. */ var fnInnerSorting = function () { var iColumn, iNextSort; /* If the shift key is pressed then we are multiple column sorting */ if ( e.shiftKey ) { /* Are we already doing some kind of sort on this column? */ var bFound = false; for ( var i=0 ; i 0 && sCurrentClass.indexOf(sNewClass) == -1 ) { /* We need to add a class */ nTds[i].className = sCurrentClass + " " + sNewClass; } } } } /** * Save the state of a table in a cookie such that the page can be reloaded * @param {object} oSettings dataTables settings object * @memberof DataTable#oApi */ function _fnSaveState ( oSettings ) { if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying ) { return; } /* Store the interesting variables */ var i, iLen, bInfinite=oSettings.oScroll.bInfinite; var oState = { "iCreate": new Date().getTime(), "iStart": (bInfinite ? 0 : oSettings._iDisplayStart), "iEnd": (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd), "iLength": oSettings._iDisplayLength, "aaSorting": $.extend( true, [], oSettings.aaSorting ), "oSearch": $.extend( true, {}, oSettings.oPreviousSearch ), "aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ), "abVisCols": [] }; for ( i=0, iLen=oSettings.aoColumns.length ; i 4096 ) /* Magic 10 for padding */ { for ( var i=0, iLen=aCookies.length ; i 4096 ) { if ( aOldCookies.length === 0 ) { // Deleted all DT cookies and still not enough space. Can't state save return; } var old = aOldCookies.pop(); document.cookie = old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+ aParts.join('/') + "/"; } } document.cookie = sFullCookie; } /** * Read an old cookie to get a cookie with an old table state * @param {string} sName name of the cookie to read * @returns {string} contents of the cookie - or null if no cookie with that name found * @memberof DataTable#oApi */ function _fnReadCookie ( sName ) { var aParts = window.location.pathname.split('/'), sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=', sCookieContents = document.cookie.split(';'); for( var i=0 ; i=0 ; i-- ) { aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) ); } if ( sTrigger !== null ) { $(oSettings.oInstance).trigger(sTrigger, aArgs); } return aRet; } /** * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other * library, then we use that as it is fast, safe and accurate. If the function isn't * available then we need to built it ourselves - the inspiration for this function comes * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is * not perfect and absolutely should not be used as a replacement to json2.js - but it does * do what we need, without requiring a dependency for DataTables. * @param {object} o JSON object to be converted * @returns {string} JSON string * @memberof DataTable#oApi */ var _fnJsonString = (window.JSON) ? JSON.stringify : function( o ) { /* Not an object or array */ var sType = typeof o; if (sType !== "object" || o === null) { // simple data type if (sType === "string") { o = '"'+o+'"'; } return o+""; } /* If object or array, need to recurse over it */ var sProp, mValue, json = [], bArr = $.isArray(o); for (sProp in o) { mValue = o[sProp]; sType = typeof mValue; if (sType === "string") { mValue = '"'+mValue+'"'; } else if (sType === "object" && mValue !== null) { mValue = _fnJsonString(mValue); } json.push((bArr ? "" : '"'+sProp+'":') + mValue); } return (bArr ? "[" : "{") + json + (bArr ? "]" : "}"); }; /** * From some browsers (specifically IE6/7) we need special handling to work around browser * bugs - this function is used to detect when these workarounds are needed. * @param {object} oSettings dataTables settings object * @memberof DataTable#oApi */ function _fnBrowserDetect( oSettings ) { /* IE6/7 will oversize a width 100% element inside a scrolling element, to include the * width of the scrollbar, while other browsers ensure the inner element is contained * without forcing scrolling */ var n = $( '
    '+ '
    '+ '
    '+ '
    '+ '
    ')[0]; document.body.appendChild( n ); oSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false; document.body.removeChild( n ); } /** * Perform a jQuery selector action on the table's TR elements (from the tbody) and * return the resulting jQuery object. * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on * @param {object} [oOpts] Optional parameters for modifying the rows to be included * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter * criterion ("applied") or all TR elements (i.e. no filter). * @param {string} [oOpts.order=current] Order of the TR elements in the processed array. * Can be either 'current', whereby the current sorting of the table is used, or * 'original' whereby the original order the data was read into the table is used. * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page * ("current") or not ("all"). If 'current' is given, then order is assumed to be * 'current' and filter is 'applied', regardless of what they might be given as. * @returns {object} jQuery object, filtered by the given selector. * @dtopt API * * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); * * // Highlight every second row * oTable.$('tr:odd').css('backgroundColor', 'blue'); * } ); * * @example * $(document).ready(function() { * var oTable = $('#example').dataTable(); * * // Filter to rows with 'Webkit' in them, add a background colour and then * // remove the filter, thus highlighting the 'Webkit' rows only. * oTable.fnFilter('Webkit'); * oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue'); * oTable.fnFilter(''); * } ); */ this.$ = function ( sSelector, oOpts ) { var i, iLen, a = [], tr; var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); var aoData = oSettings.aoData; var aiDisplay = oSettings.aiDisplay; var aiDisplayMaster = oSettings.aiDisplayMaster; if ( !oOpts ) { oOpts = {}; } oOpts = $.extend( {}, { "filter": "none", // applied "order": "current", // "original" "page": "all" // current }, oOpts ); // Current page implies that order=current and fitler=applied, since it is fairly // senseless otherwise if ( oOpts.page == 'current' ) { for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i *
  • 1D array of data - add a single row with the data provided
  • *
  • 2D array of arrays - add multiple rows in a single call
  • *
  • object - data object when using mData
  • *
  • array of objects - multiple data objects when using mData
  • * * @param {bool} [bRedraw=true] redraw the table or not * @returns {array} An array of integers, representing the list of indexes in * aoData ({@link DataTable.models.oSettings}) that have been added to * the table. * @dtopt API * * @example * // Global var for counter * var giCount = 2; * * $(document).ready(function() { * $('#example').dataTable(); * } ); * * function fnClickAddRow() { * $('#example').dataTable().fnAddData( [ * giCount+".1", * giCount+".2", * giCount+".3", * giCount+".4" ] * ); * * giCount++; * } */ this.fnAddData = function( mData, bRedraw ) { if ( mData.length === 0 ) { return []; } var aiReturn = []; var iTest; /* Find settings from table node */ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); /* Check if we want to add multiple rows or not */ if ( typeof mData[0] === "object" && mData[0] !== null ) { for ( var i=0 ; i= oSettings.fnRecordsDisplay() ) { oSettings._iDisplayStart -= oSettings._iDisplayLength; if ( oSettings._iDisplayStart < 0 ) { oSettings._iDisplayStart = 0; } } if ( bRedraw === undefined || bRedraw ) { _fnCalculateEnd( oSettings ); _fnDraw( oSettings ); } return oData; }; /** * Restore the table to it's original state in the DOM by removing all of DataTables * enhancements, alterations to the DOM structure of the table and event listeners. * @param {boolean} [bRemove=false] Completely remove the table from the DOM * @dtopt API * * @example * $(document).ready(function() { * // This example is fairly pointless in reality, but shows how fnDestroy can be used * var oTable = $('#example').dataTable(); * oTable.fnDestroy(); * } ); */ this.fnDestroy = function ( bRemove ) { var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); var nOrig = oSettings.nTableWrapper.parentNode; var nBody = oSettings.nTBody; var i, iLen; bRemove = (bRemove===undefined) ? false : bRemove; /* Flag to note that the table is currently being destroyed - no action should be taken */ oSettings.bDestroying = true; /* Fire off the destroy callbacks for plug-ins etc */ _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] ); /* If the table is not being removed, restore the hidden columns */ if ( !bRemove ) { for ( i=0, iLen=oSettings.aoColumns.length ; itr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove(); /* When scrolling we had to break the table up - restore it */ if ( oSettings.nTable != oSettings.nTHead.parentNode ) { $(oSettings.nTable).children('thead').remove(); oSettings.nTable.appendChild( oSettings.nTHead ); } if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode ) { $(oSettings.nTable).children('tfoot').remove(); oSettings.nTable.appendChild( oSettings.nTFoot ); } /* Remove the DataTables generated nodes, events and classes */ oSettings.nTable.parentNode.removeChild( oSettings.nTable ); $(oSettings.nTableWrapper).remove(); oSettings.aaSorting = []; oSettings.aaSortingFixed = []; _fnSortingClasses( oSettings ); $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') ); $('th, td', oSettings.nTHead).removeClass( [ oSettings.oClasses.sSortable, oSettings.oClasses.sSortableAsc, oSettings.oClasses.sSortableDesc, oSettings.oClasses.sSortableNone ].join(' ') ); if ( oSettings.bJUI ) { $('th span.'+oSettings.oClasses.sSortIcon + ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove(); $('th, td', oSettings.nTHead).each( function () { var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this); var kids = jqWrapper.contents(); $(this).append( kids ); jqWrapper.remove(); } ); } /* Add the TR elements back into the table in their original order */ if ( !bRemove && oSettings.nTableReinsertBefore ) { nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore ); } else if ( !bRemove ) { nOrig.appendChild( oSettings.nTable ); } for ( i=0, iLen=oSettings.aoData.length ; i
  • * Function return: *
      *
    • {int} Sorting match: <0 if first parameter should be sorted lower than * the second parameter, ===0 if the two parameters are equal and >0 if * the first parameter should be sorted height than the second parameter.
    • *
    * * * @type object * @default {} * * @example * // Case-sensitive string sorting, with no pre-formatting method * $.extend( $.fn.dataTableExt.oSort, { * "string-case-asc": function(x,y) { * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); * }, * "string-case-desc": function(x,y) { * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); * } * } ); * * @example * // Case-insensitive string sorting, with pre-formatting * $.extend( $.fn.dataTableExt.oSort, { * "string-pre": function(x) { * return x.toLowerCase(); * }, * "string-asc": function(x,y) { * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); * }, * "string-desc": function(x,y) { * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); * } * } ); */ "oSort": {}, /** * Version string for plug-ins to check compatibility. Allowed format is * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and * e are optional * @type string * @default Version number */ "sVersion": DataTable.version, /** * How should DataTables report an error. Can take the value 'alert' or 'throw' * @type string * @default alert */ "sErrMode": "alert", /** * Store information for DataTables to access globally about other instances * @namespace * @private */ "_oExternConfig": { /* int:iNextUnique - next unique number for an instance */ "iNextUnique": 0 } }; /** * Template object for the way in which DataTables holds information about * search information for the global filter and individual column filters. * @namespace */ DataTable.models.oSearch = { /** * Flag to indicate if the filtering should be case insensitive or not * @type boolean * @default true */ "bCaseInsensitive": true, /** * Applied search term * @type string * @default Empty string */ "sSearch": "", /** * Flag to indicate if the search term should be interpreted as a * regular expression (true) or not (false) and therefore and special * regex characters escaped. * @type boolean * @default false */ "bRegex": false, /** * Flag to indicate if DataTables is to use its smart filtering or not. * @type boolean * @default true */ "bSmart": true }; /** * Template object for the way in which DataTables holds information about * each individual row. This is the object format used for the settings * aoData array. * @namespace */ DataTable.models.oRow = { /** * TR element for the row * @type node * @default null */ "nTr": null, /** * Data object from the original data source for the row. This is either * an array if using the traditional form of DataTables, or an object if * using mData options. The exact type will depend on the passed in * data from the data source, or will be an array if using DOM a data * source. * @type array|object * @default [] */ "_aData": [], /** * Sorting data cache - this array is ostensibly the same length as the * number of columns (although each index is generated only as it is * needed), and holds the data that is used for sorting each column in the * row. We do this cache generation at the start of the sort in order that * the formatting of the sort data need be done only once for each cell * per sort. This array should not be read from or written to by anything * other than the master sorting methods. * @type array * @default [] * @private */ "_aSortData": [], /** * Array of TD elements that are cached for hidden rows, so they can be * reinserted into the table if a column is made visible again (or to act * as a store if a column is made hidden). Only hidden columns have a * reference in the array. For non-hidden columns the value is either * undefined or null. * @type array nodes * @default [] * @private */ "_anHidden": [], /** * Cache of the class name that DataTables has applied to the row, so we * can quickly look at this variable rather than needing to do a DOM check * on className for the nTr property. * @type string * @default Empty string * @private */ "_sRowStripe": "" }; /** * Template object for the column information object in DataTables. This object * is held in the settings aoColumns array and contains all the information that * DataTables needs about each individual column. * * Note that this object is related to {@link DataTable.defaults.columns} * but this one is the internal data store for DataTables's cache of columns. * It should NOT be manipulated outside of DataTables. Any configuration should * be done through the initialisation options. * @namespace */ DataTable.models.oColumn = { /** * A list of the columns that sorting should occur on when this column * is sorted. That this property is an array allows multi-column sorting * to be defined for a column (for example first name / last name columns * would benefit from this). The values are integers pointing to the * columns to be sorted on (typically it will be a single integer pointing * at itself, but that doesn't need to be the case). * @type array */ "aDataSort": null, /** * Define the sorting directions that are applied to the column, in sequence * as the column is repeatedly sorted upon - i.e. the first value is used * as the sorting direction when the column if first sorted (clicked on). * Sort it again (click again) and it will move on to the next index. * Repeat until loop. * @type array */ "asSorting": null, /** * Flag to indicate if the column is searchable, and thus should be included * in the filtering or not. * @type boolean */ "bSearchable": null, /** * Flag to indicate if the column is sortable or not. * @type boolean */ "bSortable": null, /** * Deprecated When using fnRender, you have two options for what * to do with the data, and this property serves as the switch. Firstly, you * can have the sorting and filtering use the rendered value (true - default), * or you can have the sorting and filtering us the original value (false). * * Please note that this option has now been deprecated and will be removed * in the next version of DataTables. Please use mRender / mData rather than * fnRender. * @type boolean * @deprecated */ "bUseRendered": null, /** * Flag to indicate if the column is currently visible in the table or not * @type boolean */ "bVisible": null, /** * Flag to indicate to the type detection method if the automatic type * detection should be used, or if a column type (sType) has been specified * @type boolean * @default true * @private */ "_bAutoType": true, /** * Developer definable function that is called whenever a cell is created (Ajax source, * etc) or processed for input (DOM source). This can be used as a compliment to mRender * allowing you to modify the DOM element (add background colour for example) when the * element is available. * @type function * @param {element} nTd The TD node that has been created * @param {*} sData The Data for the cell * @param {array|object} oData The data for the whole row * @param {int} iRow The row index for the aoData data store * @default null */ "fnCreatedCell": null, /** * Function to get data from a cell in a column. You should never * access data directly through _aData internally in DataTables - always use * the method attached to this property. It allows mData to function as * required. This function is automatically assigned by the column * initialisation method * @type function * @param {array|object} oData The data array/object for the array * (i.e. aoData[]._aData) * @param {string} sSpecific The specific data type you want to get - * 'display', 'type' 'filter' 'sort' * @returns {*} The data for the cell from the given row's data * @default null */ "fnGetData": null, /** * Deprecated Custom display function that will be called for the * display of each cell in this column. * * Please note that this option has now been deprecated and will be removed * in the next version of DataTables. Please use mRender / mData rather than * fnRender. * @type function * @param {object} o Object with the following parameters: * @param {int} o.iDataRow The row in aoData * @param {int} o.iDataColumn The column in question * @param {array} o.aData The data for the row in question * @param {object} o.oSettings The settings object for this DataTables instance * @returns {string} The string you which to use in the display * @default null * @deprecated */ "fnRender": null, /** * Function to set data for a cell in the column. You should never * set the data directly to _aData internally in DataTables - always use * this method. It allows mData to function as required. This function * is automatically assigned by the column initialisation method * @type function * @param {array|object} oData The data array/object for the array * (i.e. aoData[]._aData) * @param {*} sValue Value to set * @default null */ "fnSetData": null, /** * Property to read the value for the cells in the column from the data * source array / object. If null, then the default content is used, if a * function is given then the return from the function is used. * @type function|int|string|null * @default null */ "mData": null, /** * Partner property to mData which is used (only when defined) to get * the data - i.e. it is basically the same as mData, but without the * 'set' option, and also the data fed to it is the result from mData. * This is the rendering method to match the data method of mData. * @type function|int|string|null * @default null */ "mRender": null, /** * Unique header TH/TD element for this column - this is what the sorting * listener is attached to (if sorting is enabled.) * @type node * @default null */ "nTh": null, /** * Unique footer TH/TD element for this column (if there is one). Not used * in DataTables as such, but can be used for plug-ins to reference the * footer for each column. * @type node * @default null */ "nTf": null, /** * The class to apply to all TD elements in the table's TBODY for the column * @type string * @default null */ "sClass": null, /** * When DataTables calculates the column widths to assign to each column, * it finds the longest string in each column and then constructs a * temporary table and reads the widths from that. The problem with this * is that "mmm" is much wider then "iiii", but the latter is a longer * string - thus the calculation can go wrong (doing it properly and putting * it into an DOM object and measuring that is horribly(!) slow). Thus as * a "work around" we provide this option. It will append its value to the * text that is found to be the longest string for the column - i.e. padding. * @type string */ "sContentPadding": null, /** * Allows a default value to be given for a column's data, and will be used * whenever a null data source is encountered (this can be because mData * is set to null, or because the data source itself is null). * @type string * @default null */ "sDefaultContent": null, /** * Name for the column, allowing reference to the column by name as well as * by index (needs a lookup to work by name). * @type string */ "sName": null, /** * Custom sorting data type - defines which of the available plug-ins in * afnSortData the custom sorting will use - if any is defined. * @type string * @default std */ "sSortDataType": 'std', /** * Class to be applied to the header element when sorting on this column * @type string * @default null */ "sSortingClass": null, /** * Class to be applied to the header element when sorting on this column - * when jQuery UI theming is used. * @type string * @default null */ "sSortingClassJUI": null, /** * Title of the column - what is seen in the TH element (nTh). * @type string */ "sTitle": null, /** * Column sorting and filtering type * @type string * @default null */ "sType": null, /** * Width of the column * @type string * @default null */ "sWidth": null, /** * Width of the column when it was first "encountered" * @type string * @default null */ "sWidthOrig": null }; /** * Initialisation options that can be given to DataTables at initialisation * time. * @namespace */ DataTable.defaults = { /** * An array of data to use for the table, passed in at initialisation which * will be used in preference to any data which is already in the DOM. This is * particularly useful for constructing tables purely in Javascript, for * example with a custom Ajax call. * @type array * @default null * @dtopt Option * * @example * // Using a 2D array data source * $(document).ready( function () { * $('#example').dataTable( { * "aaData": [ * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], * ], * "aoColumns": [ * { "sTitle": "Engine" }, * { "sTitle": "Browser" }, * { "sTitle": "Platform" }, * { "sTitle": "Version" }, * { "sTitle": "Grade" } * ] * } ); * } ); * * @example * // Using an array of objects as a data source (mData) * $(document).ready( function () { * $('#example').dataTable( { * "aaData": [ * { * "engine": "Trident", * "browser": "Internet Explorer 4.0", * "platform": "Win 95+", * "version": 4, * "grade": "X" * }, * { * "engine": "Trident", * "browser": "Internet Explorer 5.0", * "platform": "Win 95+", * "version": 5, * "grade": "C" * } * ], * "aoColumns": [ * { "sTitle": "Engine", "mData": "engine" }, * { "sTitle": "Browser", "mData": "browser" }, * { "sTitle": "Platform", "mData": "platform" }, * { "sTitle": "Version", "mData": "version" }, * { "sTitle": "Grade", "mData": "grade" } * ] * } ); * } ); */ "aaData": null, /** * If sorting is enabled, then DataTables will perform a first pass sort on * initialisation. You can define which column(s) the sort is performed upon, * and the sorting direction, with this variable. The aaSorting array should * contain an array for each column to be sorted initially containing the * column's index and a direction string ('asc' or 'desc'). * @type array * @default [[0,'asc']] * @dtopt Option * * @example * // Sort by 3rd column first, and then 4th column * $(document).ready( function() { * $('#example').dataTable( { * "aaSorting": [[2,'asc'], [3,'desc']] * } ); * } ); * * // No initial sorting * $(document).ready( function() { * $('#example').dataTable( { * "aaSorting": [] * } ); * } ); */ "aaSorting": [[0,'asc']], /** * This parameter is basically identical to the aaSorting parameter, but * cannot be overridden by user interaction with the table. What this means * is that you could have a column (visible or hidden) which the sorting will * always be forced on first - any sorting after that (from the user) will * then be performed as required. This can be useful for grouping rows * together. * @type array * @default null * @dtopt Option * * @example * $(document).ready( function() { * $('#example').dataTable( { * "aaSortingFixed": [[0,'asc']] * } ); * } ) */ "aaSortingFixed": null, /** * This parameter allows you to readily specify the entries in the length drop * down menu that DataTables shows when pagination is enabled. It can be * either a 1D array of options which will be used for both the displayed * option and the value, or a 2D array which will use the array in the first * position as the value, and the array in the second position as the * displayed options (useful for language strings such as 'All'). * @type array * @default [ 10, 25, 50, 100 ] * @dtopt Option * * @example * $(document).ready( function() { * $('#example').dataTable( { * "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] * } ); * } ); * * @example * // Setting the default display length as well as length menu * // This is likely to be wanted if you remove the '10' option which * // is the iDisplayLength default. * $(document).ready( function() { * $('#example').dataTable( { * "iDisplayLength": 25, * "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]] * } ); * } ); */ "aLengthMenu": [ 10, 25, 50, 100 ], /** * The aoColumns option in the initialisation parameter allows you to define * details about the way individual columns behave. For a full list of * column options that can be set, please see * {@link DataTable.defaults.columns}. Note that if you use aoColumns to * define your columns, you must have an entry in the array for every single * column that you have in your table (these can be null if you don't which * to specify any options). * @member */ "aoColumns": null, /** * Very similar to aoColumns, aoColumnDefs allows you to target a specific * column, multiple columns, or all columns, using the aTargets property of * each object in the array. This allows great flexibility when creating * tables, as the aoColumnDefs arrays can be of any length, targeting the * columns you specifically want. aoColumnDefs may use any of the column * options available: {@link DataTable.defaults.columns}, but it _must_ * have aTargets defined in each object in the array. Values in the aTargets * array may be: *
      *
    • a string - class name will be matched on the TH for the column
    • *
    • 0 or a positive integer - column index counting from the left
    • *
    • a negative integer - column index counting from the right
    • *
    • the string "_all" - all columns (i.e. assign a default)
    • *
    * @member */ "aoColumnDefs": null, /** * Basically the same as oSearch, this parameter defines the individual column * filtering state at initialisation time. The array must be of the same size * as the number of columns, and each element be an object with the parameters * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also * accepted and the default will be used. * @type array * @default [] * @dtopt Option * * @example * $(document).ready( function() { * $('#example').dataTable( { * "aoSearchCols": [ * null, * { "sSearch": "My filter" }, * null, * { "sSearch": "^[0-9]", "bEscapeRegex": false } * ] * } ); * } ) */ "aoSearchCols": [], /** * An array of CSS classes that should be applied to displayed rows. This * array may be of any length, and DataTables will apply each class * sequentially, looping when required. * @type array * @default null Will take the values determined by the oClasses.sStripe* * options * @dtopt Option * * @example * $(document).ready( function() { * $('#example').dataTable( { * "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ] * } ); * } ) */ "asStripeClasses": null, /** * Enable or disable automatic column width calculation. This can be disabled * as an optimisation (it takes some time to calculate the widths) if the * tables widths are passed in using aoColumns. * @type boolean * @default true * @dtopt Features * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bAutoWidth": false * } ); * } ); */ "bAutoWidth": true, /** * Deferred rendering can provide DataTables with a huge speed boost when you * are using an Ajax or JS data source for the table. This option, when set to * true, will cause DataTables to defer the creation of the table elements for * each row until they are needed for a draw - saving a significant amount of * time. * @type boolean * @default false * @dtopt Features * * @example * $(document).ready( function() { * var oTable = $('#example').dataTable( { * "sAjaxSource": "sources/arrays.txt", * "bDeferRender": true * } ); * } ); */ "bDeferRender": false, /** * Replace a DataTable which matches the given selector and replace it with * one which has the properties of the new initialisation object passed. If no * table matches the selector, then the new DataTable will be constructed as * per normal. * @type boolean * @default false * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "sScrollY": "200px", * "bPaginate": false * } ); * * // Some time later.... * $('#example').dataTable( { * "bFilter": false, * "bDestroy": true * } ); * } ); */ "bDestroy": false, /** * Enable or disable filtering of data. Filtering in DataTables is "smart" in * that it allows the end user to input multiple words (space separated) and * will match a row containing those words, even if not in the order that was * specified (this allow matching across multiple columns). Note that if you * wish to use filtering in DataTables this must remain 'true' - to remove the * default filtering input box and retain filtering abilities, please use * {@link DataTable.defaults.sDom}. * @type boolean * @default true * @dtopt Features * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bFilter": false * } ); * } ); */ "bFilter": true, /** * Enable or disable the table information display. This shows information * about the data that is currently visible on the page, including information * about filtered data if that action is being performed. * @type boolean * @default true * @dtopt Features * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bInfo": false * } ); * } ); */ "bInfo": true, /** * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some * slightly different and additional mark-up from what DataTables has * traditionally used). * @type boolean * @default false * @dtopt Features * * @example * $(document).ready( function() { * $('#example').dataTable( { * "bJQueryUI": true * } ); * } ); */ "bJQueryUI": false, /** * Allows the end user to select the size of a formatted page from a select * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate). * @type boolean * @default true * @dtopt Features * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bLengthChange": false * } ); * } ); */ "bLengthChange": true, /** * Enable or disable pagination. * @type boolean * @default true * @dtopt Features * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bPaginate": false * } ); * } ); */ "bPaginate": true, /** * Enable or disable the display of a 'processing' indicator when the table is * being processed (e.g. a sort). This is particularly useful for tables with * large amounts of data where it can take a noticeable amount of time to sort * the entries. * @type boolean * @default false * @dtopt Features * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bProcessing": true * } ); * } ); */ "bProcessing": false, /** * Retrieve the DataTables object for the given selector. Note that if the * table has already been initialised, this parameter will cause DataTables * to simply return the object that has already been set up - it will not take * account of any changes you might have made to the initialisation object * passed to DataTables (setting this parameter to true is an acknowledgement * that you understand this). bDestroy can be used to reinitialise a table if * you need. * @type boolean * @default false * @dtopt Options * * @example * $(document).ready( function() { * initTable(); * tableActions(); * } ); * * function initTable () * { * return $('#example').dataTable( { * "sScrollY": "200px", * "bPaginate": false, * "bRetrieve": true * } ); * } * * function tableActions () * { * var oTable = initTable(); * // perform API operations with oTable * } */ "bRetrieve": false, /** * Indicate if DataTables should be allowed to set the padding / margin * etc for the scrolling header elements or not. Typically you will want * this. * @type boolean * @default true * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "bScrollAutoCss": false, * "sScrollY": "200px" * } ); * } ); */ "bScrollAutoCss": true, /** * When vertical (y) scrolling is enabled, DataTables will force the height of * the table's viewport to the given height at all times (useful for layout). * However, this can look odd when filtering data down to a small data set, * and the footer is left "floating" further down. This parameter (when * enabled) will cause DataTables to collapse the table's viewport down when * the result set will fit within the given Y height. * @type boolean * @default false * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "sScrollY": "200", * "bScrollCollapse": true * } ); * } ); */ "bScrollCollapse": false, /** * Enable infinite scrolling for DataTables (to be used in combination with * sScrollY). Infinite scrolling means that DataTables will continually load * data as a user scrolls through a table, which is very useful for large * dataset. This cannot be used with pagination, which is automatically * disabled. Note - the Scroller extra for DataTables is recommended in * in preference to this option. * @type boolean * @default false * @dtopt Features * * @example * $(document).ready( function() { * $('#example').dataTable( { * "bScrollInfinite": true, * "bScrollCollapse": true, * "sScrollY": "200px" * } ); * } ); */ "bScrollInfinite": false, /** * Configure DataTables to use server-side processing. Note that the * sAjaxSource parameter must also be given in order to give DataTables a * source to obtain the required data for each draw. * @type boolean * @default false * @dtopt Features * @dtopt Server-side * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bServerSide": true, * "sAjaxSource": "xhr.php" * } ); * } ); */ "bServerSide": false, /** * Enable or disable sorting of columns. Sorting of individual columns can be * disabled by the "bSortable" option for each column. * @type boolean * @default true * @dtopt Features * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bSort": false * } ); * } ); */ "bSort": true, /** * Allows control over whether DataTables should use the top (true) unique * cell that is found for a single column, or the bottom (false - default). * This is useful when using complex headers. * @type boolean * @default false * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "bSortCellsTop": true * } ); * } ); */ "bSortCellsTop": false, /** * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and * 'sorting_3' to the columns which are currently being sorted on. This is * presented as a feature switch as it can increase processing time (while * classes are removed and added) so for large data sets you might want to * turn this off. * @type boolean * @default true * @dtopt Features * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bSortClasses": false * } ); * } ); */ "bSortClasses": true, /** * Enable or disable state saving. When enabled a cookie will be used to save * table display information such as pagination information, display length, * filtering and sorting. As such when the end user reloads the page the * display display will match what thy had previously set up. * @type boolean * @default false * @dtopt Features * * @example * $(document).ready( function () { * $('#example').dataTable( { * "bStateSave": true * } ); * } ); */ "bStateSave": false, /** * Customise the cookie and / or the parameters being stored when using * DataTables with state saving enabled. This function is called whenever * the cookie is modified, and it expects a fully formed cookie string to be * returned. Note that the data object passed in is a Javascript object which * must be converted to a string (JSON.stringify for example). * @type function * @param {string} sName Name of the cookie defined by DataTables * @param {object} oData Data to be stored in the cookie * @param {string} sExpires Cookie expires string * @param {string} sPath Path of the cookie to set * @returns {string} Cookie formatted string (which should be encoded by * using encodeURIComponent()) * @dtopt Callbacks * * @example * $(document).ready( function () { * $('#example').dataTable( { * "fnCookieCallback": function (sName, oData, sExpires, sPath) { * // Customise oData or sName or whatever else here * return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath; * } * } ); * } ); */ "fnCookieCallback": null, /** * This function is called when a TR element is created (and all TD child * elements have been inserted), or registered if using a DOM source, allowing * manipulation of the TR element (adding classes etc). * @type function * @param {node} nRow "TR" element for the current row * @param {array} aData Raw data array for this row * @param {int} iDataIndex The index of this row in aoData * @dtopt Callbacks * * @example * $(document).ready( function() { * $('#example').dataTable( { * "fnCreatedRow": function( nRow, aData, iDataIndex ) { * // Bold the grade for all 'A' grade browsers * if ( aData[4] == "A" ) * { * $('td:eq(4)', nRow).html( 'A' ); * } * } * } ); * } ); */ "fnCreatedRow": null, /** * This function is called on every 'draw' event, and allows you to * dynamically modify any aspect you want about the created DOM. * @type function * @param {object} oSettings DataTables settings object * @dtopt Callbacks * * @example * $(document).ready( function() { * $('#example').dataTable( { * "fnDrawCallback": function( oSettings ) { * alert( 'DataTables has redrawn the table' ); * } * } ); * } ); */ "fnDrawCallback": null, /** * Identical to fnHeaderCallback() but for the table footer this function * allows you to modify the table footer on every 'draw' even. * @type function * @param {node} nFoot "TR" element for the footer * @param {array} aData Full table data (as derived from the original HTML) * @param {int} iStart Index for the current display starting point in the * display array * @param {int} iEnd Index for the current display ending point in the * display array * @param {array int} aiDisplay Index array to translate the visual position * to the full data array * @dtopt Callbacks * * @example * $(document).ready( function() { * $('#example').dataTable( { * "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) { * nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart; * } * } ); * } ) */ "fnFooterCallback": null, /** * When rendering large numbers in the information element for the table * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers * to have a comma separator for the 'thousands' units (e.g. 1 million is * rendered as "1,000,000") to help readability for the end user. This * function will override the default method DataTables uses. * @type function * @member * @param {int} iIn number to be formatted * @returns {string} formatted string for DataTables to show the number * @dtopt Callbacks * * @example * $(document).ready( function() { * $('#example').dataTable( { * "fnFormatNumber": function ( iIn ) { * if ( iIn < 1000 ) { * return iIn; * } else { * var * s=(iIn+""), * a=s.split(""), out="", * iLen=s.length; * * for ( var i=0 ; i<iLen ; i++ ) { * if ( i%3 === 0 && i !== 0 ) { * out = "'"+out; * } * out = a[iLen-i-1]+out; * } * } * return out; * }; * } ); * } ); */ "fnFormatNumber": function ( iIn ) { if ( iIn < 1000 ) { // A small optimisation for what is likely to be the majority of use cases return iIn; } var s=(iIn+""), a=s.split(""), out="", iLen=s.length; for ( var i=0 ; iA
    ' ); * } * } * } ); * } ); */ "fnRowCallback": null, /** * This parameter allows you to override the default function which obtains * the data from the server ($.getJSON) so something more suitable for your * application. For example you could use POST data, or pull information from * a Gears or AIR database. * @type function * @member * @param {string} sSource HTTP source to obtain the data from (sAjaxSource) * @param {array} aoData A key/value pair object containing the data to send * to the server * @param {function} fnCallback to be called on completion of the data get * process that will draw the data on the page. * @param {object} oSettings DataTables settings object * @dtopt Callbacks * @dtopt Server-side * * @example * // POST data to server * $(document).ready( function() { * $('#example').dataTable( { * "bProcessing": true, * "bServerSide": true, * "sAjaxSource": "xhr.php", * "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) { * oSettings.jqXHR = $.ajax( { * "dataType": 'json', * "type": "POST", * "url": sSource, * "data": aoData, * "success": fnCallback * } ); * } * } ); * } ); */ "fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) { oSettings.jqXHR = $.ajax( { "url": sUrl, "data": aoData, "success": function (json) { if ( json.sError ) { oSettings.oApi._fnLog( oSettings, 0, json.sError ); } $(oSettings.oInstance).trigger('xhr', [oSettings, json]); fnCallback( json ); }, "dataType": "json", "cache": false, "type": oSettings.sServerMethod, "error": function (xhr, error, thrown) { if ( error == "parsererror" ) { oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+ "server could not be parsed. This is caused by a JSON formatting error." ); } } } ); }, /** * It is often useful to send extra data to the server when making an Ajax * request - for example custom filtering information, and this callback * function makes it trivial to send extra information to the server. The * passed in parameter is the data set that has been constructed by * DataTables, and you can add to this or modify it as you require. * @type function * @param {array} aoData Data array (array of objects which are name/value * pairs) that has been constructed by DataTables and will be sent to the * server. In the case of Ajax sourced data with server-side processing * this will be an empty array, for server-side processing there will be a * significant number of parameters! * @returns {undefined} Ensure that you modify the aoData array passed in, * as this is passed by reference. * @dtopt Callbacks * @dtopt Server-side * * @example * $(document).ready( function() { * $('#example').dataTable( { * "bProcessing": true, * "bServerSide": true, * "sAjaxSource": "scripts/server_processing.php", * "fnServerParams": function ( aoData ) { * aoData.push( { "name": "more_data", "value": "my_value" } ); * } * } ); * } ); */ "fnServerParams": null, /** * Load the table state. With this function you can define from where, and how, the * state of a table is loaded. By default DataTables will load from its state saving * cookie, but you might wish to use local storage (HTML5) or a server-side database. * @type function * @member * @param {object} oSettings DataTables settings object * @return {object} The DataTables state object to be loaded * @dtopt Callbacks * * @example * $(document).ready( function() { * $('#example').dataTable( { * "bStateSave": true, * "fnStateLoad": function (oSettings) { * var o; * * // Send an Ajax request to the server to get the data. Note that * // this is a synchronous request. * $.ajax( { * "url": "/state_load", * "async": false, * "dataType": "json", * "success": function (json) { * o = json; * } * } ); * * return o; * } * } ); * } ); */ "fnStateLoad": function ( oSettings ) { var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance ); var oData; try { oData = (typeof $.parseJSON === 'function') ? $.parseJSON(sData) : eval( '('+sData+')' ); } catch (e) { oData = null; } return oData; }, /** * Callback which allows modification of the saved state prior to loading that state. * This callback is called when the table is loading state from the stored data, but * prior to the settings object being modified by the saved state. Note that for * plug-in authors, you should use the 'stateLoadParams' event to load parameters for * a plug-in. * @type function * @param {object} oSettings DataTables settings object * @param {object} oData The state object that is to be loaded * @dtopt Callbacks * * @example * // Remove a saved filter, so filtering is never loaded * $(document).ready( function() { * $('#example').dataTable( { * "bStateSave": true, * "fnStateLoadParams": function (oSettings, oData) { * oData.oSearch.sSearch = ""; * } * } ); * } ); * * @example * // Disallow state loading by returning false * $(document).ready( function() { * $('#example').dataTable( { * "bStateSave": true, * "fnStateLoadParams": function (oSettings, oData) { * return false; * } * } ); * } ); */ "fnStateLoadParams": null, /** * Callback that is called when the state has been loaded from the state saving method * and the DataTables settings object has been modified as a result of the loaded state. * @type function * @param {object} oSettings DataTables settings object * @param {object} oData The state object that was loaded * @dtopt Callbacks * * @example * // Show an alert with the filtering value that was saved * $(document).ready( function() { * $('#example').dataTable( { * "bStateSave": true, * "fnStateLoaded": function (oSettings, oData) { * alert( 'Saved filter was: '+oData.oSearch.sSearch ); * } * } ); * } ); */ "fnStateLoaded": null, /** * Save the table state. This function allows you to define where and how the state * information for the table is stored - by default it will use a cookie, but you * might want to use local storage (HTML5) or a server-side database. * @type function * @member * @param {object} oSettings DataTables settings object * @param {object} oData The state object to be saved * @dtopt Callbacks * * @example * $(document).ready( function() { * $('#example').dataTable( { * "bStateSave": true, * "fnStateSave": function (oSettings, oData) { * // Send an Ajax request to the server with the state object * $.ajax( { * "url": "/state_save", * "data": oData, * "dataType": "json", * "method": "POST" * "success": function () {} * } ); * } * } ); * } ); */ "fnStateSave": function ( oSettings, oData ) { this.oApi._fnCreateCookie( oSettings.sCookiePrefix+oSettings.sInstance, this.oApi._fnJsonString(oData), oSettings.iCookieDuration, oSettings.sCookiePrefix, oSettings.fnCookieCallback ); }, /** * Callback which allows modification of the state to be saved. Called when the table * has changed state a new state save is required. This method allows modification of * the state saving object prior to actually doing the save, including addition or * other state properties or modification. Note that for plug-in authors, you should * use the 'stateSaveParams' event to save parameters for a plug-in. * @type function * @param {object} oSettings DataTables settings object * @param {object} oData The state object to be saved * @dtopt Callbacks * * @example * // Remove a saved filter, so filtering is never saved * $(document).ready( function() { * $('#example').dataTable( { * "bStateSave": true, * "fnStateSaveParams": function (oSettings, oData) { * oData.oSearch.sSearch = ""; * } * } ); * } ); */ "fnStateSaveParams": null, /** * Duration of the cookie which is used for storing session information. This * value is given in seconds. * @type int * @default 7200 (2 hours) * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "iCookieDuration": 60*60*24; // 1 day * } ); * } ) */ "iCookieDuration": 7200, /** * When enabled DataTables will not make a request to the server for the first * page draw - rather it will use the data already on the page (no sorting etc * will be applied to it), thus saving on an XHR at load time. iDeferLoading * is used to indicate that deferred loading is required, but it is also used * to tell DataTables how many records there are in the full table (allowing * the information element and pagination to be displayed correctly). In the case * where a filtering is applied to the table on initial load, this can be * indicated by giving the parameter as an array, where the first element is * the number of records available after filtering and the second element is the * number of records without filtering (allowing the table information element * to be shown correctly). * @type int | array * @default null * @dtopt Options * * @example * // 57 records available in the table, no filtering applied * $(document).ready( function() { * $('#example').dataTable( { * "bServerSide": true, * "sAjaxSource": "scripts/server_processing.php", * "iDeferLoading": 57 * } ); * } ); * * @example * // 57 records after filtering, 100 without filtering (an initial filter applied) * $(document).ready( function() { * $('#example').dataTable( { * "bServerSide": true, * "sAjaxSource": "scripts/server_processing.php", * "iDeferLoading": [ 57, 100 ], * "oSearch": { * "sSearch": "my_filter" * } * } ); * } ); */ "iDeferLoading": null, /** * Number of rows to display on a single page when using pagination. If * feature enabled (bLengthChange) then the end user will be able to override * this to a custom setting using a pop-up menu. * @type int * @default 10 * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "iDisplayLength": 50 * } ); * } ) */ "iDisplayLength": 10, /** * Define the starting point for data display when using DataTables with * pagination. Note that this parameter is the number of records, rather than * the page number, so if you have 10 records per page and want to start on * the third page, it should be "20". * @type int * @default 0 * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "iDisplayStart": 20 * } ); * } ) */ "iDisplayStart": 0, /** * The scroll gap is the amount of scrolling that is left to go before * DataTables will load the next 'page' of data automatically. You typically * want a gap which is big enough that the scrolling will be smooth for the * user, while not so large that it will load more data than need. * @type int * @default 100 * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "bScrollInfinite": true, * "bScrollCollapse": true, * "sScrollY": "200px", * "iScrollLoadGap": 50 * } ); * } ); */ "iScrollLoadGap": 100, /** * By default DataTables allows keyboard navigation of the table (sorting, paging, * and filtering) by adding a tabindex attribute to the required elements. This * allows you to tab through the controls and press the enter key to activate them. * The tabindex is default 0, meaning that the tab follows the flow of the document. * You can overrule this using this parameter if you wish. Use a value of -1 to * disable built-in keyboard navigation. * @type int * @default 0 * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "iTabIndex": 1 * } ); * } ); */ "iTabIndex": 0, /** * All strings that DataTables uses in the user interface that it creates * are defined in this object, allowing you to modified them individually or * completely replace them all as required. * @namespace */ "oLanguage": { /** * Strings that are used for WAI-ARIA labels and controls only (these are not * actually visible on the page, but will be read by screenreaders, and thus * must be internationalised as well). * @namespace */ "oAria": { /** * ARIA label that is added to the table headers when the column may be * sorted ascending by activing the column (click or return when focused). * Note that the column header is prefixed to this string. * @type string * @default : activate to sort column ascending * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "oAria": { * "sSortAscending": " - click/return to sort ascending" * } * } * } ); * } ); */ "sSortAscending": ": activate to sort column ascending", /** * ARIA label that is added to the table headers when the column may be * sorted descending by activing the column (click or return when focused). * Note that the column header is prefixed to this string. * @type string * @default : activate to sort column ascending * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "oAria": { * "sSortDescending": " - click/return to sort descending" * } * } * } ); * } ); */ "sSortDescending": ": activate to sort column descending" }, /** * Pagination string used by DataTables for the two built-in pagination * control types ("two_button" and "full_numbers") * @namespace */ "oPaginate": { /** * Text to use when using the 'full_numbers' type of pagination for the * button to take the user to the first page. * @type string * @default First * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "oPaginate": { * "sFirst": "First page" * } * } * } ); * } ); */ "sFirst": "First", /** * Text to use when using the 'full_numbers' type of pagination for the * button to take the user to the last page. * @type string * @default Last * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "oPaginate": { * "sLast": "Last page" * } * } * } ); * } ); */ "sLast": "Last", /** * Text to use for the 'next' pagination button (to take the user to the * next page). * @type string * @default Next * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "oPaginate": { * "sNext": "Next page" * } * } * } ); * } ); */ "sNext": "Next", /** * Text to use for the 'previous' pagination button (to take the user to * the previous page). * @type string * @default Previous * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "oPaginate": { * "sPrevious": "Previous page" * } * } * } ); * } ); */ "sPrevious": "Previous" }, /** * This string is shown in preference to sZeroRecords when the table is * empty of data (regardless of filtering). Note that this is an optional * parameter - if it is not given, the value of sZeroRecords will be used * instead (either the default or given value). * @type string * @default No data available in table * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sEmptyTable": "No data available in table" * } * } ); * } ); */ "sEmptyTable": "No data available in table", /** * This string gives information to the end user about the information that * is current on display on the page. The _START_, _END_ and _TOTAL_ * variables are all dynamically replaced as the table display updates, and * can be freely moved or removed as the language requirements change. * @type string * @default Showing _START_ to _END_ of _TOTAL_ entries * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)" * } * } ); * } ); */ "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", /** * Display information string for when the table is empty. Typically the * format of this string should match sInfo. * @type string * @default Showing 0 to 0 of 0 entries * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sInfoEmpty": "No entries to show" * } * } ); * } ); */ "sInfoEmpty": "Showing 0 to 0 of 0 entries", /** * When a user filters the information in a table, this string is appended * to the information (sInfo) to give an idea of how strong the filtering * is. The variable _MAX_ is dynamically updated. * @type string * @default (filtered from _MAX_ total entries) * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sInfoFiltered": " - filtering from _MAX_ records" * } * } ); * } ); */ "sInfoFiltered": "(filtered from _MAX_ total entries)", /** * If can be useful to append extra information to the info string at times, * and this variable does exactly that. This information will be appended to * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are * being used) at all times. * @type string * @default Empty string * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sInfoPostFix": "All records shown are derived from real information." * } * } ); * } ); */ "sInfoPostFix": "", /** * DataTables has a build in number formatter (fnFormatNumber) which is used * to format large numbers that are used in the table information. By * default a comma is used, but this can be trivially changed to any * character you wish with this parameter. * @type string * @default , * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sInfoThousands": "'" * } * } ); * } ); */ "sInfoThousands": ",", /** * Detail the action that will be taken when the drop down menu for the * pagination length option is changed. The '_MENU_' variable is replaced * with a default select list of 10, 25, 50 and 100, and can be replaced * with a custom select box if required. * @type string * @default Show _MENU_ entries * @dtopt Language * * @example * // Language change only * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sLengthMenu": "Display _MENU_ records" * } * } ); * } ); * * @example * // Language and options change * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sLengthMenu": 'Display records' * } * } ); * } ); */ "sLengthMenu": "Show _MENU_ entries", /** * When using Ajax sourced data and during the first draw when DataTables is * gathering the data, this message is shown in an empty row in the table to * indicate to the end user the the data is being loaded. Note that this * parameter is not used when loading data by server-side processing, just * Ajax sourced data with client-side processing. * @type string * @default Loading... * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sLoadingRecords": "Please wait - loading..." * } * } ); * } ); */ "sLoadingRecords": "Loading...", /** * Text which is displayed when the table is processing a user action * (usually a sort command or similar). * @type string * @default Processing... * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sProcessing": "DataTables is currently busy" * } * } ); * } ); */ "sProcessing": "Processing...", /** * Details the actions that will be taken when the user types into the * filtering input text box. The variable "_INPUT_", if used in the string, * is replaced with the HTML text box for the filtering input allowing * control over where it appears in the string. If "_INPUT_" is not given * then the input box is appended to the string automatically. * @type string * @default Search: * @dtopt Language * * @example * // Input text box will be appended at the end automatically * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sSearch": "Filter records:" * } * } ); * } ); * * @example * // Specify where the filter should appear * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sSearch": "Apply filter _INPUT_ to table" * } * } ); * } ); */ "sSearch": "Search:", /** * All of the language information can be stored in a file on the * server-side, which DataTables will look up if this parameter is passed. * It must store the URL of the language file, which is in a JSON format, * and the object has the same properties as the oLanguage object in the * initialiser object (i.e. the above parameters). Please refer to one of * the example language files to see how this works in action. * @type string * @default Empty string - i.e. disabled * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt" * } * } ); * } ); */ "sUrl": "", /** * Text shown inside the table records when the is no information to be * displayed after filtering. sEmptyTable is shown when there is simply no * information in the table at all (regardless of filtering). * @type string * @default No matching records found * @dtopt Language * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oLanguage": { * "sZeroRecords": "No records to display" * } * } ); * } ); */ "sZeroRecords": "No matching records found" }, /** * This parameter allows you to have define the global filtering state at * initialisation time. As an object the "sSearch" parameter must be * defined, but all other parameters are optional. When "bRegex" is true, * the search string will be treated as a regular expression, when false * (default) it will be treated as a straight string. When "bSmart" * DataTables will use it's smart filtering methods (to word match at * any point in the data), when false this will not be done. * @namespace * @extends DataTable.models.oSearch * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "oSearch": {"sSearch": "Initial search"} * } ); * } ) */ "oSearch": $.extend( {}, DataTable.models.oSearch ), /** * By default DataTables will look for the property 'aaData' when obtaining * data from an Ajax source or for server-side processing - this parameter * allows that property to be changed. You can use Javascript dotted object * notation to get a data source for multiple levels of nesting. * @type string * @default aaData * @dtopt Options * @dtopt Server-side * * @example * // Get data from { "data": [...] } * $(document).ready( function() { * var oTable = $('#example').dataTable( { * "sAjaxSource": "sources/data.txt", * "sAjaxDataProp": "data" * } ); * } ); * * @example * // Get data from { "data": { "inner": [...] } } * $(document).ready( function() { * var oTable = $('#example').dataTable( { * "sAjaxSource": "sources/data.txt", * "sAjaxDataProp": "data.inner" * } ); * } ); */ "sAjaxDataProp": "aaData", /** * You can instruct DataTables to load data from an external source using this * parameter (use aData if you want to pass data in you already have). Simply * provide a url a JSON object can be obtained from. This object must include * the parameter 'aaData' which is the data source for the table. * @type string * @default null * @dtopt Options * @dtopt Server-side * * @example * $(document).ready( function() { * $('#example').dataTable( { * "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php" * } ); * } ) */ "sAjaxSource": null, /** * This parameter can be used to override the default prefix that DataTables * assigns to a cookie when state saving is enabled. * @type string * @default SpryMedia_DataTables_ * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "sCookiePrefix": "my_datatable_", * } ); * } ); */ "sCookiePrefix": "SpryMedia_DataTables_", /** * This initialisation variable allows you to specify exactly where in the * DOM you want DataTables to inject the various controls it adds to the page * (for example you might want the pagination controls at the top of the * table). DIV elements (with or without a custom class) can also be added to * aid styling. The follow syntax is used: *
      *
    • The following options are allowed: *
        *
      • 'l' - Length changing
      • 'f' - Filtering input *
      • 't' - The table!
      • *
      • 'i' - Information
      • *
      • 'p' - Pagination
      • *
      • 'r' - pRocessing
      • *
      *
    • *
    • The following constants are allowed: *
        *
      • 'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')
      • *
      • 'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')
      • *
      *
    • *
    • The following syntax is expected: *
        *
      • '<' and '>' - div elements
      • *
      • '<"class" and '>' - div with a class
      • *
      • '<"#id" and '>' - div with an ID
      • *
      *
    • *
    • Examples: *
        *
      • '<"wrapper"flipt>'
      • *
      • '<lf<t>ip>'
      • *
      *
    • *
    * @type string * @default lfrtip (when bJQueryUI is false) or * <"H"lfr>t<"F"ip> (when bJQueryUI is true) * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "sDom": '<"top"i>rt<"bottom"flp><"clear">' * } ); * } ); */ "sDom": "lfrtip", /** * DataTables features two different built-in pagination interaction methods * ('two_button' or 'full_numbers') which present different page controls to * the end user. Further methods can be added using the API (see below). * @type string * @default two_button * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "sPaginationType": "full_numbers" * } ); * } ) */ "sPaginationType": "two_button", /** * Enable horizontal scrolling. When a table is too wide to fit into a certain * layout, or you have a large number of columns in the table, you can enable * x-scrolling to show the table in a viewport, which can be scrolled. This * property can be any CSS unit, or a number (in which case it will be treated * as a pixel measurement). * @type string * @default blank string - i.e. disabled * @dtopt Features * * @example * $(document).ready( function() { * $('#example').dataTable( { * "sScrollX": "100%", * "bScrollCollapse": true * } ); * } ); */ "sScrollX": "", /** * This property can be used to force a DataTable to use more width than it * might otherwise do when x-scrolling is enabled. For example if you have a * table which requires to be well spaced, this parameter is useful for * "over-sizing" the table, and thus forcing scrolling. This property can by * any CSS unit, or a number (in which case it will be treated as a pixel * measurement). * @type string * @default blank string - i.e. disabled * @dtopt Options * * @example * $(document).ready( function() { * $('#example').dataTable( { * "sScrollX": "100%", * "sScrollXInner": "110%" * } ); * } ); */ "sScrollXInner": "", /** * Enable vertical scrolling. Vertical scrolling will constrain the DataTable * to the given height, and enable scrolling for any data which overflows the * current viewport. This can be used as an alternative to paging to display * a lot of data in a small area (although paging and scrolling can both be * enabled at the same time). This property can be any CSS unit, or a number * (in which case it will be treated as a pixel measurement). * @type string * @default blank string - i.e. disabled * @dtopt Features * * @example * $(document).ready( function() { * $('#example').dataTable( { * "sScrollY": "200px", * "bPaginate": false * } ); * } ); */ "sScrollY": "", /** * Set the HTTP method that is used to make the Ajax call for server-side * processing or Ajax sourced data. * @type string * @default GET * @dtopt Options * @dtopt Server-side * * @example * $(document).ready( function() { * $('#example').dataTable( { * "bServerSide": true, * "sAjaxSource": "scripts/post.php", * "sServerMethod": "POST" * } ); * } ); */ "sServerMethod": "GET" }; /** * Column options that can be given to DataTables at initialisation time. * @namespace */ DataTable.defaults.columns = { /** * Allows a column's sorting to take multiple columns into account when * doing a sort. For example first name / last name columns make sense to * do a multi-column sort over the two columns. * @type array * @default null Takes the value of the column index automatically * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] }, * { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] }, * { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "aDataSort": [ 0, 1 ] }, * { "aDataSort": [ 1, 0 ] }, * { "aDataSort": [ 2, 3, 4 ] }, * null, * null * ] * } ); * } ); */ "aDataSort": null, /** * You can control the default sorting direction, and even alter the behaviour * of the sort handler (i.e. only allow ascending sorting etc) using this * parameter. * @type array * @default [ 'asc', 'desc' ] * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "asSorting": [ "asc" ], "aTargets": [ 1 ] }, * { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] }, * { "asSorting": [ "desc" ], "aTargets": [ 3 ] } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * null, * { "asSorting": [ "asc" ] }, * { "asSorting": [ "desc", "asc", "asc" ] }, * { "asSorting": [ "desc" ] }, * null * ] * } ); * } ); */ "asSorting": [ 'asc', 'desc' ], /** * Enable or disable filtering on the data in this column. * @type boolean * @default true * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "bSearchable": false, "aTargets": [ 0 ] } * ] } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "bSearchable": false }, * null, * null, * null, * null * ] } ); * } ); */ "bSearchable": true, /** * Enable or disable sorting on this column. * @type boolean * @default true * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "bSortable": false, "aTargets": [ 0 ] } * ] } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "bSortable": false }, * null, * null, * null, * null * ] } ); * } ); */ "bSortable": true, /** * Deprecated When using fnRender() for a column, you may wish * to use the original data (before rendering) for sorting and filtering * (the default is to used the rendered data that the user can see). This * may be useful for dates etc. * * Please note that this option has now been deprecated and will be removed * in the next version of DataTables. Please use mRender / mData rather than * fnRender. * @type boolean * @default true * @dtopt Columns * @deprecated */ "bUseRendered": true, /** * Enable or disable the display of this column. * @type boolean * @default true * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "bVisible": false, "aTargets": [ 0 ] } * ] } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "bVisible": false }, * null, * null, * null, * null * ] } ); * } ); */ "bVisible": true, /** * Developer definable function that is called whenever a cell is created (Ajax source, * etc) or processed for input (DOM source). This can be used as a compliment to mRender * allowing you to modify the DOM element (add background colour for example) when the * element is available. * @type function * @param {element} nTd The TD node that has been created * @param {*} sData The Data for the cell * @param {array|object} oData The data for the whole row * @param {int} iRow The row index for the aoData data store * @param {int} iCol The column index for aoColumns * @dtopt Columns * * @example * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ { * "aTargets": [3], * "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) { * if ( sData == "1.7" ) { * $(nTd).css('color', 'blue') * } * } * } ] * }); * } ); */ "fnCreatedCell": null, /** * Deprecated Custom display function that will be called for the * display of each cell in this column. * * Please note that this option has now been deprecated and will be removed * in the next version of DataTables. Please use mRender / mData rather than * fnRender. * @type function * @param {object} o Object with the following parameters: * @param {int} o.iDataRow The row in aoData * @param {int} o.iDataColumn The column in question * @param {array} o.aData The data for the row in question * @param {object} o.oSettings The settings object for this DataTables instance * @param {object} o.mDataProp The data property used for this column * @param {*} val The current cell value * @returns {string} The string you which to use in the display * @dtopt Columns * @deprecated */ "fnRender": null, /** * The column index (starting from 0!) that you wish a sort to be performed * upon when this column is selected for sorting. This can be used for sorting * on hidden columns for example. * @type int * @default -1 Use automatically calculated column index * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "iDataSort": 1, "aTargets": [ 0 ] } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "iDataSort": 1 }, * null, * null, * null, * null * ] * } ); * } ); */ "iDataSort": -1, /** * This parameter has been replaced by mData in DataTables to ensure naming * consistency. mDataProp can still be used, as there is backwards compatibility * in DataTables for this option, but it is strongly recommended that you use * mData in preference to mDataProp. * @name DataTable.defaults.columns.mDataProp */ /** * This property can be used to read data from any JSON data source property, * including deeply nested objects / properties. mData can be given in a * number of different ways which effect its behaviour: *
      *
    • integer - treated as an array index for the data source. This is the * default that DataTables uses (incrementally increased for each column).
    • *
    • string - read an object property from the data source. Note that you can * use Javascript dotted notation to read deep properties / arrays from the * data source.
    • *
    • null - the sDefaultContent option will be used for the cell (null * by default, so you will need to specify the default content you want - * typically an empty string). This can be useful on generated columns such * as edit / delete action columns.
    • *
    • function - the function given will be executed whenever DataTables * needs to set or get the data for a cell in the column. The function * takes three parameters: *
        *
      • {array|object} The data source for the row
      • *
      • {string} The type call data requested - this will be 'set' when * setting data or 'filter', 'display', 'type', 'sort' or undefined when * gathering data. Note that when undefined is given for the type * DataTables expects to get the raw data for the object back
      • *
      • {*} Data to set when the second parameter is 'set'.
      • *
      * The return value from the function is not required when 'set' is the type * of call, but otherwise the return is what will be used for the data * requested.
    • *
    * * Note that prior to DataTables 1.9.2 mData was called mDataProp. The name change * reflects the flexibility of this property and is consistent with the naming of * mRender. If 'mDataProp' is given, then it will still be used by DataTables, as * it automatically maps the old name to the new if required. * @type string|int|function|null * @default null Use automatically calculated column index * @dtopt Columns * * @example * // Read table data from objects * $(document).ready( function() { * var oTable = $('#example').dataTable( { * "sAjaxSource": "sources/deep.txt", * "aoColumns": [ * { "mData": "engine" }, * { "mData": "browser" }, * { "mData": "platform.inner" }, * { "mData": "platform.details.0" }, * { "mData": "platform.details.1" } * ] * } ); * } ); * * @example * // Using mData as a function to provide different information for * // sorting, filtering and display. In this case, currency (price) * $(document).ready( function() { * var oTable = $('#example').dataTable( { * "aoColumnDefs": [ { * "aTargets": [ 0 ], * "mData": function ( source, type, val ) { * if (type === 'set') { * source.price = val; * // Store the computed dislay and filter values for efficiency * source.price_display = val=="" ? "" : "$"+numberFormat(val); * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; * return; * } * else if (type === 'display') { * return source.price_display; * } * else if (type === 'filter') { * return source.price_filter; * } * // 'sort', 'type' and undefined all just use the integer * return source.price; * } * } ] * } ); * } ); */ "mData": null, /** * This property is the rendering partner to mData and it is suggested that * when you want to manipulate data for display (including filtering, sorting etc) * but not altering the underlying data for the table, use this property. mData * can actually do everything this property can and more, but this parameter is * easier to use since there is no 'set' option. Like mData is can be given * in a number of different ways to effect its behaviour, with the addition of * supporting array syntax for easy outputting of arrays (including arrays of * objects): *
      *
    • integer - treated as an array index for the data source. This is the * default that DataTables uses (incrementally increased for each column).
    • *
    • string - read an object property from the data source. Note that you can * use Javascript dotted notation to read deep properties / arrays from the * data source and also array brackets to indicate that the data reader should * loop over the data source array. When characters are given between the array * brackets, these characters are used to join the data source array together. * For example: "accounts[, ].name" would result in a comma separated list with * the 'name' value from the 'accounts' array of objects.
    • *
    • function - the function given will be executed whenever DataTables * needs to set or get the data for a cell in the column. The function * takes three parameters: *
        *
      • {array|object} The data source for the row (based on mData)
      • *
      • {string} The type call data requested - this will be 'filter', 'display', * 'type' or 'sort'.
      • *
      • {array|object} The full data source for the row (not based on mData)
      • *
      * The return value from the function is what will be used for the data * requested.
    • *
    * @type string|int|function|null * @default null Use mData * @dtopt Columns * * @example * // Create a comma separated list from an array of objects * $(document).ready( function() { * var oTable = $('#example').dataTable( { * "sAjaxSource": "sources/deep.txt", * "aoColumns": [ * { "mData": "engine" }, * { "mData": "browser" }, * { * "mData": "platform", * "mRender": "[, ].name" * } * ] * } ); * } ); * * @example * // Use as a function to create a link from the data source * $(document).ready( function() { * var oTable = $('#example').dataTable( { * "aoColumnDefs": [ * { * "aTargets": [ 0 ], * "mData": "download_link", * "mRender": function ( data, type, full ) { * return 'Download'; * } * ] * } ); * } ); */ "mRender": null, /** * Change the cell type created for the column - either TD cells or TH cells. This * can be useful as TH cells have semantic meaning in the table body, allowing them * to act as a header for a row (you may wish to add scope='row' to the TH elements). * @type string * @default td * @dtopt Columns * * @example * // Make the first column use TH cells * $(document).ready( function() { * var oTable = $('#example').dataTable( { * "aoColumnDefs": [ { * "aTargets": [ 0 ], * "sCellType": "th" * } ] * } ); * } ); */ "sCellType": "td", /** * Class to give to each cell in this column. * @type string * @default Empty string * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "sClass": "my_class", "aTargets": [ 0 ] } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "sClass": "my_class" }, * null, * null, * null, * null * ] * } ); * } ); */ "sClass": "", /** * When DataTables calculates the column widths to assign to each column, * it finds the longest string in each column and then constructs a * temporary table and reads the widths from that. The problem with this * is that "mmm" is much wider then "iiii", but the latter is a longer * string - thus the calculation can go wrong (doing it properly and putting * it into an DOM object and measuring that is horribly(!) slow). Thus as * a "work around" we provide this option. It will append its value to the * text that is found to be the longest string for the column - i.e. padding. * Generally you shouldn't need this, and it is not documented on the * general DataTables.net documentation * @type string * @default Empty string * @dtopt Columns * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * null, * null, * null, * { * "sContentPadding": "mmm" * } * ] * } ); * } ); */ "sContentPadding": "", /** * Allows a default value to be given for a column's data, and will be used * whenever a null data source is encountered (this can be because mData * is set to null, or because the data source itself is null). * @type string * @default null * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { * "mData": null, * "sDefaultContent": "Edit", * "aTargets": [ -1 ] * } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * null, * null, * null, * { * "mData": null, * "sDefaultContent": "Edit" * } * ] * } ); * } ); */ "sDefaultContent": null, /** * This parameter is only used in DataTables' server-side processing. It can * be exceptionally useful to know what columns are being displayed on the * client side, and to map these to database fields. When defined, the names * also allow DataTables to reorder information from the server if it comes * back in an unexpected order (i.e. if you switch your columns around on the * client-side, your server-side code does not also need updating). * @type string * @default Empty string * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "sName": "engine", "aTargets": [ 0 ] }, * { "sName": "browser", "aTargets": [ 1 ] }, * { "sName": "platform", "aTargets": [ 2 ] }, * { "sName": "version", "aTargets": [ 3 ] }, * { "sName": "grade", "aTargets": [ 4 ] } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "sName": "engine" }, * { "sName": "browser" }, * { "sName": "platform" }, * { "sName": "version" }, * { "sName": "grade" } * ] * } ); * } ); */ "sName": "", /** * Defines a data source type for the sorting which can be used to read * real-time information from the table (updating the internally cached * version) prior to sorting. This allows sorting to occur on user editable * elements such as form inputs. * @type string * @default std * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] }, * { "sType": "numeric", "aTargets": [ 3 ] }, * { "sSortDataType": "dom-select", "aTargets": [ 4 ] }, * { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * null, * null, * { "sSortDataType": "dom-text" }, * { "sSortDataType": "dom-text", "sType": "numeric" }, * { "sSortDataType": "dom-select" }, * { "sSortDataType": "dom-checkbox" } * ] * } ); * } ); */ "sSortDataType": "std", /** * The title of this column. * @type string * @default null Derived from the 'TH' value for this column in the * original HTML table. * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "sTitle": "My column title", "aTargets": [ 0 ] } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "sTitle": "My column title" }, * null, * null, * null, * null * ] * } ); * } ); */ "sTitle": null, /** * The type allows you to specify how the data for this column will be sorted. * Four types (string, numeric, date and html (which will strip HTML tags * before sorting)) are currently available. Note that only date formats * understood by Javascript's Date() object will be accepted as type date. For * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric', * 'date' or 'html' (by default). Further types can be adding through * plug-ins. * @type string * @default null Auto-detected from raw data * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "sType": "html", "aTargets": [ 0 ] } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "sType": "html" }, * null, * null, * null, * null * ] * } ); * } ); */ "sType": null, /** * Defining the width of the column, this parameter may take any CSS value * (3em, 20px etc). DataTables apples 'smart' widths to columns which have not * been given a specific width through this interface ensuring that the table * remains readable. * @type string * @default null Automatic * @dtopt Columns * * @example * // Using aoColumnDefs * $(document).ready( function() { * $('#example').dataTable( { * "aoColumnDefs": [ * { "sWidth": "20%", "aTargets": [ 0 ] } * ] * } ); * } ); * * @example * // Using aoColumns * $(document).ready( function() { * $('#example').dataTable( { * "aoColumns": [ * { "sWidth": "20%" }, * null, * null, * null, * null * ] * } ); * } ); */ "sWidth": null }; /** * DataTables settings object - this holds all the information needed for a * given table, including configuration, data and current application of the * table options. DataTables does not have a single instance for each DataTable * with the settings attached to that instance, but rather instances of the * DataTable "class" are created on-the-fly as needed (typically by a * $().dataTable() call) and the settings object is then applied to that * instance. * * Note that this object is related to {@link DataTable.defaults} but this * one is the internal data store for DataTables's cache of columns. It should * NOT be manipulated outside of DataTables. Any configuration should be done * through the initialisation options. * @namespace * @todo Really should attach the settings object to individual instances so we * don't need to create new instances on each $().dataTable() call (if the * table already exists). It would also save passing oSettings around and * into every single function. However, this is a very significant * architecture change for DataTables and will almost certainly break * backwards compatibility with older installations. This is something that * will be done in 2.0. */ DataTable.models.oSettings = { /** * Primary features of DataTables and their enablement state. * @namespace */ "oFeatures": { /** * Flag to say if DataTables should automatically try to calculate the * optimum table and columns widths (true) or not (false). * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bAutoWidth": null, /** * Delay the creation of TR and TD elements until they are actually * needed by a driven page draw. This can give a significant speed * increase for Ajax source and Javascript source data, but makes no * difference at all fro DOM and server-side processing tables. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bDeferRender": null, /** * Enable filtering on the table or not. Note that if this is disabled * then there is no filtering at all on the table, including fnFilter. * To just remove the filtering input use sDom and remove the 'f' option. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bFilter": null, /** * Table information element (the 'Showing x of y records' div) enable * flag. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bInfo": null, /** * Present a user control allowing the end user to change the page size * when pagination is enabled. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bLengthChange": null, /** * Pagination enabled or not. Note that if this is disabled then length * changing must also be disabled. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bPaginate": null, /** * Processing indicator enable flag whenever DataTables is enacting a * user request - typically an Ajax request for server-side processing. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bProcessing": null, /** * Server-side processing enabled flag - when enabled DataTables will * get all data from the server for every draw - there is no filtering, * sorting or paging done on the client-side. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bServerSide": null, /** * Sorting enablement flag. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bSort": null, /** * Apply a class to the columns which are being sorted to provide a * visual highlight or not. This can slow things down when enabled since * there is a lot of DOM interaction. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bSortClasses": null, /** * State saving enablement flag. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bStateSave": null }, /** * Scrolling settings for a table. * @namespace */ "oScroll": { /** * Indicate if DataTables should be allowed to set the padding / margin * etc for the scrolling header elements or not. Typically you will want * this. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bAutoCss": null, /** * When the table is shorter in height than sScrollY, collapse the * table container down to the height of the table (when true). * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bCollapse": null, /** * Infinite scrolling enablement flag. Now deprecated in favour of * using the Scroller plug-in. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bInfinite": null, /** * Width of the scrollbar for the web-browser's platform. Calculated * during table initialisation. * @type int * @default 0 */ "iBarWidth": 0, /** * Space (in pixels) between the bottom of the scrolling container and * the bottom of the scrolling viewport before the next page is loaded * when using infinite scrolling. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type int */ "iLoadGap": null, /** * Viewport width for horizontal scrolling. Horizontal scrolling is * disabled if an empty string. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type string */ "sX": null, /** * Width to expand the table to when using x-scrolling. Typically you * should not need to use this. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type string * @deprecated */ "sXInner": null, /** * Viewport height for vertical scrolling. Vertical scrolling is disabled * if an empty string. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type string */ "sY": null }, /** * Language information for the table. * @namespace * @extends DataTable.defaults.oLanguage */ "oLanguage": { /** * Information callback function. See * {@link DataTable.defaults.fnInfoCallback} * @type function * @default null */ "fnInfoCallback": null }, /** * Browser support parameters * @namespace */ "oBrowser": { /** * Indicate if the browser incorrectly calculates width:100% inside a * scrolling element (IE6/7) * @type boolean * @default false */ "bScrollOversize": false }, /** * Array referencing the nodes which are used for the features. The * parameters of this object match what is allowed by sDom - i.e. *
      *
    • 'l' - Length changing
    • *
    • 'f' - Filtering input
    • *
    • 't' - The table!
    • *
    • 'i' - Information
    • *
    • 'p' - Pagination
    • *
    • 'r' - pRocessing
    • *
    * @type array * @default [] */ "aanFeatures": [], /** * Store data information - see {@link DataTable.models.oRow} for detailed * information. * @type array * @default [] */ "aoData": [], /** * Array of indexes which are in the current display (after filtering etc) * @type array * @default [] */ "aiDisplay": [], /** * Array of indexes for display - no filtering * @type array * @default [] */ "aiDisplayMaster": [], /** * Store information about each column that is in use * @type array * @default [] */ "aoColumns": [], /** * Store information about the table's header * @type array * @default [] */ "aoHeader": [], /** * Store information about the table's footer * @type array * @default [] */ "aoFooter": [], /** * Search data array for regular expression searching * @type array * @default [] */ "asDataSearch": [], /** * Store the applied global search information in case we want to force a * research or compare the old search to a new one. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @namespace * @extends DataTable.models.oSearch */ "oPreviousSearch": {}, /** * Store the applied search for each column - see * {@link DataTable.models.oSearch} for the format that is used for the * filtering information for each column. * @type array * @default [] */ "aoPreSearchCols": [], /** * Sorting that is applied to the table. Note that the inner arrays are * used in the following manner: *
      *
    • Index 0 - column number
    • *
    • Index 1 - current sorting direction
    • *
    • Index 2 - index of asSorting for this column
    • *
    * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type array * @todo These inner arrays should really be objects */ "aaSorting": null, /** * Sorting that is always applied to the table (i.e. prefixed in front of * aaSorting). * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type array|null * @default null */ "aaSortingFixed": null, /** * Classes to use for the striping of a table. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type array * @default [] */ "asStripeClasses": null, /** * If restoring a table - we should restore its striping classes as well * @type array * @default [] */ "asDestroyStripes": [], /** * If restoring a table - we should restore its width * @type int * @default 0 */ "sDestroyWidth": 0, /** * Callback functions array for every time a row is inserted (i.e. on a draw). * @type array * @default [] */ "aoRowCallback": [], /** * Callback functions for the header on each draw. * @type array * @default [] */ "aoHeaderCallback": [], /** * Callback function for the footer on each draw. * @type array * @default [] */ "aoFooterCallback": [], /** * Array of callback functions for draw callback functions * @type array * @default [] */ "aoDrawCallback": [], /** * Array of callback functions for row created function * @type array * @default [] */ "aoRowCreatedCallback": [], /** * Callback functions for just before the table is redrawn. A return of * false will be used to cancel the draw. * @type array * @default [] */ "aoPreDrawCallback": [], /** * Callback functions for when the table has been initialised. * @type array * @default [] */ "aoInitComplete": [], /** * Callbacks for modifying the settings to be stored for state saving, prior to * saving state. * @type array * @default [] */ "aoStateSaveParams": [], /** * Callbacks for modifying the settings that have been stored for state saving * prior to using the stored values to restore the state. * @type array * @default [] */ "aoStateLoadParams": [], /** * Callbacks for operating on the settings object once the saved state has been * loaded * @type array * @default [] */ "aoStateLoaded": [], /** * Cache the table ID for quick access * @type string * @default Empty string */ "sTableId": "", /** * The TABLE node for the main table * @type node * @default null */ "nTable": null, /** * Permanent ref to the thead element * @type node * @default null */ "nTHead": null, /** * Permanent ref to the tfoot element - if it exists * @type node * @default null */ "nTFoot": null, /** * Permanent ref to the tbody element * @type node * @default null */ "nTBody": null, /** * Cache the wrapper node (contains all DataTables controlled elements) * @type node * @default null */ "nTableWrapper": null, /** * Indicate if when using server-side processing the loading of data * should be deferred until the second draw. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean * @default false */ "bDeferLoading": false, /** * Indicate if all required information has been read in * @type boolean * @default false */ "bInitialised": false, /** * Information about open rows. Each object in the array has the parameters * 'nTr' and 'nParent' * @type array * @default [] */ "aoOpenRows": [], /** * Dictate the positioning of DataTables' control elements - see * {@link DataTable.model.oInit.sDom}. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type string * @default null */ "sDom": null, /** * Which type of pagination should be used. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type string * @default two_button */ "sPaginationType": "two_button", /** * The cookie duration (for bStateSave) in seconds. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type int * @default 0 */ "iCookieDuration": 0, /** * The cookie name prefix. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type string * @default Empty string */ "sCookiePrefix": "", /** * Callback function for cookie creation. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type function * @default null */ "fnCookieCallback": null, /** * Array of callback functions for state saving. Each array element is an * object with the following parameters: *
      *
    • function:fn - function to call. Takes two parameters, oSettings * and the JSON string to save that has been thus far created. Returns * a JSON string to be inserted into a json object * (i.e. '"param": [ 0, 1, 2]')
    • *
    • string:sName - name of callback
    • *
    * @type array * @default [] */ "aoStateSave": [], /** * Array of callback functions for state loading. Each array element is an * object with the following parameters: *
      *
    • function:fn - function to call. Takes two parameters, oSettings * and the object stored. May return false to cancel state loading
    • *
    • string:sName - name of callback
    • *
    * @type array * @default [] */ "aoStateLoad": [], /** * State that was loaded from the cookie. Useful for back reference * @type object * @default null */ "oLoadedState": null, /** * Source url for AJAX data for the table. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type string * @default null */ "sAjaxSource": null, /** * Property from a given object from which to read the table data from. This * can be an empty string (when not server-side processing), in which case * it is assumed an an array is given directly. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type string */ "sAjaxDataProp": null, /** * Note if draw should be blocked while getting data * @type boolean * @default true */ "bAjaxDataGet": true, /** * The last jQuery XHR object that was used for server-side data gathering. * This can be used for working with the XHR information in one of the * callbacks * @type object * @default null */ "jqXHR": null, /** * Function to get the server-side data. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type function */ "fnServerData": null, /** * Functions which are called prior to sending an Ajax request so extra * parameters can easily be sent to the server * @type array * @default [] */ "aoServerParams": [], /** * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if * required). * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type string */ "sServerMethod": null, /** * Format numbers for display. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type function */ "fnFormatNumber": null, /** * List of options that can be used for the user selectable length menu. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type array * @default [] */ "aLengthMenu": null, /** * Counter for the draws that the table does. Also used as a tracker for * server-side processing * @type int * @default 0 */ "iDraw": 0, /** * Indicate if a redraw is being done - useful for Ajax * @type boolean * @default false */ "bDrawing": false, /** * Draw index (iDraw) of the last error when parsing the returned data * @type int * @default -1 */ "iDrawError": -1, /** * Paging display length * @type int * @default 10 */ "_iDisplayLength": 10, /** * Paging start point - aiDisplay index * @type int * @default 0 */ "_iDisplayStart": 0, /** * Paging end point - aiDisplay index. Use fnDisplayEnd rather than * this property to get the end point * @type int * @default 10 * @private */ "_iDisplayEnd": 10, /** * Server-side processing - number of records in the result set * (i.e. before filtering), Use fnRecordsTotal rather than * this property to get the value of the number of records, regardless of * the server-side processing setting. * @type int * @default 0 * @private */ "_iRecordsTotal": 0, /** * Server-side processing - number of records in the current display set * (i.e. after filtering). Use fnRecordsDisplay rather than * this property to get the value of the number of records, regardless of * the server-side processing setting. * @type boolean * @default 0 * @private */ "_iRecordsDisplay": 0, /** * Flag to indicate if jQuery UI marking and classes should be used. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bJUI": null, /** * The classes to use for the table * @type object * @default {} */ "oClasses": {}, /** * Flag attached to the settings object so you can check in the draw * callback if filtering has been done in the draw. Deprecated in favour of * events. * @type boolean * @default false * @deprecated */ "bFiltered": false, /** * Flag attached to the settings object so you can check in the draw * callback if sorting has been done in the draw. Deprecated in favour of * events. * @type boolean * @default false * @deprecated */ "bSorted": false, /** * Indicate that if multiple rows are in the header and there is more than * one unique cell per column, if the top one (true) or bottom one (false) * should be used for sorting / title by DataTables. * Note that this parameter will be set by the initialisation routine. To * set a default use {@link DataTable.defaults}. * @type boolean */ "bSortCellsTop": null, /** * Initialisation object that is used for the table * @type object * @default null */ "oInit": null, /** * Destroy callback functions - for plug-ins to attach themselves to the * destroy so they can clean up markup and events. * @type array * @default [] */ "aoDestroyCallback": [], /** * Get the number of records in the current record set, before filtering * @type function */ "fnRecordsTotal": function () { if ( this.oFeatures.bServerSide ) { return parseInt(this._iRecordsTotal, 10); } else { return this.aiDisplayMaster.length; } }, /** * Get the number of records in the current record set, after filtering * @type function */ "fnRecordsDisplay": function () { if ( this.oFeatures.bServerSide ) { return parseInt(this._iRecordsDisplay, 10); } else { return this.aiDisplay.length; } }, /** * Set the display end point - aiDisplay index * @type function * @todo Should do away with _iDisplayEnd and calculate it on-the-fly here */ "fnDisplayEnd": function () { if ( this.oFeatures.bServerSide ) { if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) { return this._iDisplayStart+this.aiDisplay.length; } else { return Math.min( this._iDisplayStart+this._iDisplayLength, this._iRecordsDisplay ); } } else { return this._iDisplayEnd; } }, /** * The DataTables object for this table * @type object * @default null */ "oInstance": null, /** * Unique identifier for each instance of the DataTables object. If there * is an ID on the table node, then it takes that value, otherwise an * incrementing internal counter is used. * @type string * @default null */ "sInstance": null, /** * tabindex attribute value that is added to DataTables control elements, allowing * keyboard navigation of the table and its controls. */ "iTabIndex": 0, /** * DIV container for the footer scrolling table if scrolling */ "nScrollHead": null, /** * DIV container for the footer scrolling table if scrolling */ "nScrollFoot": null }; /** * Extension object for DataTables that is used to provide all extension options. * * Note that the DataTable.ext object is available through * jQuery.fn.dataTable.ext where it may be accessed and manipulated. It is * also aliased to jQuery.fn.dataTableExt for historic reasons. * @namespace * @extends DataTable.models.ext */ DataTable.ext = $.extend( true, {}, DataTable.models.ext ); $.extend( DataTable.ext.oStdClasses, { "sTable": "dataTable", /* Two buttons buttons */ "sPagePrevEnabled": "paginate_enabled_previous", "sPagePrevDisabled": "paginate_disabled_previous", "sPageNextEnabled": "paginate_enabled_next", "sPageNextDisabled": "paginate_disabled_next", "sPageJUINext": "", "sPageJUIPrev": "", /* Full numbers paging buttons */ "sPageButton": "paginate_button", "sPageButtonActive": "paginate_active", "sPageButtonStaticDisabled": "paginate_button paginate_button_disabled", "sPageFirst": "first", "sPagePrevious": "previous", "sPageNext": "next", "sPageLast": "last", /* Striping classes */ "sStripeOdd": "odd", "sStripeEven": "even", /* Empty row */ "sRowEmpty": "dataTables_empty", /* Features */ "sWrapper": "dataTables_wrapper", "sFilter": "dataTables_filter", "sInfo": "dataTables_info", "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ "sLength": "dataTables_length", "sProcessing": "dataTables_processing", /* Sorting */ "sSortAsc": "sorting_asc", "sSortDesc": "sorting_desc", "sSortable": "sorting", /* Sortable in both directions */ "sSortableAsc": "sorting_asc_disabled", "sSortableDesc": "sorting_desc_disabled", "sSortableNone": "sorting_disabled", "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ "sSortJUIAsc": "", "sSortJUIDesc": "", "sSortJUI": "", "sSortJUIAscAllowed": "", "sSortJUIDescAllowed": "", "sSortJUIWrapper": "", "sSortIcon": "", /* Scrolling */ "sScrollWrapper": "dataTables_scroll", "sScrollHead": "dataTables_scrollHead", "sScrollHeadInner": "dataTables_scrollHeadInner", "sScrollBody": "dataTables_scrollBody", "sScrollFoot": "dataTables_scrollFoot", "sScrollFootInner": "dataTables_scrollFootInner", /* Misc */ "sFooterTH": "", "sJUIHeader": "", "sJUIFooter": "" } ); $.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, { /* Two buttons buttons */ "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left", "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled", "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right", "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled", "sPageJUINext": "ui-icon ui-icon-circle-arrow-e", "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w", /* Full numbers paging buttons */ "sPageButton": "fg-button ui-button ui-state-default", "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled", "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled", "sPageFirst": "first ui-corner-tl ui-corner-bl", "sPageLast": "last ui-corner-tr ui-corner-br", /* Features */ "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+ "ui-buttonset-multi paging_", /* Note that the type is postfixed */ /* Sorting */ "sSortAsc": "ui-state-default", "sSortDesc": "ui-state-default", "sSortable": "ui-state-default", "sSortableAsc": "ui-state-default", "sSortableDesc": "ui-state-default", "sSortableNone": "ui-state-default", "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n", "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s", "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s", "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n", "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s", "sSortJUIWrapper": "DataTables_sort_wrapper", "sSortIcon": "DataTables_sort_icon", /* Scrolling */ "sScrollHead": "dataTables_scrollHead ui-state-default", "sScrollFoot": "dataTables_scrollFoot ui-state-default", /* Misc */ "sFooterTH": "ui-state-default", "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix", "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix" } ); /* * Variable: oPagination * Purpose: * Scope: jQuery.fn.dataTableExt */ $.extend( DataTable.ext.oPagination, { /* * Variable: two_button * Purpose: Standard two button (forward/back) pagination * Scope: jQuery.fn.dataTableExt.oPagination */ "two_button": { /* * Function: oPagination.two_button.fnInit * Purpose: Initialise dom elements required for pagination with forward/back buttons only * Returns: - * Inputs: object:oSettings - dataTables settings object * node:nPaging - the DIV which contains this pagination control * function:fnCallbackDraw - draw function which must be called on update */ "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) { var oLang = oSettings.oLanguage.oPaginate; var oClasses = oSettings.oClasses; var fnClickHandler = function ( e ) { if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) ) { fnCallbackDraw( oSettings ); } }; var sAppend = (!oSettings.bJUI) ? ''+oLang.sPrevious+''+ ''+oLang.sNext+'' : ''+ ''; $(nPaging).append( sAppend ); var els = $('a', nPaging); var nPrevious = els[0], nNext = els[1]; oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler ); oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); /* ID the first elements only */ if ( !oSettings.aanFeatures.p ) { nPaging.id = oSettings.sTableId+'_paginate'; nPrevious.id = oSettings.sTableId+'_previous'; nNext.id = oSettings.sTableId+'_next'; nPrevious.setAttribute('aria-controls', oSettings.sTableId); nNext.setAttribute('aria-controls', oSettings.sTableId); } }, /* * Function: oPagination.two_button.fnUpdate * Purpose: Update the two button pagination at the end of the draw * Returns: - * Inputs: object:oSettings - dataTables settings object * function:fnCallbackDraw - draw function to call on page change */ "fnUpdate": function ( oSettings, fnCallbackDraw ) { if ( !oSettings.aanFeatures.p ) { return; } var oClasses = oSettings.oClasses; var an = oSettings.aanFeatures.p; var nNode; /* Loop over each instance of the pager */ for ( var i=0, iLen=an.length ; i'+oLang.sFirst+''+ ''+oLang.sPrevious+''+ ''+ ''+oLang.sNext+''+ ''+oLang.sLast+'' ); var els = $('a', nPaging); var nFirst = els[0], nPrev = els[1], nNext = els[2], nLast = els[3]; oSettings.oApi._fnBindAction( nFirst, {action: "first"}, fnClickHandler ); oSettings.oApi._fnBindAction( nPrev, {action: "previous"}, fnClickHandler ); oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler ); oSettings.oApi._fnBindAction( nLast, {action: "last"}, fnClickHandler ); /* ID the first elements only */ if ( !oSettings.aanFeatures.p ) { nPaging.id = oSettings.sTableId+'_paginate'; nFirst.id =oSettings.sTableId+'_first'; nPrev.id =oSettings.sTableId+'_previous'; nNext.id =oSettings.sTableId+'_next'; nLast.id =oSettings.sTableId+'_last'; } }, /* * Function: oPagination.full_numbers.fnUpdate * Purpose: Update the list of page buttons shows * Returns: - * Inputs: object:oSettings - dataTables settings object * function:fnCallbackDraw - draw function to call on page change */ "fnUpdate": function ( oSettings, fnCallbackDraw ) { if ( !oSettings.aanFeatures.p ) { return; } var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages; var iPageCountHalf = Math.floor(iPageCount / 2); var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength); var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1; var sList = ""; var iStartButton, iEndButton, i, iLen; var oClasses = oSettings.oClasses; var anButtons, anStatic, nPaginateList, nNode; var an = oSettings.aanFeatures.p; var fnBind = function (j) { oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) { /* Use the information in the element to jump to the required page */ oSettings.oApi._fnPageChange( oSettings, e.data.page ); fnCallbackDraw( oSettings ); e.preventDefault(); } ); }; /* Pages calculation */ if ( oSettings._iDisplayLength === -1 ) { iStartButton = 1; iEndButton = 1; iCurrentPage = 1; } else if (iPages < iPageCount) { iStartButton = 1; iEndButton = iPages; } else if (iCurrentPage <= iPageCountHalf) { iStartButton = 1; iEndButton = iPageCount; } else if (iCurrentPage >= (iPages - iPageCountHalf)) { iStartButton = iPages - iPageCount + 1; iEndButton = iPages; } else { iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1; iEndButton = iStartButton + iPageCount - 1; } /* Build the dynamic list */ for ( i=iStartButton ; i<=iEndButton ; i++ ) { sList += (iCurrentPage !== i) ? ''+oSettings.fnFormatNumber(i)+'' : ''+oSettings.fnFormatNumber(i)+''; } /* Loop over each instance of the pager */ for ( i=0, iLen=an.length ; i y) ? 1 : 0)); }, "string-desc": function ( x, y ) { return ((x < y) ? 1 : ((x > y) ? -1 : 0)); }, /* * html sorting (ignore html tags) */ "html-pre": function ( a ) { return a.replace( /<.*?>/g, "" ).toLowerCase(); }, "html-asc": function ( x, y ) { return ((x < y) ? -1 : ((x > y) ? 1 : 0)); }, "html-desc": function ( x, y ) { return ((x < y) ? 1 : ((x > y) ? -1 : 0)); }, /* * date sorting */ "date-pre": function ( a ) { var x = Date.parse( a ); if ( isNaN(x) || x==="" ) { x = Date.parse( "01/01/1970 00:00:00" ); } return x; }, "date-asc": function ( x, y ) { return x - y; }, "date-desc": function ( x, y ) { return y - x; }, /* * numerical sorting */ "numeric-pre": function ( a ) { return (a=="-" || a==="") ? 0 : a*1; }, "numeric-asc": function ( x, y ) { return x - y; }, "numeric-desc": function ( x, y ) { return y - x; } } ); $.extend( DataTable.ext.aTypes, [ /* * Function: - * Purpose: Check to see if a string is numeric * Returns: string:'numeric' or null * Inputs: mixed:sText - string to check */ function ( sData ) { /* Allow zero length strings as a number */ if ( typeof sData === 'number' ) { return 'numeric'; } else if ( typeof sData !== 'string' ) { return null; } var sValidFirstChars = "0123456789-"; var sValidChars = "0123456789."; var Char; var bDecimal = false; /* Check for a valid first char (no period and allow negatives) */ Char = sData.charAt(0); if (sValidFirstChars.indexOf(Char) == -1) { return null; } /* Check all the other characters are valid */ for ( var i=1 ; i') != -1 ) { return 'html'; } return null; } ] ); // jQuery aliases $.fn.DataTable = DataTable; $.fn.dataTable = DataTable; $.fn.dataTableSettings = DataTable.settings; $.fn.dataTableExt = DataTable.ext; // Information about events fired by DataTables - for documentation. /** * Draw event, fired whenever the table is redrawn on the page, at the same point as * fnDrawCallback. This may be useful for binding events or performing calculations when * the table is altered at all. * @name DataTable#draw * @event * @param {event} e jQuery event object * @param {object} o DataTables settings object {@link DataTable.models.oSettings} */ /** * Filter event, fired when the filtering applied to the table (using the build in global * global filter, or column filters) is altered. * @name DataTable#filter * @event * @param {event} e jQuery event object * @param {object} o DataTables settings object {@link DataTable.models.oSettings} */ /** * Page change event, fired when the paging of the table is altered. * @name DataTable#page * @event * @param {event} e jQuery event object * @param {object} o DataTables settings object {@link DataTable.models.oSettings} */ /** * Sort event, fired when the sorting applied to the table is altered. * @name DataTable#sort * @event * @param {event} e jQuery event object * @param {object} o DataTables settings object {@link DataTable.models.oSettings} */ /** * DataTables initialisation complete event, fired when the table is fully drawn, * including Ajax data loaded, if Ajax data is required. * @name DataTable#init * @event * @param {event} e jQuery event object * @param {object} oSettings DataTables settings object * @param {object} json The JSON object request from the server - only * present if client-side Ajax sourced data is used
  • */ /** * State save event, fired when the table has changed state a new state save is required. * This method allows modification of the state saving object prior to actually doing the * save, including addition or other state properties (for plug-ins) or modification * of a DataTables core property. * @name DataTable#stateSaveParams * @event * @param {event} e jQuery event object * @param {object} oSettings DataTables settings object * @param {object} json The state information to be saved */ /** * State load event, fired when the table is loading state from the stored data, but * prior to the settings object being modified by the saved state - allowing modification * of the saved state is required or loading of state for a plug-in. * @name DataTable#stateLoadParams * @event * @param {event} e jQuery event object * @param {object} oSettings DataTables settings object * @param {object} json The saved state information */ /** * State loaded event, fired when state has been loaded from stored data and the settings * object has been modified by the loaded data. * @name DataTable#stateLoaded * @event * @param {event} e jQuery event object * @param {object} oSettings DataTables settings object * @param {object} json The saved state information */ /** * Processing event, fired when DataTables is doing some kind of processing (be it, * sort, filter or anything else). Can be used to indicate to the end user that * there is something happening, or that something has finished. * @name DataTable#processing * @event * @param {event} e jQuery event object * @param {object} oSettings DataTables settings object * @param {boolean} bShow Flag for if DataTables is doing processing or not */ /** * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to * made to the server for new data (note that this trigger is called in fnServerData, * if you override fnServerData and which to use this event, you need to trigger it in * you success function). * @name DataTable#xhr * @event * @param {event} e jQuery event object * @param {object} o DataTables settings object {@link DataTable.models.oSettings} * @param {object} json JSON returned from the server */ /** * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing * the bDestroy:true parameter in the initialisation object. This can be used to remove * bound events, added DOM nodes, etc. * @name DataTable#destroy * @event * @param {event} e jQuery event object * @param {object} o DataTables settings object {@link DataTable.models.oSettings} */ })); }(window, document)); PK!><<abilian/web/resources/datatables/js/jquery.dataTables.min.js/* * File: jquery.dataTables.min.js * Version: 1.9.4 * Author: Allan Jardine (www.sprymedia.co.uk) * Info: www.datatables.net * * Copyright 2008-2012 Allan Jardine, all rights reserved. * * This source file is free software, under either the GPL v2 license or a * BSD style license, available at: * http://datatables.net/license_gpl2 * http://datatables.net/license_bsd * * This source file 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 license files for details. */ (function(X,l,n){var L=function(h){var j=function(e){function o(a,b){var c=j.defaults.columns,d=a.aoColumns.length,c=h.extend({},j.models.oColumn,c,{sSortingClass:a.oClasses.sSortable,sSortingClassJUI:a.oClasses.sSortJUI,nTh:b?b:l.createElement("th"),sTitle:c.sTitle?c.sTitle:b?b.innerHTML:"",aDataSort:c.aDataSort?c.aDataSort:[d],mData:c.mData?c.oDefaults:d});a.aoColumns.push(c);if(a.aoPreSearchCols[d]===n||null===a.aoPreSearchCols[d])a.aoPreSearchCols[d]=h.extend({},j.models.oSearch);else if(c=a.aoPreSearchCols[d], c.bRegex===n&&(c.bRegex=!0),c.bSmart===n&&(c.bSmart=!0),c.bCaseInsensitive===n)c.bCaseInsensitive=!0;m(a,d,null)}function m(a,b,c){var d=a.aoColumns[b];c!==n&&null!==c&&(c.mDataProp&&!c.mData&&(c.mData=c.mDataProp),c.sType!==n&&(d.sType=c.sType,d._bAutoType=!1),h.extend(d,c),p(d,c,"sWidth","sWidthOrig"),c.iDataSort!==n&&(d.aDataSort=[c.iDataSort]),p(d,c,"aDataSort"));var i=d.mRender?Q(d.mRender):null,f=Q(d.mData);d.fnGetData=function(a,b){var c=f(a,b);return d.mRender&&b&&""!==b?i(c,b,a):c};d.fnSetData= L(d.mData);a.oFeatures.bSort||(d.bSortable=!1);!d.bSortable||-1==h.inArray("asc",d.asSorting)&&-1==h.inArray("desc",d.asSorting)?(d.sSortingClass=a.oClasses.sSortableNone,d.sSortingClassJUI=""):-1==h.inArray("asc",d.asSorting)&&-1==h.inArray("desc",d.asSorting)?(d.sSortingClass=a.oClasses.sSortable,d.sSortingClassJUI=a.oClasses.sSortJUI):-1!=h.inArray("asc",d.asSorting)&&-1==h.inArray("desc",d.asSorting)?(d.sSortingClass=a.oClasses.sSortableAsc,d.sSortingClassJUI=a.oClasses.sSortJUIAscAllowed):-1== h.inArray("asc",d.asSorting)&&-1!=h.inArray("desc",d.asSorting)&&(d.sSortingClass=a.oClasses.sSortableDesc,d.sSortingClassJUI=a.oClasses.sSortJUIDescAllowed)}function k(a){if(!1===a.oFeatures.bAutoWidth)return!1;da(a);for(var b=0,c=a.aoColumns.length;bj[f])d(a.aoColumns.length+j[f],b[i]);else if("string"===typeof j[f]){e=0;for(w=a.aoColumns.length;eb&&a[d]--; -1!=c&&a.splice(c,1)}function S(a,b,c){var d=a.aoColumns[c];return d.fnRender({iDataRow:b,iDataColumn:c,oSettings:a,aData:a.aoData[b]._aData,mDataProp:d.mData},v(a,b,c,"display"))}function ea(a,b){var c=a.aoData[b],d;if(null===c.nTr){c.nTr=l.createElement("tr");c.nTr._DT_RowIndex=b;c._aData.DT_RowId&&(c.nTr.id=c._aData.DT_RowId);c._aData.DT_RowClass&& (c.nTr.className=c._aData.DT_RowClass);for(var i=0,f=a.aoColumns.length;i=a.fnRecordsDisplay()?0:a.iInitDisplayStart,a.iInitDisplayStart=-1,y(a));if(a.bDeferLoading)a.bDeferLoading=!1,a.iDraw++;else if(a.oFeatures.bServerSide){if(!a.bDestroying&&!wa(a))return}else a.iDraw++;if(0!==a.aiDisplay.length){var g= a._iDisplayStart;d=a._iDisplayEnd;a.oFeatures.bServerSide&&(g=0,d=a.aoData.length);for(;g")[0];a.nTable.parentNode.insertBefore(b,a.nTable);a.nTableWrapper=h('
    ')[0];a.nTableReinsertBefore=a.nTable.nextSibling;for(var c=a.nTableWrapper,d=a.sDom.split(""),i,f,g,e,w,o,k,m=0;m")[0];w=d[m+ 1];if("'"==w||'"'==w){o="";for(k=2;d[m+k]!=w;)o+=d[m+k],k++;"H"==o?o=a.oClasses.sJUIHeader:"F"==o&&(o=a.oClasses.sJUIFooter);-1!=o.indexOf(".")?(w=o.split("."),e.id=w[0].substr(1,w[0].length-1),e.className=w[1]):"#"==o.charAt(0)?e.id=o.substr(1,o.length-1):e.className=o;m+=k}c.appendChild(e);c=e}else if(">"==g)c=c.parentNode;else if("l"==g&&a.oFeatures.bPaginate&&a.oFeatures.bLengthChange)i=ya(a),f=1;else if("f"==g&&a.oFeatures.bFilter)i=za(a),f=1;else if("r"==g&&a.oFeatures.bProcessing)i=Aa(a),f= 1;else if("t"==g)i=Ba(a),f=1;else if("i"==g&&a.oFeatures.bInfo)i=Ca(a),f=1;else if("p"==g&&a.oFeatures.bPaginate)i=Da(a),f=1;else if(0!==j.ext.aoFeatures.length){e=j.ext.aoFeatures;k=0;for(w=e.length;k'):""===c?'':c+' ',d=l.createElement("div");d.className=a.oClasses.sFilter;d.innerHTML="";a.aanFeatures.f||(d.id=a.sTableId+"_filter");c=h('input[type="text"]',d);d._DT_Input=c[0];c.val(b.sSearch.replace('"',"""));c.bind("keyup.DT",function(){for(var c=a.aanFeatures.f,d=this.value===""?"":this.value, g=0,e=c.length;g=b.length)a.aiDisplay.splice(0,a.aiDisplay.length),a.aiDisplay=a.aiDisplayMaster.slice();else if(a.aiDisplay.length==a.aiDisplayMaster.length||i.sSearch.length>b.length||1==c||0!==b.indexOf(i.sSearch)){a.aiDisplay.splice(0, a.aiDisplay.length);la(a,1);for(b=0;b").html(c).text()); return c.replace(/[\n\r]/g," ")}function ma(a,b,c,d){if(c)return a=b?a.split(" "):oa(a).split(" "),a="^(?=.*?"+a.join(")(?=.*?")+").*$",RegExp(a,d?"i":"");a=b?a:oa(a);return RegExp(a,d?"i":"")}function Ja(a,b){return"function"===typeof j.ext.ofnSearch[b]?j.ext.ofnSearch[b](a):null===a?"":"html"==b?a.replace(/[\r\n]/g," ").replace(/<.*?>/g,""):"string"===typeof a?a.replace(/[\r\n]/g," "):a}function oa(a){return a.replace(RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"), "\\$1")}function Ca(a){var b=l.createElement("div");b.className=a.oClasses.sInfo;a.aanFeatures.i||(a.aoDrawCallback.push({fn:Ka,sName:"information"}),b.id=a.sTableId+"_info");a.nTable.setAttribute("aria-describedby",a.sTableId+"_info");return b}function Ka(a){if(a.oFeatures.bInfo&&0!==a.aanFeatures.i.length){var b=a.oLanguage,c=a._iDisplayStart+1,d=a.fnDisplayEnd(),i=a.fnRecordsTotal(),f=a.fnRecordsDisplay(),g;g=0===f?b.sInfoEmpty:b.sInfo;f!=i&&(g+=" "+b.sInfoFiltered);g+=b.sInfoPostFix;g=ja(a,g); null!==b.fnInfoCallback&&(g=b.fnInfoCallback.call(a.oInstance,a,c,d,i,f,g));a=a.aanFeatures.i;b=0;for(c=a.length;b",c,d,i=a.aLengthMenu;if(2==i.length&&"object"===typeof i[0]&&"object"===typeof i[1]){c=0;for(d=i[0].length;c'+i[1][c]+""}else{c=0;for(d=i.length;c'+i[c]+""}b+="";i=l.createElement("div");a.aanFeatures.l|| (i.id=a.sTableId+"_length");i.className=a.oClasses.sLength;i.innerHTML="";h('select option[value="'+a._iDisplayLength+'"]',i).attr("selected",!0);h("select",i).bind("change.DT",function(){var b=h(this).val(),i=a.aanFeatures.l;c=0;for(d=i.length;ca.aiDisplay.length||-1==a._iDisplayLength?a.aiDisplay.length:a._iDisplayStart+a._iDisplayLength}function Da(a){if(a.oScroll.bInfinite)return null;var b=l.createElement("div");b.className=a.oClasses.sPaging+a.sPaginationType;j.ext.oPagination[a.sPaginationType].fnInit(a, b,function(a){y(a);x(a)});a.aanFeatures.p||a.aoDrawCallback.push({fn:function(a){j.ext.oPagination[a.sPaginationType].fnUpdate(a,function(a){y(a);x(a)})},sName:"pagination"});return b}function qa(a,b){var c=a._iDisplayStart;if("number"===typeof b)a._iDisplayStart=b*a._iDisplayLength,a._iDisplayStart>a.fnRecordsDisplay()&&(a._iDisplayStart=0);else if("first"==b)a._iDisplayStart=0;else if("previous"==b)a._iDisplayStart=0<=a._iDisplayLength?a._iDisplayStart-a._iDisplayLength:0,0>a._iDisplayStart&&(a._iDisplayStart= 0);else if("next"==b)0<=a._iDisplayLength?a._iDisplayStart+a._iDisplayLengthh(a.nTable).height()-a.oScroll.iLoadGap&&a.fnDisplayEnd()d.offsetHeight||"scroll"==h(d).css("overflow-y")))a.nTable.style.width=q(h(a.nTable).outerWidth()-a.oScroll.iBarWidth)}else""!==a.oScroll.sXInner?a.nTable.style.width= q(a.oScroll.sXInner):i==h(d).width()&&h(d).height()i-a.oScroll.iBarWidth&&(a.nTable.style.width=q(i))):a.nTable.style.width=q(i);i=h(a.nTable).outerWidth();C(s,e);C(function(a){p.push(q(h(a).width()))},e);C(function(a,b){a.style.width=p[b]},g);h(e).height(0);null!==a.nTFoot&&(C(s,j),C(function(a){n.push(q(h(a).width()))},j),C(function(a,b){a.style.width=n[b]},o),h(j).height(0));C(function(a,b){a.innerHTML= "";a.style.width=p[b]},e);null!==a.nTFoot&&C(function(a,b){a.innerHTML="";a.style.width=n[b]},j);if(h(a.nTable).outerWidth()d.offsetHeight||"scroll"==h(d).css("overflow-y")?i+a.oScroll.iBarWidth:i;if(r&&(d.scrollHeight>d.offsetHeight||"scroll"==h(d).css("overflow-y")))a.nTable.style.width=q(g-a.oScroll.iBarWidth);d.style.width=q(g);a.nScrollHead.style.width=q(g);null!==a.nTFoot&&(a.nScrollFoot.style.width=q(g));""===a.oScroll.sX?D(a,1,"The table cannot fit into the current element which will cause column misalignment. The table has been drawn at its minimum possible width."): ""!==a.oScroll.sXInner&&D(a,1,"The table cannot fit into the current element which will cause column misalignment. Increase the sScrollXInner value or remove it to allow automatic calculation")}else d.style.width=q("100%"),a.nScrollHead.style.width=q("100%"),null!==a.nTFoot&&(a.nScrollFoot.style.width=q("100%"));""===a.oScroll.sY&&r&&(d.style.height=q(a.nTable.offsetHeight+a.oScroll.iBarWidth));""!==a.oScroll.sY&&a.oScroll.bCollapse&&(d.style.height=q(a.oScroll.sY),r=""!==a.oScroll.sX&&a.nTable.offsetWidth> d.offsetWidth?a.oScroll.iBarWidth:0,a.nTable.offsetHeightd.clientHeight||"scroll"==h(d).css("overflow-y");b.style.paddingRight=c?a.oScroll.iBarWidth+"px":"0px";null!==a.nTFoot&&(R.style.width=q(r),l.style.width=q(r),l.style.paddingRight=c?a.oScroll.iBarWidth+"px":"0px");h(d).scroll();if(a.bSorted||a.bFiltered)d.scrollTop=0}function C(a,b,c){for(var d= 0,i=0,f=b.length,g,e;itd",b));j=N(a,f);for(f=d=0;fc)return null;if(null===a.aoData[c].nTr){var d=l.createElement("td");d.innerHTML=v(a,c,b,"");return d}return J(a,c)[b]}function Pa(a,b){for(var c=-1,d=-1,i=0;i/g,"");e.length>c&&(c=e.length,d=i)}return d}function q(a){if(null===a)return"0px";if("number"==typeof a)return 0>a?"0px":a+"px";var b=a.charCodeAt(a.length-1); return 48>b||57/g,""),i=q[c].nTh,i.removeAttribute("aria-sort"),i.removeAttribute("aria-label"),q[c].bSortable?0d&&d++;f=RegExp(f+"[123]");var o;b=0;for(c=a.length;b
    ')[0];l.body.appendChild(b);a.oBrowser.bScrollOversize= 100===h("#DT_BrowserTest",b)[0].offsetWidth?!0:!1;l.body.removeChild(b)}function Va(a){return function(){var b=[s(this[j.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return j.ext.oApi[a].apply(this,b)}}var U=/\[.*?\]$/,Wa=X.JSON?JSON.stringify:function(a){var b=typeof a;if("object"!==b||null===a)return"string"===b&&(a='"'+a+'"'),a+"";var c,d,e=[],f=h.isArray(a);for(c in a)d=a[c],b=typeof d,"string"===b?d='"'+d+'"':"object"===b&&null!==d&&(d=Wa(d)),e.push((f?"":'"'+c+'":')+d);return(f? "[":"{")+e+(f?"]":"}")};this.$=function(a,b){var c,d,e=[],f;d=s(this[j.ext.iApiIndex]);var g=d.aoData,o=d.aiDisplay,k=d.aiDisplayMaster;b||(b={});b=h.extend({},{filter:"none",order:"current",page:"all"},b);if("current"==b.page){c=d._iDisplayStart;for(d=d.fnDisplayEnd();c=d.fnRecordsDisplay()&&(d._iDisplayStart-=d._iDisplayLength,0>d._iDisplayStart&&(d._iDisplayStart=0));if(c===n||c)y(d),x(d);return g};this.fnDestroy=function(a){var b=s(this[j.ext.iApiIndex]),c=b.nTableWrapper.parentNode,d=b.nTBody,i,f,a=a===n?!1:a;b.bDestroying=!0;A(b,"aoDestroyCallback","destroy",[b]);if(!a){i=0;for(f=b.aoColumns.length;itr>td."+b.oClasses.sRowEmpty,b.nTable).parent().remove();b.nTable!=b.nTHead.parentNode&&(h(b.nTable).children("thead").remove(),b.nTable.appendChild(b.nTHead));b.nTFoot&&b.nTable!=b.nTFoot.parentNode&&(h(b.nTable).children("tfoot").remove(),b.nTable.appendChild(b.nTFoot));b.nTable.parentNode.removeChild(b.nTable);h(b.nTableWrapper).remove();b.aaSorting=[];b.aaSortingFixed=[];P(b);h(T(b)).removeClass(b.asStripeClasses.join(" "));h("th, td",b.nTHead).removeClass([b.oClasses.sSortable,b.oClasses.sSortableAsc, b.oClasses.sSortableDesc,b.oClasses.sSortableNone].join(" "));b.bJUI&&(h("th span."+b.oClasses.sSortIcon+", td span."+b.oClasses.sSortIcon,b.nTHead).remove(),h("th, td",b.nTHead).each(function(){var a=h("div."+b.oClasses.sSortJUIWrapper,this),c=a.contents();h(this).append(c);a.remove()}));!a&&b.nTableReinsertBefore?c.insertBefore(b.nTable,b.nTableReinsertBefore):a||c.appendChild(b.nTable);i=0;for(f=b.aoData.length;i=t(d);if(!m)for(e=a;et<"F"ip>')):h.extend(g.oClasses,j.ext.oStdClasses);h(this).addClass(g.oClasses.sTable);if(""!==g.oScroll.sX||""!==g.oScroll.sY)g.oScroll.iBarWidth=Qa();g.iInitDisplayStart===n&&(g.iInitDisplayStart=e.iDisplayStart, g._iDisplayStart=e.iDisplayStart);e.bStateSave&&(g.oFeatures.bStateSave=!0,Sa(g,e),z(g,"aoDrawCallback",ra,"state_save"));null!==e.iDeferLoading&&(g.bDeferLoading=!0,a=h.isArray(e.iDeferLoading),g._iRecordsDisplay=a?e.iDeferLoading[0]:e.iDeferLoading,g._iRecordsTotal=a?e.iDeferLoading[1]:e.iDeferLoading);null!==e.aaData&&(f=!0);""!==e.oLanguage.sUrl?(g.oLanguage.sUrl=e.oLanguage.sUrl,h.getJSON(g.oLanguage.sUrl,null,function(a){pa(a);h.extend(true,g.oLanguage,e.oLanguage,a);ba(g)}),i=!0):h.extend(!0, g.oLanguage,e.oLanguage);null===e.asStripeClasses&&(g.asStripeClasses=[g.oClasses.sStripeOdd,g.oClasses.sStripeEven]);b=g.asStripeClasses.length;g.asDestroyStripes=[];if(b){c=!1;d=h(this).children("tbody").children("tr:lt("+b+")");for(a=0;a=g.aoColumns.length&&(g.aaSorting[a][0]=0);var k=g.aoColumns[g.aaSorting[a][0]];g.aaSorting[a][2]===n&&(g.aaSorting[a][2]=0);e.aaSorting===n&&g.saved_aaSorting===n&&(g.aaSorting[a][1]= k.asSorting[0]);c=0;for(d=k.asSorting.length;c=parseInt(n,10)};j.fnIsDataTable=function(e){for(var h=j.settings,m=0;me)return e;for(var h=e+"",e=h.split(""),j="",h=h.length,k=0;k'+k.sPrevious+''+k.sNext+"":'';h(j).append(k);var l=h("a",j), k=l[0],l=l[1];e.oApi._fnBindAction(k,{action:"previous"},n);e.oApi._fnBindAction(l,{action:"next"},n);e.aanFeatures.p||(j.id=e.sTableId+"_paginate",k.id=e.sTableId+"_previous",l.id=e.sTableId+"_next",k.setAttribute("aria-controls",e.sTableId),l.setAttribute("aria-controls",e.sTableId))},fnUpdate:function(e){if(e.aanFeatures.p)for(var h=e.oClasses,j=e.aanFeatures.p,k,l=0,n=j.length;l'+k.sFirst+''+k.sPrevious+''+k.sNext+''+k.sLast+"");var t=h("a",j),k=t[0],l=t[1],r=t[2],t=t[3];e.oApi._fnBindAction(k,{action:"first"},n);e.oApi._fnBindAction(l,{action:"previous"},n);e.oApi._fnBindAction(r,{action:"next"},n);e.oApi._fnBindAction(t,{action:"last"},n);e.aanFeatures.p||(j.id=e.sTableId+"_paginate",k.id=e.sTableId+"_first",l.id=e.sTableId+"_previous",r.id=e.sTableId+"_next",t.id=e.sTableId+"_last")}, fnUpdate:function(e,o){if(e.aanFeatures.p){var m=j.ext.oPagination.iFullNumbersShowPages,k=Math.floor(m/2),l=Math.ceil(e.fnRecordsDisplay()/e._iDisplayLength),n=Math.ceil(e._iDisplayStart/e._iDisplayLength)+1,t="",r,B=e.oClasses,u,M=e.aanFeatures.p,L=function(h){e.oApi._fnBindAction(this,{page:h+r-1},function(h){e.oApi._fnPageChange(e,h.data.page);o(e);h.preventDefault()})};-1===e._iDisplayLength?n=k=r=1:l=l-k?(r=l-m+1,k=l):(r=n-Math.ceil(m/2)+1,k=r+m-1);for(m=r;m<=k;m++)t+= n!==m?''+e.fnFormatNumber(m)+"":''+e.fnFormatNumber(m)+"";m=0;for(k=M.length;mh?1:0},"string-desc":function(e,h){return eh?-1:0},"html-pre":function(e){return e.replace(/<.*?>/g,"").toLowerCase()},"html-asc":function(e,h){return eh?1:0},"html-desc":function(e,h){return e< h?1:e>h?-1:0},"date-pre":function(e){e=Date.parse(e);if(isNaN(e)||""===e)e=Date.parse("01/01/1970 00:00:00");return e},"date-asc":function(e,h){return e-h},"date-desc":function(e,h){return h-e},"numeric-pre":function(e){return"-"==e||""===e?0:1*e},"numeric-asc":function(e,h){return e-h},"numeric-desc":function(e,h){return h-e}});h.extend(j.ext.aTypes,[function(e){if("number"===typeof e)return"numeric";if("string"!==typeof e)return null;var h,j=!1;h=e.charAt(0);if(-1=="0123456789-".indexOf(h))return null; for(var k=1;k")?"html":null}]);h.fn.DataTable=j;h.fn.dataTable=j;h.fn.dataTableSettings=j.settings;h.fn.dataTableExt=j.ext};"function"===typeof define&&define.amd?define(["jquery"],L):jQuery&&!jQuery.fn.dataTable&& L(jQuery)})(window,document); PK!6Zcc6abilian/web/resources/fileapi/FileAPI.flash.camera.swfZWS R] ;f=>uo~aPJ+qcА)XHgȉq%y) }w. ̅Չ[a->Wیo8r4Cbq(qLnhv=nR{fs yȒ9*5T 7LzWAf𽶢ob>dΚ)높}` GՓ _reh6uP8gĈJo`T\^|۸zl 9/SV1(GPP7Z p:3 apD7`X aׯ_ e?:s1jdLٖrea lLYc=wR@ް'QCy<]¥',8720Sw*Y\)x u_w |"EH6h[-6@?PZ2t+ŒTAKbk3!U!π[֩wTd^sҙ;͜} ⡪['{vj֮G/pySs+hGO2D>ГH44Pk'bYd܂%_"yMAbH3;.R  ہUL֟RN۬Lk 1 VLb|!uUp k0|3Zz|Drq 2 5cO!1.p!3H?*`뎊6E8CUi,`Hy}icfV>;dvyC$Ai1_M) }DS(< |Wfc%I>I`\O[;aؘZam΀uÁ`jth%F;Lo\ Y_x+KFY]FtA+-h\%pl" s~>:Ccrkdmv9(hjwRf*>G_FG ٖ~*4Q1!ލ%ҝ0;tiز>nh_~ͧU>VMM4x/EүRr@.8Į|BW@,sh1[h=%SV'G:LR} Hxf(5| ;@ј9up9&GuCGUYP4Yr|SA\İ3Q88~a(X `R VbW,99 #t1]n?)^<.c jIEBz fpȑ߹iR28^Q>;-3IƮӤnNjlP5}r%0RIϞĥtJ3D1Hݡ;̐4 &AeCvG4*buvPK!@:bXX5abilian/web/resources/fileapi/FileAPI.flash.image.swfCWS  xڵW[S3F]em $.&l{r[QX[*UqRJU~oyk^T%UJ yS~> 7o1>|}#? i ˑsu| 8kzmy%W.U8/nm::[ѩTz,566~5++s2]sj%!FX ڶS( fxWzjtd Uuʆ;gj%4]jo^/v>lzq&u>B牕KL$N=t"siZN՜jaDMRyΧ]Em;_EmW^T'V1nճc/mce>>=db,=:є!3ݲ`r_ Y2VXS}M_K|s/2&NN1|ɈzL]z#fč.V%nTuױ+[&b۵KuD&`k%c_[9}Q* ]E-5ja+U1}Zxp_Q(,:wWʺ5n?ڢQ7'lGtn"Rp'[kZԺp #v/,/godo,t8\g ([Z J]m4Zf}IF/UwV+VU".Gz/3ScT~.vLidg{sKUܵ6xZX{7F, W]Q 5Un^mY #׫ϭ g04ԲjoCiɴGy E_/QXBQXWRBJ9U֨Na~+QäuHxщgBd"(bJ)O^1.q׌D.V':5r+!EQ/Ødhxwx`S(fqX5Q"[Qp' ɱ?{U)JD#z0Fe=H?{å_%ehX\"\h!rh[YBiec2n0=T>NDf0pa$z0'nvd;SY҃f@g^˦DB}(Jv`Ck,;.= &\W\ { 6;b ~YC wI"7'O$Y70S>̐溄ΕsnP}k]ݖf'&.a:Dے7QҰ;ѨHm fc}WiNrtn![Lҹtߗ;B?_Knv̵wn[lMivͰُ2Qc~ 6B,",:X'b1zع3qγ>v]d v]fWcW5Ϯ6ȆX bi6/؍9iSaJy{FLOO Ox+S70mU"LE@6GS[YGں[77VX}nOmmI޲k|Mx:e!$}ƙL~r4*1"Xd_3U^!ۂdUf_[,, *:9%!~~<#PK!W~~/abilian/web/resources/fileapi/FileAPI.flash.swfZWS=~] ;f=>uo~aPJ+qcА)XHgȉq%y) }w. ̅Չ[a->Wیo8r4Cbq(qLnhv=nR{fs yȒ9*5T 7LzWAf𽶢ob>dΚ)높}` GՓ _reh6uP8gĈJo`T\^|۸zl 9/SV1(GPP7Z p:3 apD7`X aׯ_ e?:s1jdLٖrea lLYc=wR@ް'QCy<]¥',8720Sw*Wޕ)/ZG )Oʽh桽ؚpXXۢSe>8D*Y27ẙVXV 1xuqz&7L Mm->kP舳f5JB`E&r@*HR%yϲuV\~(!P{v~Kx`5=a!q{/BG:tn^%vHc5$%GK|OtX"%S"C4{:xQxsIyr;6X58Ujtߒ$un,`F)4tCS~V`c$˗67Qg>\(XVc >SN ⑪ED5)NZ+Lmݥ5zOpU\^ٕ3x_4:iT^\r;8g-έS?/gS>©Y C#*-l,T+¦KYn#[|(]gg)vG$FW$9-ǚt7yOeu4w6onYtA!zoƮ+mky}D-PxLBhL7R {G Rd{+l\rP[ e0vCBk~`UD?x|5bpd7 c f2}YڣEi)PC=,q P3sZɝ\+' e qB7-w@*v=X_+ y#Tr_GԾD1I\o)TսI c034X#BhSXȪ*n&.Zŋ԰ o`3➃B*9%pU kjpO x?8V{[7Y) '.ǩCV~}Rr]T-MƮI+Pj;Hmd%Himi6'ۃD.Z$i t׊Gq%PVt|W|󑻳v{u|[!ivηGZ۸LN&'6;7q,PgD\jGɋ'"v%u,5ަW C.YTN[԰vŀ%@]9E0ڞ? FDs+!7BE rg   ĔaVՌj籝~svqu*MHvJQLH5KV3r`_Ih  K f7z[l0εwut*/r%81~{ c~ dԢ;"DPܑm[HptB͎h{:9?vr^La tK\sN"w_&槌T5Rpb\Q0Ȯ󑹴}rt XF?D].CkMaufPP݂=k:s*g+ #R:W6sHIg1D[VVQN#y 9{tDJ_wkדaljze~˻R^Q(U;d8Tޓƚ-Q"On஀7 d;uKWcTLr-\r;bHp8I/B$}L""!ЍC ` SP3Cz2 SO_UӼy>g(@a0e,է>V/R෵%Q^u7ʫ/q*ύM4#4|,D"9 H]۾b1g*N6ULKýY9LXƯGDfi^\%];Vˡˏl3 0nvlzf BONT](5,ӱ7 ǡn eY{AHI׊FfT}\TۿӐOr~:+NtM>*h"ʞglz IPx8;8YjjFN'IE" -RJ=X0oqjTWwo0|#5#SLg?Oˣg eUQkd|_05Y1Lmd,]92M!3@Ay%Ge8y2[Nwz_w|xo84ٙWO^G19A"}-ե̷s5?Ɯ1ٷ7rGcƔ6tBzpVڙ9X߱|LAH09H},q ;^d)#\5e7}T03l0Cr[+eH& W_@n 'B=VԀyF56*K$%ќ)-ˢ0+V743_OT"TMċ?i]6t0\q?ǻrd 1cP8+p!]/NG gv;JE~(&BDȓؠIQ>!KĂ9و4|re^iB02Ѐ0~@*2\1lK KHo('odJ:vsc=6b.+Ҫp)=:IfZWu.yN#'bgb7lӻ >ޝ8cҼjHk|$t]]-}nGnm`" ,`}Kcv~nDS Y:^J^ށ˅g늨.VkL cvIPx&Ɯ4yN]gqJlåc%ޯUkOy8牎S -PbCOj'I7?t\1e~JF H0H}6bW\9ӀL<}(,s+I_T_x g`gC䏉#8Ȧd\o(*iVgNXWh^K.l#@I6E+^?jaS"23T3/쇀&E! b!7xRٟs;\)7-ڠnum{2 T'ܠ^SJ(aD O6^w!hnyG. ovCس.>Z#5`!w[1|ɨ:&TIar- .\C;#+ޱ4ptUGkQ~x| b/\p ӚjKT;3: sȋ!!C=U4Q]kBx n\/w@bnTv|ਊt];fΥ_'!]ga`r'ؼ+09>fp?-)E"Ք&؇ Y9O;0Yi_Jt[^t|CX Jl*Ԟw590S B$9VS(Iř~= q0{5iu5i֜HHz94{ƍ~iFQq *"E7' bsӈ\+,li(B2iG(w ϟ3y0$FDY_M\ttdtYJ& Nos_݌Jzd p/Ryfdp9QKIFشI;QSĵZ;"G}՘ Yyw:RS'ugȩh#w(7Sm l rZ庫|~NW;U@<3pMDL J "Z #Ŀ$xk\#X(8/v\yK}U=(2i,QJ+ kgC^Myoύ@^Ad2r-i]ҿQ o~brv?~eliK'Â(蟸TĒ8rf_W.+Йf6>=[AFo/Zc&seY\i@HX1 dA*$&z=' AnF/AqsE M0<`fKДJ?}Duw6dT#bn| RnU.Zt!"SD\Y8[KD<\gARFׁ171 Nm^Ҷ,8P< bjn /_:vgض芫5Οa@4^-i`8]yTM퍮{6}_hʗ)`X3{t 4[:K`x{ ModY;$:CDj&K$&WBB3J$9д {53D k]<e +kx~ oa98XNZ}"18N"NǻnȼlN35A90cO=>ub?\$TUiwRsg5Twط7F moZז<"Yd P(g9Yt"HbE`oƺ&fz,{ n Ç}$oڽz, MG #)?w$>%> ]+(}"j4չ Lۡ@pGxiUј,(McRo֚uqÁ‡F69O!@EFEMC[\FgW=7߂Yg ޿e0UZ[fw/tlJ0k8 Zg pnVdK 0qhӠ? vN m_5@@ۛ_;F6Z%?oe0IyA?a c&U[îm)TϬ<8@٭Yhc}';1`t} HQSq㐖sQe- )9P*!ha7HwqB"?og#^yˊj8&qH G-K 9e;=t\X00Xn,rDK( Zʈ4LH&u0b6oB`F.)ԜϞnQϙ?Qտ0I-Aȷ-Hڢ @Go[:ll og4eioU#y0i{*esV2̰өI8SfA0f;Ӵp ҏ <0™:^e=HUYU%~emJm6!a#,^X+xdh͂WGd!xhя cm9`7ƢUhYNr!ڥ :o%N伛BQm l/6r uR51^GzNP*~.رapH8VטXa8 o±g7 9dl;)1`B8#t̩xC:fZmp3 ^pëĻ7ǦE=y9>ԭ3dNc:.$lib?Q ŊɞF~1A~2Fˉ?&*ڽ8a:^sRPz>&DyG6oCGO[5$GKn~I`n xyr 3|XʬirLne<\a q!F eZ"&ԦbD=a崰8qkMP.K67P&9'y;B/veJye8TJiWpQ]NaIZ|RJ֟%/p-oe+ʦx/iIQa1zΟ#)\p19n%y^,%"IaetN&T4RCلVh13G|yIicS,@%k#  7Ђzon::P qR۱t2U gwqU&6rKôMfK`f6q⦸kKr_/'m6L۲2e(7B,@ah' œS|%Ht#J| QSqRW"4G5-/fr6Aʱ@c4.]*AI1NЧ͜n:u3]$ޝ gq@Zy 9xiVPqC/u* ){b Xڗ/A2.`;V+^!_Xvxя3S e4fmgrM1XS1]<)7XQQ kX@&:$Mi)cDsdNθ~QZs0sxG 9͚yn'O:!;Dv{*iWUZg|D/Y32Uj`J,}߳OB= t$*eTBECG(7Mӧ_8shh.%x\e/G[&wɅ?Y=?=ѿ{%]EKSLbA7nUDL.[ktuZ%}v_H:o{vJS'Jb 6사u0-Cj, EM ܄tͨ$jdH4O6 L)y-[zfNUıT6}H%f<yd221tIi'+gzI,1#ë鐚6;KfJG`=_&LTVyL"Y>I6qnm#@#!bԾͿȓp jHvɾWlG80%ϙmAJ'΂kӝiq Z<AY;}<a-/SC βب)R=g%{?:IPt_h o= n gd9 QB9<2r@ c0l;] bg Pi*> 6)},k6@Y[iʋ,6)j[ thĺe|dC|>,ݵ(0SEtwG#n-̧ ]5Kץ2Z,VHg~  te!kbZ ]$Sg܌ i=zf7dܟ4hv| Ti~:{&b .1>Of yHޝ% /3/\4bJ ;y1q;fn0DE%?ВP^N4x8m5?,&|[T8KA4R}Pe/|$1fR c'W.O]>Ewɀϼ!4, \l&I]l}7.€tiBB\WusDAoVvХY:lϣH湭1v@mѤ];ޠ82(CFUd/a"];alue1ȀHIcA7˖;( =|'7҄@s)!%؋J ^pek Z?π2"ʼnG(AL`>єbR+(q-6^],*=n&3~)We);U'; gA)GQY>\XnݨgC.Rݕ2rlOZg6;dʺGZ(V_' *.650@+&]V <=BBeʯ|BۗF(T+E 6A=B匓,9+,Nq,,4(+Yx鏅աmX6q捚T1pvAS|CN!~&'X6sJ^U翪~?VnV:w\?f^]u?~ kXn}@ΔO kDXJC;R9kBEB!u5Qّ:Ι) [Q#ZTs)\ݦ`UbЉ^sT;͢~Ʈ xJ{B1{9Y{\(IGR+8Z7$8-.o[RfkUYsy:."VDnsrm?gC9?#Qz \+UqXeڿ:a3]V|y̩zg>i,roi: p GdPI5&}ڂ>9D"yC29S[ _ o 9~nˑkxR=7}" ۋ<\(U]\"GdL/:_Bw?}s7L02U.hkTt'oܬ.%( i%FKG,z2By冶a.(Bxqyq@m%A̪mJ|V %'.R#8kP7ͨ l-Ei30u7WU)V\w~8>}Ϻ"/T۩znX'w",pBz4l<~!P?,u9;̣?qlÐ -j~sB88url_ݎiȟrE4wXŻ a.D&V/64'z R HrF]v%y$i=jޞ*u?')?j} /|\*y)zC%5׊coPܶa:2K_HfkUJ7:fg\xoDM^"K 1?}^ fD7QA=$@ޥS5I00=4dJsr ?];NN.c6\5'ķ֮ӥ91D);y'ۗAfeEgVu/^./+y _CC ,$Qb_.o{S!ib)- %qkLI(e}yP@N  \1 ]u3f_K%kiQ`1 )&_# = &bLч8wS2r%o.kyt!iϩ{F#Fz$d"7.8Nh*=Yc|7ռZcu>wv/8KH 讨%\͜)swh,{LK{gRvQYJ;Ӽ? 4dJhZTu[{!QM3KVxm8AkЅ豓Eo.-^h;,S2G0i($tm ޡi] o_ oa_DDCry&UJ/s$舧/Z^+R7Q fH1zw2,UZl߅k~=|3k/G*mkFx{d#s\8VI{h6E^8eĢw)6uLOJJ? e2EW?_xPt tSDbV(̘:I\m&#! bH37c(VK5h)ddߕjOWZUI7e|)ڑzqV`1[R*8=Gԧ.Yg<u{G'ik6UΆmw9620X閥o"drٯa=Ǿ3dShYܦ rDU#g}#v$kLӸ -TM|b̊IRw"l SH63Z絙4*g1x!alAzγ & Ͼ4R2<,٥0[Ԅ JW^aS9e&鶅XБ5@R lD|M`.eIEk 4C*t- ijyIЉrdUy|~l' z_ѰdȤgzȡoLÝXB{;ف2\? ^"T~ڄ[ڭ"&+t-j<=$GaVEj^EhC~ԡ ;hY i/TŇU/2=p/0$֣' o|pBlBzĻB^2;qZt5tb[N5;SI{xS-3;l L%q>Rs67 |~$)U+SwY#5_#q-{p SP<]=3&z]='}TpPPuy#1K4QjF(f_7lBff8_U[I6+RJAlerdP#>E*3Tժkrѓr4pj[D!!Nl:>Ru]1:!Sgk~hch#H$%VB, `e?TzK p־h"St3^k6ޟ'?jtk{+sHxU!³Z9r󞴵eg|୩M'GWyլf 3V;55Х"gٰ$&rQ/SB}kxNl4+XY# &酤b%no_:azUtwssEN,~aG >YPvkie8^%%mUގ7B ~  hJA+a誹|PgF3S`G3_ " >4 WӤX6l134^ynV^p*B9e{=&`cLPuEYZQC/0!W?9V=-N_YnB'Mm88Eka~ٌo\Nr\v?4ӥimDJ *˫frJXxVTKs-a5Zpu%L"X:12lq9GV+(r3;4pY;}*O2$=9`3y`W+z"ӣ/9n<1w¢M=j tGh! R}P.%MGjleMkz'бX'C_K+u3労B4a7$លa-&s Cv\iP80RN W}iimnfqM&y"@ёg_POK*3Xb 9e"qLWS\N0je"Le7dϯzl2?D/[4J^3õ}Z΋D\:UKӉ\|C|y_JzaR}'dkq2gd+EʵIfGlHm!2+4Zs*Ty #¥IB ˏUﺆS1i~+ ὅ7Zyh@(}_[L2YaY!7a }X{)@7E)+┅[< ɐJKȰ" ۗ;~{iuZ o0%@9Fw-]ͮS)8xI~)qL-ISEJY%KڑhD~Cc!wU_b .k-{2S%Mps#?h*4S8'0L~qk9024vVON%p"(.H73ي8lH%ǢY}/t9L`m^޲Z7XZ2"&}aZM(mTv/0F`&qgHl$oMKJqѳ^/l{Q}>c̋鷇H L14r t*mh\JGFFrT+qu_!yާTB{&3S &mĩ ~./Mjni ݈A>Dd5D<]PDbN̅^ɏ?=qXlB,fW;f5 ds@,Bǿ%E)E};̤_=ύVWҬH.n"S nF0dQbOFdp*g!;<-^<􊝨ş7MVy)ɸՏO%y@5](z <.[h*܆zPP#"BHp\ GN`iNzkLPǫSzY1*%J97 .sN?ֵǹ5WU7ϼt^h&넨?FXtDN75"@5B?2? ϮJp̄&Mr ȥ)"fsYquT::!&'=YԖYlH?TjyRu׈"b}J &ZMFGG $E]!гg<=S3^.%I\*Nkx;a @^,XQyD'Ūk[z>5mlXU Z1òյǟPELCt΄tZvR{:O%if_2"&?A;+ f}jFT +~e]x?XT[xBMijdȸ9g {iT n m8*JDU\ ;Hlaj.⾋{'q GV D]CaZ7eT=+sSiBU9TULCh㡬c=1:`Q%IM(64jVPDWuZr5H8aXk`Ii A)4an|"3T*QϽ~8yq j˘5:\r~yWFVf %K ~x:m#pE|BB!䜾e27McY􁾽N;F?͎ZuYR^=7 ]45g]eHh,UɢBJjgx>Ijʽl;8Qծ8KjF~`6 b"vO7^3SO7p D8[GB&CtǑFD!95|-SWrO0WAG!>a9UP/uI$W$󢔍 +qy^34 f쌊mقoiVPq0Gڙ&=|0n[霧§sq`㖶gP&E/Oi?`.M.52 \n§ۗZvq'(?ǡ?6G6 e{oL9=g"bd˽|GMoV8okTc'nR1vS'bqa;*ԝ&е/_ R@[&e bw3+q2A:0j ^3Ed% pqt^%<[sZ#_Ѻ3QI$xbw3*H>>㞼;w.F0&8jK.u@%׶x;\9.y_Mp{\+|\fۗ NX5uF&dbD`n5'qpbJm00t- -P.7Xkm5j5!9$u5xA !A\0y\2Bu#`m')^1EvlKvޑ4Uq_%+Rkpaט{<nhmyn>({㲼_ys;xlԦ ,D)y2!;,FnJ]'3!NjqW){C5R6S5AΝ݂vN=IfU/dՐ) s72J*0bGntG/</"<߫w!{(1ǃjwHo$}B< Hdu^> _M%UZ&p3]Cޫiԯ6MnYrk!;y&q5_ ` 1L]:o A"42[gL\7;p-_`ћ4G>\$ @fOAW o2AS2DK;ZK-?q CUi4Ƶ|Hc̓JN'/p]"N)RUY}H-`q^U=]l^KHvˋ ]a? ,LX;$f{=RP.eމ均NoDYKS[$4s bW21*r8MEPm0_'gC*\w@P cVQC;M,n໘|z'B͹M2R+L>0hFEQ @[Ln`;dgA0υW>4N3 [HIԶ4r y±kHPXޘC5aY#+OU)(jYyO 3=InIBC^KC:oRtnሚ5t'E8n߇q( 2+QؤMa:(?wxcRtDvlݳȑ^;DXD9vbr|&& NIpܖRSDmyөNexYdJ}X-TaD`5Mi)/YtuHv,)8|>hԯpwn@zhtZmƊ žYCÎoˋ'8yy|ሃܱQq  ]Py8"*׶*Tx?m94WxM)#oĚb|B#KGWQLqB3RoAfuD%~r~bAu(?Q5 7h*wm2R=v5~i>QA;P6~{kM”4(L9#,uM,ִF? } q e`؎w١Fx-juz+ ͘)n7ůЭ&t9)4YmԳbY3诳ҷfF~*&˞Txh}1#h†Nw?:⩯w{k/vI(l![ZNNti( CWOQ1pTAmJ阮 omni P'K=V-'JKq HdrMڊ WU(/{v6|_1/ *}Dhlt$N}ts"˷#daBGz1F;ظ,! J"2~w|e[p}f9kClqayT&B1W :&"aW PHё' 'a~hX V,?I'3zVw +hkcQFaGSeȨHԼ"OTW=DSݲ9H~Ӣ>r~uުbea>k'* sc}#жVk0'J-] $ Oc@.y#A#Ss-Y=} #+W:0j'zsQS$]ˁEvZkMY*uͭwh~xҚ=+mV=K&ˇb۸vJXڽ`9PgcrI$܋ECS86,qewRkMZ36PP'$OTP^oUn]: k4Qk7v5^vSQ0Z"P`tf9 {~Mµ }ff3Mc QG [-McP%{*l7܏ aNV5.>g̖\uv}4Bz00;B0ek0$Dla|}]?Ν݀U鰊7yTU 8oe kS3'[a~:i $? z2UBDY:Oךyx9[ phL4}/f%U\ _/۴c֔2_㽥sܓ}RePY銝tq)[=sr^+GgT>IyTT&)if8(8`55f$VH2;>3GLI.I"_(\g|msaNj~,1pFADL%}& l>*`[4\z摔ϫ6W8W5U8mCϾ>+TqI'n o72"JTWJ:<wHڟhalF sD|￀fꐠZO?2t&|yHvDr yld]r_r I}D_hgmR|-Gmz]ഝ:G~v"?qH #ϜU| *h! έ)fW2&*0l vIgzOӴE|!X=vz^(8nxG:oY|کň7T|i-8aЗvp*l_'6SƂbdy_r59)GT[Z~K{,F)6sa$ F7$7LHbq97 ٚ(z$&7s8o!Z*4&}OU&9cw'SGŴsoT%Y]\%ê6g޲gjLQ}V%:\Pxtf+MLZdīr6Ͱ>2ܼ(EwZ3(%7_~[G^Ln'æJxO<؀\+36$nI C79R1"S-]d'UB6}L,KoW(}7N%Eh;1.kAƖk4'c64 %Ὗ5S=ȂvN i#wܵIgYZ:0ẮvGl2-DKhm֛708eSFV&f uw5\8_rgaٰ8g p([qGuLJ#oFA#}a{!5B257`>1o"Fɫݒl8E%DV G@HNOべ"ZQؓIEm>?)xD 5y7M(6pl7=GzU{PeY:@|oɗ%Bӌ S{^M~| iIbA8̪8o("yYŒ1 ?rH[GQ+O#:LX)+IL\pʕAv6:-R*e4쇮[T$V,WEƒ:v}4E-vw!rzfNyc}+OcƂͮL&l=ʥVEƁ|]1aXi *7昭6^\UYRQ@$vBg 8(L?wnND= ' ItF{_ Z C]~u+R5Qdi ZלmHy6zs+& s XRDX {YnJΎZ:;w%g =6JZcxc@}Z?S,3[I? 2Lٵɓ5N2[7HnW7A;7(LJj2P.GȢ0HcD0WIfQthT!4my!eJtsG'"^(* `m#acҢl?/fJbwRA ~~d S'j #&L'U7لç0GXcBzZhl*SzKHG Vhu\.яohKfk!ѹ9eZ寇 ޅ5Zv[Ro4BSRSMk2[,**rk.4XlplҜ*ڔaA`hy +aq&$gVT́gpϮeF%XCA=4&j6$#Mn`R %`qwOQ&a[)>gy17PlEwm~ 꿤7*U#ٽ2 sI4fE7I"3"Ƽc&g3e*PQڕ|0P:kS%ߤ2N92xJq/dM7toճ:Qv4QYPN'1xl}ȽNFJ! T%=-֟MT<׎yHhP̜V_Ň󋍠"æ@2kDRC26C-x  pmMCj t! ^|Nq{,lX1ZK vh(ӎµlv$$_fv11~=/%Mt9Q8BEl0zYۤ^-e]+qK޾j}m M s}.s kN bJP)8VOJнR]DJ!׀)TWAPN=QZhgJlRFQʲhC[+=@(:f߲"~Ә`Y:]yfZ jkQ65?їԂ6pd_AK(}[O$wYarhl&͌h ?d8E5sFj=bY[JkUABt^+CS}y*ThaH:p@h< )g+07?vrGU zA7&)4NoB4Ta$D>E !+&sB܂M>av+ޔ_#ֵ[zzgQRЗ@$JU`bR4 ˅ܞ3tE JĠlY{T> YNbtjtLNk>@IVEPmO۶q}9$5uĬ:u&c$i~2oX]Ǻ:R/Gp2Sjgݭ Eݲ{*u? nCe"A0Aj>->xp Ws|M_(gCzT=@0tynr:cɘ&yr=2Q%IE遌]8tn:Pa*@'/l.{;`zfȪ3Uf݁8mP\#$6b-6:3wU1P~+0LTɞBÙ]{ߊAq%*^-RUfCi'TF*s)(tW+6D&S= ŅN뤚tmw4mO z^wf+.ԝѺLLmCi{ /Avʃf.YNb=7_?F^ݡ@Խ Ol[u f*%.SS 2^&[%[@fL]tR2rHTrbk<)!긧$3u ͮ[ïS!|4D&߈v"s1&^ 2XliHi5r5('HE/#?>@|f"-urܸ|eTawEnT:R/OaQS?\J!-}p0Sd0.9B^hf*Âiݷs]ͅl*8jJaݶ5l]BFyw&MMG/avмwf{Dy>9ړP)fTXt]_ń< x/b/Mo"*O+o @ZC C@` dDOұ=A|!p kl$@Ȧl&ZZ1SZ:g? mlwbjT4.z,*NwJ8C ޺/#TÐtUdWA>甘AƘ]&]fKgD ?8+b&["K{!#w<3~-%4*&Ѳ끁1[/kem}NS81~߿!Iݭ\'krP/$1ҎP@GWXj'U;8d:d(@#lesQ/ղf'l%shQ L5MQ3u  xģcdGH22z.mƐą-2h[ 硿H+kYȱGP(&lsCkk0ќ8_Zw2j MZ0l;bZ=ؽhXI󏰒Ϲ0L 6-kU8RR]>KD}15t_-ª &hi>xpK󝭪)PVhC:8yҫ{Ԍg^NUjWu?,WIb2@ܷ_т͵Ql퐾-m(t_2V"<@V xYݪk!YpTRT7aC=1u%Xn;⶘VA6(YǒFObjX3bAP0 wHxyaU,Z: MFO7/i81|MLm3d.dv:ɸ;)]jueܴr7߁HWG&l\4JyJU3a1]=?j*V=Rbw'Z_1|y/ 17,T|l"P (@|_zwN#D-g1q^yr|Rap\XevJܩ{ ;zadv.LNMSM^ǏcFH| ˱ ,a5>R9C}J| qˍ-s|1-XL7AW,eN0s#RD`ANN4GO)0s H&f*g9q3%Npdk9Ah&q/V{-ko2:P~_4PK!qKK.abilian/web/resources/fileapi/FileAPI.html5.js/*! FileAPI 2.0.11 - BSD | git://github.com/mailru/FileAPI.git * FileAPI — a set of javascript tools for working with files. Multiupload, drag'n'drop and chunked file upload. Images: crop, resize and auto orientation by EXIF. */ /* * JavaScript Canvas to Blob 2.0.5 * https://github.com/blueimp/JavaScript-Canvas-to-Blob * * Copyright 2012, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT * * Based on stackoverflow user Stoive's code snippet: * http://stackoverflow.com/q/4998908 */ /*jslint nomen: true, regexp: true */ /*global window, atob, Blob, ArrayBuffer, Uint8Array */ (function (window) { 'use strict'; var CanvasPrototype = window.HTMLCanvasElement && window.HTMLCanvasElement.prototype, hasBlobConstructor = window.Blob && (function () { try { return Boolean(new Blob()); } catch (e) { return false; } }()), hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && (function () { try { return new Blob([new Uint8Array(100)]).size === 100; } catch (e) { return false; } }()), BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob && window.ArrayBuffer && window.Uint8Array && function (dataURI) { var byteString, arrayBuffer, intArray, i, mimeString, bb; if (dataURI.split(',')[0].indexOf('base64') >= 0) { // Convert base64 to raw binary data held in a string: byteString = atob(dataURI.split(',')[1]); } else { // Convert base64/URLEncoded data component to raw binary data: byteString = decodeURIComponent(dataURI.split(',')[1]); } // Write the bytes of the string to an ArrayBuffer: arrayBuffer = new ArrayBuffer(byteString.length); intArray = new Uint8Array(arrayBuffer); for (i = 0; i < byteString.length; i += 1) { intArray[i] = byteString.charCodeAt(i); } // Separate out the mime component: mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // Write the ArrayBuffer (or ArrayBufferView) to a blob: if (hasBlobConstructor) { return new Blob( [hasArrayBufferViewSupport ? intArray : arrayBuffer], {type: mimeString} ); } bb = new BlobBuilder(); bb.append(arrayBuffer); return bb.getBlob(mimeString); }; if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) { if (CanvasPrototype.mozGetAsFile) { CanvasPrototype.toBlob = function (callback, type, quality) { if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) { callback(dataURLtoBlob(this.toDataURL(type, quality))); } else { callback(this.mozGetAsFile('blob', type)); } }; } else if (CanvasPrototype.toDataURL && dataURLtoBlob) { CanvasPrototype.toBlob = function (callback, type, quality) { callback(dataURLtoBlob(this.toDataURL(type, quality))); }; } } window.dataURLtoBlob = dataURLtoBlob; })(window); /*jslint evil: true */ /*global window, URL, webkitURL, ActiveXObject */ (function (window, undef){ 'use strict'; var gid = 1, noop = function (){}, document = window.document, doctype = document.doctype || {}, userAgent = window.navigator.userAgent, safari = /safari\//i.test(userAgent) && !/chrome\//i.test(userAgent), // https://github.com/blueimp/JavaScript-Load-Image/blob/master/load-image.js#L48 apiURL = (window.createObjectURL && window) || (window.URL && URL.revokeObjectURL && URL) || (window.webkitURL && webkitURL), Blob = window.Blob, File = window.File, FileReader = window.FileReader, FormData = window.FormData, XMLHttpRequest = window.XMLHttpRequest, jQuery = window.jQuery, html5 = !!(File && (FileReader && (window.Uint8Array || FormData || XMLHttpRequest.prototype.sendAsBinary))) && !(safari && /windows/i.test(userAgent)), // BugFix: https://github.com/mailru/FileAPI/issues/25 cors = html5 && ('withCredentials' in (new XMLHttpRequest)), chunked = html5 && !!Blob && !!(Blob.prototype.webkitSlice || Blob.prototype.mozSlice || Blob.prototype.slice), normalize = ('' + ''.normalize).indexOf('[native code]') > 0, // https://github.com/blueimp/JavaScript-Canvas-to-Blob dataURLtoBlob = window.dataURLtoBlob, _rimg = /img/i, _rcanvas = /canvas/i, _rimgcanvas = /img|canvas/i, _rinput = /input/i, _rdata = /^data:[^,]+,/, _toString = {}.toString, Math = window.Math, _SIZE_CONST = function (pow){ pow = new window.Number(Math.pow(1024, pow)); pow.from = function (sz){ return Math.round(sz * this); }; return pow; }, _elEvents = {}, // element event listeners _infoReader = [], // list of file info processors _readerEvents = 'abort progress error load loadend', _xhrPropsExport = 'status statusText readyState response responseXML responseText responseBody'.split(' '), currentTarget = 'currentTarget', // for minimize preventDefault = 'preventDefault', // and this too _isArray = function (ar) { return ar && ('length' in ar); }, /** * Iterate over a object or array */ _each = function (obj, fn, ctx){ if( obj ){ if( _isArray(obj) ){ for( var i = 0, n = obj.length; i < n; i++ ){ if( i in obj ){ fn.call(ctx, obj[i], i, obj); } } } else { for( var key in obj ){ if( obj.hasOwnProperty(key) ){ fn.call(ctx, obj[key], key, obj); } } } } }, /** * Merge the contents of two or more objects together into the first object */ _extend = function (dst){ var args = arguments, i = 1, _ext = function (val, key){ dst[key] = val; }; for( ; i < args.length; i++ ){ _each(args[i], _ext); } return dst; }, /** * Add event listener */ _on = function (el, type, fn){ if( el ){ var uid = api.uid(el); if( !_elEvents[uid] ){ _elEvents[uid] = {}; } var isFileReader = (FileReader && el) && (el instanceof FileReader); _each(type.split(/\s+/), function (type){ if( jQuery && !isFileReader){ jQuery.event.add(el, type, fn); } else { if( !_elEvents[uid][type] ){ _elEvents[uid][type] = []; } _elEvents[uid][type].push(fn); if( el.addEventListener ){ el.addEventListener(type, fn, false); } else if( el.attachEvent ){ el.attachEvent('on'+type, fn); } else { el['on'+type] = fn; } } }); } }, /** * Remove event listener */ _off = function (el, type, fn){ if( el ){ var uid = api.uid(el), events = _elEvents[uid] || {}; var isFileReader = (FileReader && el) && (el instanceof FileReader); _each(type.split(/\s+/), function (type){ if( jQuery && !isFileReader){ jQuery.event.remove(el, type, fn); } else { var fns = events[type] || [], i = fns.length; while( i-- ){ if( fns[i] === fn ){ fns.splice(i, 1); break; } } if( el.addEventListener ){ el.removeEventListener(type, fn, false); } else if( el.detachEvent ){ el.detachEvent('on'+type, fn); } else { el['on'+type] = null; } } }); } }, _one = function(el, type, fn){ _on(el, type, function _(evt){ _off(el, type, _); fn(evt); }); }, _fixEvent = function (evt){ if( !evt.target ){ evt.target = window.event && window.event.srcElement || document; } if( evt.target.nodeType === 3 ){ evt.target = evt.target.parentNode; } return evt; }, _supportInputAttr = function (attr){ var input = document.createElement('input'); input.setAttribute('type', "file"); return attr in input; }, /** * FileAPI (core object) */ api = { version: '2.0.11', cors: false, html5: true, media: false, formData: true, multiPassResize: true, debug: false, pingUrl: false, multiFlash: false, flashAbortTimeout: 0, withCredentials: true, staticPath: './dist/', flashUrl: 0, // @default: './FileAPI.flash.swf' flashImageUrl: 0, // @default: './FileAPI.flash.image.swf' postNameConcat: function (name, idx){ return name + (idx != null ? '['+ idx +']' : ''); }, ext2mime: { jpg: 'image/jpeg' , tif: 'image/tiff' , txt: 'text/plain' }, // Fallback for flash accept: { 'image/*': 'art bm bmp dwg dxf cbr cbz fif fpx gif ico iefs jfif jpe jpeg jpg jps jut mcf nap nif pbm pcx pgm pict pm png pnm qif qtif ras rast rf rp svf tga tif tiff xbm xbm xpm xwd' , 'audio/*': 'm4a flac aac rm mpa wav wma ogg mp3 mp2 m3u mod amf dmf dsm far gdm imf it m15 med okt s3m stm sfx ult uni xm sid ac3 dts cue aif aiff wpl ape mac mpc mpp shn wv nsf spc gym adplug adx dsp adp ymf ast afc hps xs' , 'video/*': 'm4v 3gp nsv ts ty strm rm rmvb m3u ifo mov qt divx xvid bivx vob nrg img iso pva wmv asf asx ogm m2v avi bin dat dvr-ms mpg mpeg mp4 mkv avc vp3 svq3 nuv viv dv fli flv wpl' }, uploadRetry : 0, networkDownRetryTimeout : 5000, // milliseconds, don't flood when network is down chunkSize : 0, chunkUploadRetry : 0, chunkNetworkDownRetryTimeout : 2000, // milliseconds, don't flood when network is down KB: _SIZE_CONST(1), MB: _SIZE_CONST(2), GB: _SIZE_CONST(3), TB: _SIZE_CONST(4), EMPTY_PNG: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII=', expando: 'fileapi' + (new Date).getTime(), uid: function (obj){ return obj ? (obj[api.expando] = obj[api.expando] || api.uid()) : (++gid, api.expando + gid) ; }, log: function (){ if( api.debug && window.console && console.log ){ if( console.log.apply ){ console.log.apply(console, arguments); } else { console.log([].join.call(arguments, ' ')); } } }, /** * Create new image * * @param {String} [src] * @param {Function} [fn] 1. error -- boolean, 2. img -- Image element * @returns {HTMLElement} */ newImage: function (src, fn){ var img = document.createElement('img'); if( fn ){ api.event.one(img, 'error load', function (evt){ fn(evt.type == 'error', img); img = null; }); } img.src = src; return img; }, /** * Get XHR * @returns {XMLHttpRequest} */ getXHR: function (){ var xhr; if( XMLHttpRequest ){ xhr = new XMLHttpRequest; } else if( window.ActiveXObject ){ try { xhr = new ActiveXObject('MSXML2.XMLHttp.3.0'); } catch (e) { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } } return xhr; }, isArray: _isArray, support: { dnd: cors && ('ondrop' in document.createElement('div')), cors: cors, html5: html5, chunked: chunked, dataURI: true, accept: _supportInputAttr('accept'), multiple: _supportInputAttr('multiple') }, event: { on: _on , off: _off , one: _one , fix: _fixEvent }, throttle: function(fn, delay) { var id, args; return function _throttle(){ args = arguments; if( !id ){ fn.apply(window, args); id = setTimeout(function (){ id = 0; fn.apply(window, args); }, delay); } }; }, F: function (){}, parseJSON: function (str){ var json; if( window.JSON && JSON.parse ){ json = JSON.parse(str); } else { json = (new Function('return ('+str.replace(/([\r\n])/g, '\\$1')+');'))(); } return json; }, trim: function (str){ str = String(str); return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); }, /** * Simple Defer * @return {Object} */ defer: function (){ var list = [] , result , error , defer = { resolve: function (err, res){ defer.resolve = noop; error = err || false; result = res; while( res = list.shift() ){ res(error, result); } }, then: function (fn){ if( error !== undef ){ fn(error, result); } else { list.push(fn); } } }; return defer; }, queue: function (fn){ var _idx = 0 , _length = 0 , _fail = false , _end = false , queue = { inc: function (){ _length++; }, next: function (){ _idx++; setTimeout(queue.check, 0); }, check: function (){ (_idx >= _length) && !_fail && queue.end(); }, isFail: function (){ return _fail; }, fail: function (){ !_fail && fn(_fail = true); }, end: function (){ if( !_end ){ _end = true; fn(); } } } ; return queue; }, /** * For each object * * @param {Object|Array} obj * @param {Function} fn * @param {*} [ctx] */ each: _each, /** * Async for * @param {Array} array * @param {Function} callback */ afor: function (array, callback){ var i = 0, n = array.length; if( _isArray(array) && n-- ){ (function _next(){ callback(n != i && _next, array[i], i++); })(); } else { callback(false); } }, /** * Merge the contents of two or more objects together into the first object * * @param {Object} dst * @return {Object} */ extend: _extend, /** * Is file? * @param {File} file * @return {Boolean} */ isFile: function (file){ return _toString.call(file) === '[object File]'; }, /** * Is blob? * @param {Blob} blob * @returns {Boolean} */ isBlob: function (blob) { return this.isFile(blob) || (_toString.call(blob) === '[object Blob]'); }, /** * Is canvas element * * @param {HTMLElement} el * @return {Boolean} */ isCanvas: function (el){ return el && _rcanvas.test(el.nodeName); }, getFilesFilter: function (filter){ filter = typeof filter == 'string' ? filter : (filter.getAttribute && filter.getAttribute('accept') || ''); return filter ? new RegExp('('+ filter.replace(/\./g, '\\.').replace(/,/g, '|') +')$', 'i') : /./; }, /** * Read as DataURL * * @param {File|Element} file * @param {Function} fn */ readAsDataURL: function (file, fn){ if( api.isCanvas(file) ){ _emit(file, fn, 'load', api.toDataURL(file)); } else { _readAs(file, fn, 'DataURL'); } }, /** * Read as Binary string * * @param {File} file * @param {Function} fn */ readAsBinaryString: function (file, fn){ if( _hasSupportReadAs('BinaryString') ){ _readAs(file, fn, 'BinaryString'); } else { // Hello IE10! _readAs(file, function (evt){ if( evt.type == 'load' ){ try { // dataURL -> binaryString evt.result = api.toBinaryString(evt.result); } catch (e){ evt.type = 'error'; evt.message = e.toString(); } } fn(evt); }, 'DataURL'); } }, /** * Read as ArrayBuffer * * @param {File} file * @param {Function} fn */ readAsArrayBuffer: function(file, fn){ _readAs(file, fn, 'ArrayBuffer'); }, /** * Read as text * * @param {File} file * @param {String} encoding * @param {Function} [fn] */ readAsText: function(file, encoding, fn){ if( !fn ){ fn = encoding; encoding = 'utf-8'; } _readAs(file, fn, 'Text', encoding); }, /** * Convert image or canvas to DataURL * * @param {Element} el Image or Canvas element * @param {String} [type] mime-type * @return {String} */ toDataURL: function (el, type){ if( typeof el == 'string' ){ return el; } else if( el.toDataURL ){ return el.toDataURL(type || 'image/png'); } }, /** * Canvert string, image or canvas to binary string * * @param {String|Element} val * @return {String} */ toBinaryString: function (val){ return window.atob(api.toDataURL(val).replace(_rdata, '')); }, /** * Read file or DataURL as ImageElement * * @param {File|String} file * @param {Function} fn * @param {Boolean} [progress] */ readAsImage: function (file, fn, progress){ if( api.isFile(file) ){ if( apiURL ){ /** @namespace apiURL.createObjectURL */ var data = apiURL.createObjectURL(file); if( data === undef ){ _emit(file, fn, 'error'); } else { api.readAsImage(data, fn, progress); } } else { api.readAsDataURL(file, function (evt){ if( evt.type == 'load' ){ api.readAsImage(evt.result, fn, progress); } else if( progress || evt.type == 'error' ){ _emit(file, fn, evt, null, { loaded: evt.loaded, total: evt.total }); } }); } } else if( api.isCanvas(file) ){ _emit(file, fn, 'load', file); } else if( _rimg.test(file.nodeName) ){ if( file.complete ){ _emit(file, fn, 'load', file); } else { var events = 'error abort load'; _one(file, events, function _fn(evt){ if( evt.type == 'load' && apiURL ){ /** @namespace apiURL.revokeObjectURL */ apiURL.revokeObjectURL(file.src); } _off(file, events, _fn); _emit(file, fn, evt, file); }); } } else if( file.iframe ){ _emit(file, fn, { type: 'error' }); } else { // Created image var img = api.newImage(file.dataURL || file); api.readAsImage(img, fn, progress); } }, /** * Make file by name * * @param {String} name * @return {Array} */ checkFileObj: function (name){ var file = {}, accept = api.accept; if( typeof name == 'object' ){ file = name; } else { file.name = (name + '').split(/\\|\//g).pop(); } if( file.type == null ){ file.type = file.name.split('.').pop(); } _each(accept, function (ext, type){ ext = new RegExp(ext.replace(/\s/g, '|'), 'i'); if( ext.test(file.type) || api.ext2mime[file.type] ){ file.type = api.ext2mime[file.type] || (type.split('/')[0] +'/'+ file.type); } }); return file; }, /** * Get drop files * * @param {Event} evt * @param {Function} callback */ getDropFiles: function (evt, callback){ var files = [] , all = [] , items , dataTransfer = _getDataTransfer(evt) , transFiles = dataTransfer.files , transItems = dataTransfer.items , entrySupport = _isArray(transItems) && transItems[0] && _getAsEntry(transItems[0]) , queue = api.queue(function (){ callback(files, all); }) ; if( entrySupport ){ if( normalize && transFiles ){ var i = transFiles.length , file , entry ; items = new Array(i); while( i-- ){ file = transFiles[i]; try { entry = _getAsEntry(transItems[i]); } catch( err ){ api.log('[err] getDropFiles: ', err); entry = null; } if( _isEntry(entry) ){ // OSX filesystems use Unicode Normalization Form D (NFD), // and entry.file(…) can't read the files with the same names if( entry.isDirectory || (entry.isFile && file.name == file.name.normalize('NFC')) ){ items[i] = entry; } else { items[i] = file; } } else { items[i] = file; } } } else { items = transItems; } } else { items = transFiles; } _each(items || [], function (item){ queue.inc(); try { if( entrySupport && _isEntry(item) ){ _readEntryAsFiles(item, function (err, entryFiles, allEntries){ if( err ){ api.log('[err] getDropFiles:', err); } else { files.push.apply(files, entryFiles); } all.push.apply(all, allEntries); queue.next(); }); } else { _isRegularFile(item, function (yes, err){ if( yes ){ files.push(item); } else { item.error = err; } all.push(item); queue.next(); }); } } catch( err ){ queue.next(); api.log('[err] getDropFiles: ', err); } }); queue.check(); }, /** * Get file list * * @param {HTMLInputElement|Event} input * @param {String|Function} [filter] * @param {Function} [callback] * @return {Array|Null} */ getFiles: function (input, filter, callback){ var files = []; if( callback ){ api.filterFiles(api.getFiles(input), filter, callback); return null; } if( input.jquery ){ // jQuery object input.each(function (){ files = files.concat(api.getFiles(this)); }); input = files; files = []; } if( typeof filter == 'string' ){ filter = api.getFilesFilter(filter); } if( input.originalEvent ){ // jQuery event input = _fixEvent(input.originalEvent); } else if( input.srcElement ){ // IE Event input = _fixEvent(input); } if( input.dataTransfer ){ // Drag'n'Drop input = input.dataTransfer; } else if( input.target ){ // Event input = input.target; } if( input.files ){ // Input[type="file"] files = input.files; if( !html5 ){ // Partial support for file api files[0].blob = input; files[0].iframe = true; } } else if( !html5 && isInputFile(input) ){ if( api.trim(input.value) ){ files = [api.checkFileObj(input.value)]; files[0].blob = input; files[0].iframe = true; } } else if( _isArray(input) ){ files = input; } return api.filter(files, function (file){ return !filter || filter.test(file.name); }); }, /** * Get total file size * @param {Array} files * @return {Number} */ getTotalSize: function (files){ var size = 0, i = files && files.length; while( i-- ){ size += files[i].size; } return size; }, /** * Get image information * * @param {File} file * @param {Function} fn */ getInfo: function (file, fn){ var info = {}, readers = _infoReader.concat(); if( api.isFile(file) ){ (function _next(){ var reader = readers.shift(); if( reader ){ if( reader.test(file.type) ){ reader(file, function (err, res){ if( err ){ fn(err); } else { _extend(info, res); _next(); } }); } else { _next(); } } else { fn(false, info); } })(); } else { fn('not_support_info', info); } }, /** * Add information reader * * @param {RegExp} mime * @param {Function} fn */ addInfoReader: function (mime, fn){ fn.test = function (type){ return mime.test(type); }; _infoReader.push(fn); }, /** * Filter of array * * @param {Array} input * @param {Function} fn * @return {Array} */ filter: function (input, fn){ var result = [], i = 0, n = input.length, val; for( ; i < n; i++ ){ if( i in input ){ val = input[i]; if( fn.call(val, val, i, input) ){ result.push(val); } } } return result; }, /** * Filter files * * @param {Array} files * @param {Function} eachFn * @param {Function} resultFn */ filterFiles: function (files, eachFn, resultFn){ if( files.length ){ // HTML5 or Flash var queue = files.concat(), file, result = [], deleted = []; (function _next(){ if( queue.length ){ file = queue.shift(); api.getInfo(file, function (err, info){ (eachFn(file, err ? false : info) ? result : deleted).push(file); _next(); }); } else { resultFn(result, deleted); } })(); } else { resultFn([], files); } }, upload: function (options){ options = _extend({ jsonp: 'callback' , prepare: api.F , beforeupload: api.F , upload: api.F , fileupload: api.F , fileprogress: api.F , filecomplete: api.F , progress: api.F , complete: api.F , pause: api.F , imageOriginal: true , chunkSize: api.chunkSize , chunkUploadRetry: api.chunkUploadRetry , uploadRetry: api.uploadRetry }, options); if( options.imageAutoOrientation && !options.imageTransform ){ options.imageTransform = { rotate: 'auto' }; } var proxyXHR = new api.XHR(options) , dataArray = this._getFilesDataArray(options.files) , _this = this , _total = 0 , _loaded = 0 , _nextFile , _complete = false ; // calc total size _each(dataArray, function (data){ _total += data.size; }); // Array of files proxyXHR.files = []; _each(dataArray, function (data){ proxyXHR.files.push(data.file); }); // Set upload status props proxyXHR.total = _total; proxyXHR.loaded = 0; proxyXHR.filesLeft = dataArray.length; // emit "beforeupload" event options.beforeupload(proxyXHR, options); // Upload by file _nextFile = function (){ var data = dataArray.shift() , _file = data && data.file , _fileLoaded = false , _fileOptions = _simpleClone(options) ; proxyXHR.filesLeft = dataArray.length; if( _file && _file.name === api.expando ){ _file = null; api.log('[warn] FileAPI.upload() — called without files'); } if( ( proxyXHR.statusText != 'abort' || proxyXHR.current ) && data ){ // Mark active job _complete = false; // Set current upload file proxyXHR.currentFile = _file; // Prepare file options if (_file && options.prepare(_file, _fileOptions) === false) { _nextFile.call(_this); return; } _fileOptions.file = _file; _this._getFormData(_fileOptions, data, function (form){ if( !_loaded ){ // emit "upload" event options.upload(proxyXHR, options); } var xhr = new api.XHR(_extend({}, _fileOptions, { upload: _file ? function (){ // emit "fileupload" event options.fileupload(_file, xhr, _fileOptions); } : noop, progress: _file ? function (evt){ if( !_fileLoaded ){ // For ignore the double calls. _fileLoaded = (evt.loaded === evt.total); // emit "fileprogress" event options.fileprogress({ type: 'progress' , total: data.total = evt.total , loaded: data.loaded = evt.loaded }, _file, xhr, _fileOptions); // emit "progress" event options.progress({ type: 'progress' , total: _total , loaded: proxyXHR.loaded = (_loaded + data.size * (evt.loaded/evt.total)) || 0 }, _file, xhr, _fileOptions); } } : noop, complete: function (err){ _each(_xhrPropsExport, function (name){ proxyXHR[name] = xhr[name]; }); if( _file ){ data.total = (data.total || data.size); data.loaded = data.total; if( !err ) { // emulate 100% "progress" this.progress(data); // fixed throttle event _fileLoaded = true; // bytes loaded _loaded += data.size; // data.size != data.total, it's desirable fix this proxyXHR.loaded = _loaded; } // emit "filecomplete" event options.filecomplete(err, xhr, _file, _fileOptions); } // upload next file setTimeout(function () {_nextFile.call(_this);}, 0); } })); // xhr // ... proxyXHR.abort = function (current){ if (!current) { dataArray.length = 0; } this.current = current; xhr.abort(); }; // Start upload xhr.send(form); }); } else { var successful = proxyXHR.status == 200 || proxyXHR.status == 201 || proxyXHR.status == 204; options.complete(successful ? false : (proxyXHR.statusText || 'error'), proxyXHR, options); // Mark done state _complete = true; } }; // Next tick setTimeout(_nextFile, 0); // Append more files to the existing request // first - add them to the queue head/tail proxyXHR.append = function (files, first) { files = api._getFilesDataArray([].concat(files)); _each(files, function (data) { _total += data.size; proxyXHR.files.push(data.file); if (first) { dataArray.unshift(data); } else { dataArray.push(data); } }); proxyXHR.statusText = ""; if( _complete ){ _nextFile.call(_this); } }; // Removes file from queue by file reference and returns it proxyXHR.remove = function (file) { var i = dataArray.length, _file; while( i-- ){ if( dataArray[i].file == file ){ _file = dataArray.splice(i, 1); _total -= _file.size; } } return _file; }; return proxyXHR; }, _getFilesDataArray: function (data){ var files = [], oFiles = {}; if( isInputFile(data) ){ var tmp = api.getFiles(data); oFiles[data.name || 'file'] = data.getAttribute('multiple') !== null ? tmp : tmp[0]; } else if( _isArray(data) && isInputFile(data[0]) ){ _each(data, function (input){ oFiles[input.name || 'file'] = api.getFiles(input); }); } else { oFiles = data; } _each(oFiles, function add(file, name){ if( _isArray(file) ){ _each(file, function (file){ add(file, name); }); } else if( file && (file.name || file.image) ){ files.push({ name: name , file: file , size: file.size , total: file.size , loaded: 0 }); } }); if( !files.length ){ // Create fake `file` object files.push({ file: { name: api.expando } }); } return files; }, _getFormData: function (options, data, fn){ var file = data.file , name = data.name , filename = file.name , filetype = file.type , trans = api.support.transform && options.imageTransform , Form = new api.Form , queue = api.queue(function (){ fn(Form); }) , isOrignTrans = trans && _isOriginTransform(trans) , postNameConcat = api.postNameConcat ; // Append data _each(options.data, function add(val, name){ if( typeof val == 'object' ){ _each(val, function (v, i){ add(v, postNameConcat(name, i)); }); } else { Form.append(name, val); } }); (function _addFile(file/**Object*/){ if( file.image ){ // This is a FileAPI.Image queue.inc(); file.toData(function (err, image){ // @todo: error filename = filename || (new Date).getTime()+'.png'; _addFile(image); queue.next(); }); } else if( api.Image && trans && (/^image/.test(file.type) || _rimgcanvas.test(file.nodeName)) ){ queue.inc(); if( isOrignTrans ){ // Convert to array for transform function trans = [trans]; } api.Image.transform(file, trans, options.imageAutoOrientation, function (err, images){ if( isOrignTrans && !err ){ if( !dataURLtoBlob && !api.flashEngine ){ // Canvas.toBlob or Flash not supported, use multipart Form.multipart = true; } Form.append(name, images[0], filename, trans[0].type || filetype); } else { var addOrigin = 0; if( !err ){ _each(images, function (image, idx){ if( !dataURLtoBlob && !api.flashEngine ){ Form.multipart = true; } if( !trans[idx].postName ){ addOrigin = 1; } Form.append(trans[idx].postName || postNameConcat(name, idx), image, filename, trans[idx].type || filetype); }); } if( err || options.imageOriginal ){ Form.append(postNameConcat(name, (addOrigin ? 'original' : null)), file, filename, filetype); } } queue.next(); }); } else if( filename !== api.expando ){ Form.append(name, file, filename); } })(file); queue.check(); }, reset: function (inp, notRemove){ var parent, clone; if( jQuery ){ clone = jQuery(inp).clone(true).insertBefore(inp).val('')[0]; if( !notRemove ){ jQuery(inp).remove(); } } else { parent = inp.parentNode; clone = parent.insertBefore(inp.cloneNode(true), inp); clone.value = ''; if( !notRemove ){ parent.removeChild(inp); } _each(_elEvents[api.uid(inp)], function (fns, type){ _each(fns, function (fn){ _off(inp, type, fn); _on(clone, type, fn); }); }); } return clone; }, /** * Load remote file * * @param {String} url * @param {Function} fn * @return {XMLHttpRequest} */ load: function (url, fn){ var xhr = api.getXHR(); if( xhr ){ xhr.open('GET', url, true); if( xhr.overrideMimeType ){ xhr.overrideMimeType('text/plain; charset=x-user-defined'); } _on(xhr, 'progress', function (/**Event*/evt){ /** @namespace evt.lengthComputable */ if( evt.lengthComputable ){ fn({ type: evt.type, loaded: evt.loaded, total: evt.total }, xhr); } }); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 ){ xhr.onreadystatechange = null; if( xhr.status == 200 ){ url = url.split('/'); /** @namespace xhr.responseBody */ var file = { name: url[url.length-1] , size: xhr.getResponseHeader('Content-Length') , type: xhr.getResponseHeader('Content-Type') }; file.dataURL = 'data:'+file.type+';base64,' + api.encode64(xhr.responseBody || xhr.responseText); fn({ type: 'load', result: file }, xhr); } else { fn({ type: 'error' }, xhr); } } }; xhr.send(null); } else { fn({ type: 'error' }); } return xhr; }, encode64: function (str){ var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', outStr = '', i = 0; if( typeof str !== 'string' ){ str = String(str); } while( i < str.length ){ //all three "& 0xff" added below are there to fix a known bug //with bytes returned by xhr.responseText var byte1 = str.charCodeAt(i++) & 0xff , byte2 = str.charCodeAt(i++) & 0xff , byte3 = str.charCodeAt(i++) & 0xff , enc1 = byte1 >> 2 , enc2 = ((byte1 & 3) << 4) | (byte2 >> 4) , enc3, enc4 ; if( isNaN(byte2) ){ enc3 = enc4 = 64; } else { enc3 = ((byte2 & 15) << 2) | (byte3 >> 6); enc4 = isNaN(byte3) ? 64 : byte3 & 63; } outStr += b64.charAt(enc1) + b64.charAt(enc2) + b64.charAt(enc3) + b64.charAt(enc4); } return outStr; } } // api ; function _emit(target, fn, name, res, ext){ var evt = { type: name.type || name , target: target , result: res }; _extend(evt, ext); fn(evt); } function _hasSupportReadAs(method){ return FileReader && !!FileReader.prototype['readAs' + method]; } function _readAs(file, fn, method, encoding){ if( api.isBlob(file) && _hasSupportReadAs(method) ){ var Reader = new FileReader; // Add event listener _on(Reader, _readerEvents, function _fn(evt){ var type = evt.type; if( type == 'progress' ){ _emit(file, fn, evt, evt.target.result, { loaded: evt.loaded, total: evt.total }); } else if( type == 'loadend' ){ _off(Reader, _readerEvents, _fn); Reader = null; } else { _emit(file, fn, evt, evt.target.result); } }); try { // ReadAs ... if( encoding ){ Reader['readAs' + method](file, encoding); } else { Reader['readAs' + method](file); } } catch (err){ _emit(file, fn, 'error', undef, { error: err.toString() }); } } else { _emit(file, fn, 'error', undef, { error: 'filreader_not_support_' + method }); } } function _isRegularFile(file, callback){ // http://stackoverflow.com/questions/8856628/detecting-folders-directories-in-javascript-filelist-objects if( !file.type && (safari || ((file.size % 4096) === 0 && (file.size <= 102400))) ){ if( FileReader ){ try { var reader = new FileReader(); _one(reader, _readerEvents, function (evt){ var isFile = evt.type != 'error'; if( isFile ){ reader.abort(); callback(isFile); } else { callback(false, reader.error); } }); reader.readAsDataURL(file); } catch( err ){ callback(false, err); } } else { callback(null, new Error('FileReader is not supported')); } } else { callback(true); } } function _isEntry(item){ return item && (item.isFile || item.isDirectory); } function _getAsEntry(item){ var entry; if( item.getAsEntry ){ entry = item.getAsEntry(); } else if( item.webkitGetAsEntry ){ entry = item.webkitGetAsEntry(); } return entry; } function _readEntryAsFiles(entry, callback){ if( !entry ){ // error var err = new Error('invalid entry'); entry = new Object(entry); entry.error = err; callback(err.message, [], [entry]); } else if( entry.isFile ){ // Read as file entry.file(function (file){ // success file.fullPath = entry.fullPath; callback(false, [file], [file]); }, function (err){ // error entry.error = err; callback('FileError.code: ' + err.code, [], [entry]); }); } else if( entry.isDirectory ){ var reader = entry.createReader() , firstAttempt = true , files = [] , all = [entry] ; var onerror = function (err){ // error entry.error = err; callback('DirectoryError.code: ' + err.code, files, all); }; var ondone = function ondone(entries){ if( firstAttempt ){ firstAttempt = false; if( !entries.length ){ entry.error = new Error('directory is empty'); } } // success if( entries.length ){ api.afor(entries, function (next, entry){ _readEntryAsFiles(entry, function (err, entryFiles, allEntries){ if( !err ){ files = files.concat(entryFiles); } all = all.concat(allEntries); if( next ){ next(); } else { reader.readEntries(ondone, onerror); } }); }); } else { callback(false, files, all); } }; reader.readEntries(ondone, onerror); } else { _readEntryAsFiles(_getAsEntry(entry), callback); } } function _simpleClone(obj){ var copy = {}; _each(obj, function (val, key){ if( val && (typeof val === 'object') && (val.nodeType === void 0) ){ val = _extend({}, val); } copy[key] = val; }); return copy; } function isInputFile(el){ return _rinput.test(el && el.tagName); } function _getDataTransfer(evt){ return (evt.originalEvent || evt || '').dataTransfer || {}; } function _isOriginTransform(trans){ var key; for( key in trans ){ if( trans.hasOwnProperty(key) ){ if( !(trans[key] instanceof Object || key === 'overlay' || key === 'filter') ){ return true; } } } return false; } // Add default image info reader api.addInfoReader(/^image/, function (file/**File*/, callback/**Function*/){ if( !file.__dimensions ){ var defer = file.__dimensions = api.defer(); api.readAsImage(file, function (evt){ var img = evt.target; defer.resolve(evt.type == 'load' ? false : 'error', { width: img.width , height: img.height }); img.src = api.EMPTY_PNG; img = null; }); } file.__dimensions.then(callback); }); /** * Drag'n'Drop special event * * @param {HTMLElement} el * @param {Function} onHover * @param {Function} onDrop */ api.event.dnd = function (el, onHover, onDrop){ var _id, _type; if( !onDrop ){ onDrop = onHover; onHover = api.F; } if( FileReader ){ // Hover _on(el, 'dragenter dragleave dragover', onHover.ff = onHover.ff || function (evt){ var types = _getDataTransfer(evt).types , i = types && types.length , debounceTrigger = false ; while( i-- ){ if( ~types[i].indexOf('File') ){ evt[preventDefault](); if( _type !== evt.type ){ _type = evt.type; // Store current type of event if( _type != 'dragleave' ){ onHover.call(evt[currentTarget], true, evt); } debounceTrigger = true; } break; // exit from "while" } } if( debounceTrigger ){ clearTimeout(_id); _id = setTimeout(function (){ onHover.call(evt[currentTarget], _type != 'dragleave', evt); }, 50); } }); // Drop _on(el, 'drop', onDrop.ff = onDrop.ff || function (evt){ evt[preventDefault](); _type = 0; onHover.call(evt[currentTarget], false, evt); api.getDropFiles(evt, function (files, all){ onDrop.call(evt[currentTarget], files, all, evt); }); }); } else { api.log("Drag'n'Drop -- not supported"); } }; /** * Remove drag'n'drop * @param {HTMLElement} el * @param {Function} onHover * @param {Function} onDrop */ api.event.dnd.off = function (el, onHover, onDrop){ _off(el, 'dragenter dragleave dragover', onHover.ff); _off(el, 'drop', onDrop.ff); }; // Support jQuery if( jQuery && !jQuery.fn.dnd ){ jQuery.fn.dnd = function (onHover, onDrop){ return this.each(function (){ api.event.dnd(this, onHover, onDrop); }); }; jQuery.fn.offdnd = function (onHover, onDrop){ return this.each(function (){ api.event.dnd.off(this, onHover, onDrop); }); }; } // @export window.FileAPI = _extend(api, window.FileAPI); // Debug info api.log('FileAPI: ' + api.version); api.log('protocol: ' + window.location.protocol); api.log('doctype: [' + doctype.name + '] ' + doctype.publicId + ' ' + doctype.systemId); // @detect 'x-ua-compatible' _each(document.getElementsByTagName('meta'), function (meta){ if( /x-ua-compatible/i.test(meta.getAttribute('http-equiv')) ){ api.log('meta.http-equiv: ' + meta.getAttribute('content')); } }); // @configuration if( !api.flashUrl ){ api.flashUrl = api.staticPath + 'FileAPI.flash.swf'; } if( !api.flashImageUrl ){ api.flashImageUrl = api.staticPath + 'FileAPI.flash.image.swf'; } if( !api.flashWebcamUrl ){ api.flashWebcamUrl = api.staticPath + 'FileAPI.flash.camera.swf'; } })(window, void 0); /*global window, FileAPI, document */ (function (api, document, undef) { 'use strict'; var min = Math.min, round = Math.round, getCanvas = function () { return document.createElement('canvas'); }, support = false, exifOrientation = { 8: 270 , 3: 180 , 6: 90 , 7: 270 , 4: 180 , 5: 90 } ; try { support = getCanvas().toDataURL('image/png').indexOf('data:image/png') > -1; } catch (e){} function Image(file){ if( file instanceof Image ){ var img = new Image(file.file); api.extend(img.matrix, file.matrix); return img; } else if( !(this instanceof Image) ){ return new Image(file); } this.file = file; this.size = file.size || 100; this.matrix = { sx: 0, sy: 0, sw: 0, sh: 0, dx: 0, dy: 0, dw: 0, dh: 0, resize: 0, // min, max OR preview deg: 0, quality: 1, // jpeg quality filter: 0 }; } Image.prototype = { image: true, constructor: Image, set: function (attrs){ api.extend(this.matrix, attrs); return this; }, crop: function (x, y, w, h){ if( w === undef ){ w = x; h = y; x = y = 0; } return this.set({ sx: x, sy: y, sw: w, sh: h || w }); }, resize: function (w, h, strategy){ if( /min|max|height|width/.test(h) ){ strategy = h; h = w; } return this.set({ dw: w, dh: h || w, resize: strategy }); }, preview: function (w, h){ return this.resize(w, h || w, 'preview'); }, rotate: function (deg){ return this.set({ deg: deg }); }, filter: function (filter){ return this.set({ filter: filter }); }, overlay: function (images){ return this.set({ overlay: images }); }, clone: function (){ return new Image(this); }, _load: function (image, fn){ var self = this; if( /img|video/i.test(image.nodeName) ){ fn.call(self, null, image); } else { api.readAsImage(image, function (evt){ fn.call(self, evt.type != 'load', evt.result); }); } }, _apply: function (image, fn){ var canvas = getCanvas() , m = this.getMatrix(image) , ctx = canvas.getContext('2d') , width = image.videoWidth || image.width , height = image.videoHeight || image.height , deg = m.deg , dw = m.dw , dh = m.dh , w = width , h = height , filter = m.filter , copy // canvas copy , buffer = image , overlay = m.overlay , queue = api.queue(function (){ image.src = api.EMPTY_PNG; fn(false, canvas); }) , renderImageToCanvas = api.renderImageToCanvas ; // Normalize angle deg = deg - Math.floor(deg/360)*360; // For `renderImageToCanvas` image._type = this.file.type; while(m.multipass && min(w/dw, h/dh) > 2 ){ w = (w/2 + 0.5)|0; h = (h/2 + 0.5)|0; copy = getCanvas(); copy.width = w; copy.height = h; if( buffer !== image ){ renderImageToCanvas(copy, buffer, 0, 0, buffer.width, buffer.height, 0, 0, w, h); buffer = copy; } else { buffer = copy; renderImageToCanvas(buffer, image, m.sx, m.sy, m.sw, m.sh, 0, 0, w, h); m.sx = m.sy = m.sw = m.sh = 0; } } canvas.width = (deg % 180) ? dh : dw; canvas.height = (deg % 180) ? dw : dh; canvas.type = m.type; canvas.quality = m.quality; ctx.rotate(deg * Math.PI / 180); renderImageToCanvas(ctx.canvas, buffer , m.sx, m.sy , m.sw || buffer.width , m.sh || buffer.height , (deg == 180 || deg == 270 ? -dw : 0) , (deg == 90 || deg == 180 ? -dh : 0) , dw, dh ); dw = canvas.width; dh = canvas.height; // Apply overlay overlay && api.each([].concat(overlay), function (over){ queue.inc(); // preload var img = new window.Image, fn = function (){ var x = over.x|0 , y = over.y|0 , w = over.w || img.width , h = over.h || img.height , rel = over.rel ; // center | right | left x = (rel == 1 || rel == 4 || rel == 7) ? (dw - w + x)/2 : (rel == 2 || rel == 5 || rel == 8 ? dw - (w + x) : x); // center | bottom | top y = (rel == 3 || rel == 4 || rel == 5) ? (dh - h + y)/2 : (rel >= 6 ? dh - (h + y) : y); api.event.off(img, 'error load abort', fn); try { ctx.globalAlpha = over.opacity || 1; ctx.drawImage(img, x, y, w, h); } catch (er){} queue.next(); }; api.event.on(img, 'error load abort', fn); img.src = over.src; if( img.complete ){ fn(); } }); if( filter ){ queue.inc(); Image.applyFilter(canvas, filter, queue.next); } queue.check(); }, getMatrix: function (image){ var m = api.extend({}, this.matrix) , sw = m.sw = m.sw || image.videoWidth || image.naturalWidth || image.width , sh = m.sh = m.sh || image.videoHeight || image.naturalHeight || image.height , dw = m.dw = m.dw || sw , dh = m.dh = m.dh || sh , sf = sw/sh, df = dw/dh , strategy = m.resize ; if( strategy == 'preview' ){ if( dw != sw || dh != sh ){ // Make preview var w, h; if( df >= sf ){ w = sw; h = w / df; } else { h = sh; w = h * df; } if( w != sw || h != sh ){ m.sx = ~~((sw - w)/2); m.sy = ~~((sh - h)/2); sw = w; sh = h; } } } else if( strategy == 'height' ){ dw = dh * sf; } else if( strategy == 'width' ){ dh = dw / sf; } else if( strategy ){ if( !(sw > dw || sh > dh) ){ dw = sw; dh = sh; } else if( strategy == 'min' ){ dw = round(sf < df ? min(sw, dw) : dh*sf); dh = round(sf < df ? dw/sf : min(sh, dh)); } else { dw = round(sf >= df ? min(sw, dw) : dh*sf); dh = round(sf >= df ? dw/sf : min(sh, dh)); } } m.sw = sw; m.sh = sh; m.dw = dw; m.dh = dh; m.multipass = api.multiPassResize; return m; }, _trans: function (fn){ this._load(this.file, function (err, image){ if( err ){ fn(err); } else { try { this._apply(image, fn); } catch (err){ api.log('[err] FileAPI.Image.fn._apply:', err); fn(err); } } }); }, get: function (fn){ if( api.support.transform ){ var _this = this, matrix = _this.matrix; if( matrix.deg == 'auto' ){ api.getInfo(_this.file, function (err, info){ // rotate by exif orientation matrix.deg = exifOrientation[info && info.exif && info.exif.Orientation] || 0; _this._trans(fn); }); } else { _this._trans(fn); } } else { fn('not_support_transform'); } return this; }, toData: function (fn){ return this.get(fn); } }; Image.exifOrientation = exifOrientation; Image.transform = function (file, transform, autoOrientation, fn){ function _transform(err, img){ // img -- info object var images = {} , queue = api.queue(function (err){ fn(err, images); }) ; if( !err ){ api.each(transform, function (params, name){ if( !queue.isFail() ){ var ImgTrans = new Image(img.nodeType ? img : file), isFn = typeof params == 'function'; if( isFn ){ params(img, ImgTrans); } else if( params.width ){ ImgTrans[params.preview ? 'preview' : 'resize'](params.width, params.height, params.strategy); } else { if( params.maxWidth && (img.width > params.maxWidth || img.height > params.maxHeight) ){ ImgTrans.resize(params.maxWidth, params.maxHeight, 'max'); } } if( params.crop ){ var crop = params.crop; ImgTrans.crop(crop.x|0, crop.y|0, crop.w || crop.width, crop.h || crop.height); } if( params.rotate === undef && autoOrientation ){ params.rotate = 'auto'; } ImgTrans.set({ type: ImgTrans.matrix.type || params.type || file.type || 'image/png' }); if( !isFn ){ ImgTrans.set({ deg: params.rotate , overlay: params.overlay , filter: params.filter , quality: params.quality || 1 }); } queue.inc(); ImgTrans.toData(function (err, image){ if( err ){ queue.fail(); } else { images[name] = image; queue.next(); } }); } }); } else { queue.fail(); } } // @todo: Оло-ло, нужно рефакторить это место if( file.width ){ _transform(false, file); } else { api.getInfo(file, _transform); } }; // @const api.each(['TOP', 'CENTER', 'BOTTOM'], function (x, i){ api.each(['LEFT', 'CENTER', 'RIGHT'], function (y, j){ Image[x+'_'+y] = i*3 + j; Image[y+'_'+x] = i*3 + j; }); }); /** * Trabsform element to canvas * * @param {Image|HTMLVideoElement} el * @returns {Canvas} */ Image.toCanvas = function(el){ var canvas = document.createElement('canvas'); canvas.width = el.videoWidth || el.width; canvas.height = el.videoHeight || el.height; canvas.getContext('2d').drawImage(el, 0, 0); return canvas; }; /** * Create image from DataURL * @param {String} dataURL * @param {Object} size * @param {Function} callback */ Image.fromDataURL = function (dataURL, size, callback){ var img = api.newImage(dataURL); api.extend(img, size); callback(img); }; /** * Apply filter (caman.js) * * @param {Canvas|Image} canvas * @param {String|Function} filter * @param {Function} doneFn */ Image.applyFilter = function (canvas, filter, doneFn){ if( typeof filter == 'function' ){ filter(canvas, doneFn); } else if( window.Caman ){ // http://camanjs.com/guides/ window.Caman(canvas.tagName == 'IMG' ? Image.toCanvas(canvas) : canvas, function (){ if( typeof filter == 'string' ){ this[filter](); } else { api.each(filter, function (val, method){ this[method](val); }, this); } this.render(doneFn); }); } }; /** * For load-image-ios.js */ api.renderImageToCanvas = function (canvas, img, sx, sy, sw, sh, dx, dy, dw, dh){ try { return canvas.getContext('2d').drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh); } catch (ex) { api.log('renderImageToCanvas failed'); throw ex; } }; // @export api.support.canvas = api.support.transform = support; api.Image = Image; })(FileAPI, document); /* * JavaScript Load Image iOS scaling fixes 1.0.3 * https://github.com/blueimp/JavaScript-Load-Image * * Copyright 2013, Sebastian Tschan * https://blueimp.net * * iOS image scaling fixes based on * https://github.com/stomita/ios-imagefile-megapixel * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ /*jslint nomen: true, bitwise: true */ /*global FileAPI, window, document */ (function (factory) { 'use strict'; factory(FileAPI); }(function (loadImage) { 'use strict'; // Only apply fixes on the iOS platform: if (!window.navigator || !window.navigator.platform || !(/iP(hone|od|ad)/).test(window.navigator.platform)) { return; } var originalRenderMethod = loadImage.renderImageToCanvas; // Detects subsampling in JPEG images: loadImage.detectSubsampling = function (img) { var canvas, context; if (img.width * img.height > 1024 * 1024) { // only consider mexapixel images canvas = document.createElement('canvas'); canvas.width = canvas.height = 1; context = canvas.getContext('2d'); context.drawImage(img, -img.width + 1, 0); // subsampled image becomes half smaller in rendering size. // check alpha channel value to confirm image is covering edge pixel or not. // if alpha value is 0 image is not covering, hence subsampled. return context.getImageData(0, 0, 1, 1).data[3] === 0; } return false; }; // Detects vertical squash in JPEG images: loadImage.detectVerticalSquash = function (img, subsampled) { var naturalHeight = img.naturalHeight || img.height, canvas = document.createElement('canvas'), context = canvas.getContext('2d'), data, sy, ey, py, alpha; if (subsampled) { naturalHeight /= 2; } canvas.width = 1; canvas.height = naturalHeight; context.drawImage(img, 0, 0); data = context.getImageData(0, 0, 1, naturalHeight).data; // search image edge pixel position in case it is squashed vertically: sy = 0; ey = naturalHeight; py = naturalHeight; while (py > sy) { alpha = data[(py - 1) * 4 + 3]; if (alpha === 0) { ey = py; } else { sy = py; } py = (ey + sy) >> 1; } return (py / naturalHeight) || 1; }; // Renders image to canvas while working around iOS image scaling bugs: // https://github.com/blueimp/JavaScript-Load-Image/issues/13 loadImage.renderImageToCanvas = function ( canvas, img, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight ) { if (img._type === 'image/jpeg') { var context = canvas.getContext('2d'), tmpCanvas = document.createElement('canvas'), tileSize = 1024, tmpContext = tmpCanvas.getContext('2d'), subsampled, vertSquashRatio, tileX, tileY; tmpCanvas.width = tileSize; tmpCanvas.height = tileSize; context.save(); subsampled = loadImage.detectSubsampling(img); if (subsampled) { sourceX /= 2; sourceY /= 2; sourceWidth /= 2; sourceHeight /= 2; } vertSquashRatio = loadImage.detectVerticalSquash(img, subsampled); if (subsampled || vertSquashRatio !== 1) { sourceY *= vertSquashRatio; destWidth = Math.ceil(tileSize * destWidth / sourceWidth); destHeight = Math.ceil( tileSize * destHeight / sourceHeight / vertSquashRatio ); destY = 0; tileY = 0; while (tileY < sourceHeight) { destX = 0; tileX = 0; while (tileX < sourceWidth) { tmpContext.clearRect(0, 0, tileSize, tileSize); tmpContext.drawImage( img, sourceX, sourceY, sourceWidth, sourceHeight, -tileX, -tileY, sourceWidth, sourceHeight ); context.drawImage( tmpCanvas, 0, 0, tileSize, tileSize, destX, destY, destWidth, destHeight ); tileX += tileSize; destX += destWidth; } tileY += tileSize; destY += destHeight; } context.restore(); return canvas; } } return originalRenderMethod( canvas, img, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight ); }; })); /*global window, FileAPI */ (function (api, window){ "use strict"; var document = window.document , FormData = window.FormData , Form = function (){ this.items = []; } , encodeURIComponent = window.encodeURIComponent ; Form.prototype = { append: function (name, blob, file, type){ this.items.push({ name: name , blob: blob && blob.blob || (blob == void 0 ? '' : blob) , file: blob && (file || blob.name) , type: blob && (type || blob.type) }); }, each: function (fn){ var i = 0, n = this.items.length; for( ; i < n; i++ ){ fn.call(this, this.items[i]); } }, toData: function (fn, options){ // allow chunked transfer if we have only one file to send // flag is used below and in XHR._send options._chunked = api.support.chunked && options.chunkSize > 0 && api.filter(this.items, function (item){ return item.file; }).length == 1; if( !api.support.html5 ){ api.log('FileAPI.Form.toHtmlData'); this.toHtmlData(fn); } else if( !api.formData || this.multipart || !FormData ){ api.log('FileAPI.Form.toMultipartData'); this.toMultipartData(fn); } else if( options._chunked ){ api.log('FileAPI.Form.toPlainData'); this.toPlainData(fn); } else { api.log('FileAPI.Form.toFormData'); this.toFormData(fn); } }, _to: function (data, complete, next, arg){ var queue = api.queue(function (){ complete(data); }); this.each(function (file){ try{ next(file, data, queue, arg); } catch( err ){ api.log('FileAPI.Form._to: ' + err.message); complete(err); } }); queue.check(); }, toHtmlData: function (fn){ this._to(document.createDocumentFragment(), fn, function (file, data/**DocumentFragment*/){ var blob = file.blob, hidden; if( file.file ){ api.reset(blob, true); // set new name blob.name = file.name; blob.disabled = false; data.appendChild(blob); } else { hidden = document.createElement('input'); hidden.name = file.name; hidden.type = 'hidden'; hidden.value = blob; data.appendChild(hidden); } }); }, toPlainData: function (fn){ this._to({}, fn, function (file, data, queue){ if( file.file ){ data.type = file.file; } if( file.blob.toBlob ){ // canvas queue.inc(); _convertFile(file, function (file, blob){ data.name = file.name; data.file = blob; data.size = blob.length; data.type = file.type; queue.next(); }); } else if( file.file ){ // file data.name = file.blob.name; data.file = file.blob; data.size = file.blob.size; data.type = file.type; } else { // additional data if( !data.params ){ data.params = []; } data.params.push(encodeURIComponent(file.name) +"="+ encodeURIComponent(file.blob)); } data.start = -1; data.end = data.file && data.file.FileAPIReadPosition || -1; data.retry = 0; }); }, toFormData: function (fn){ this._to(new FormData, fn, function (file, data, queue){ if( file.blob && file.blob.toBlob ){ queue.inc(); _convertFile(file, function (file, blob){ data.append(file.name, blob, file.file); queue.next(); }); } else if( file.file ){ data.append(file.name, file.blob, file.file); } else { data.append(file.name, file.blob); } if( file.file ){ data.append('_'+file.name, file.file); } }); }, toMultipartData: function (fn){ this._to([], fn, function (file, data, queue, boundary){ queue.inc(); _convertFile(file, function (file, blob){ data.push( '--_' + boundary + ('\r\nContent-Disposition: form-data; name="'+ file.name +'"'+ (file.file ? '; filename="'+ encodeURIComponent(file.file) +'"' : '') + (file.file ? '\r\nContent-Type: '+ (file.type || 'application/octet-stream') : '') + '\r\n' + '\r\n'+ (file.file ? blob : encodeURIComponent(blob)) + '\r\n') ); queue.next(); }, true); }, api.expando); } }; function _convertFile(file, fn, useBinaryString){ var blob = file.blob, filename = file.file; if( filename ){ if( !blob.toDataURL ){ // The Blob is not an image. api.readAsBinaryString(blob, function (evt){ if( evt.type == 'load' ){ fn(file, evt.result); } }); return; } var mime = { 'image/jpeg': '.jpe?g', 'image/png': '.png' } , type = mime[file.type] ? file.type : 'image/png' , ext = mime[type] || '.png' , quality = blob.quality || 1 ; if( !filename.match(new RegExp(ext+'$', 'i')) ){ // Does not change the current extension, but add a new one. filename += ext.replace('?', ''); } file.file = filename; file.type = type; if( !useBinaryString && blob.toBlob ){ blob.toBlob(function (blob){ fn(file, blob); }, type, quality); } else { fn(file, api.toBinaryString(blob.toDataURL(type, quality))); } } else { fn(file, blob); } } // @export api.Form = Form; })(FileAPI, window); /*global window, FileAPI, Uint8Array */ (function (window, api){ "use strict"; var noop = function (){} , document = window.document , XHR = function (options){ this.uid = api.uid(); this.xhr = { abort: noop , getResponseHeader: noop , getAllResponseHeaders: noop }; this.options = options; }, _xhrResponsePostfix = { '': 1, XML: 1, Text: 1, Body: 1 } ; XHR.prototype = { status: 0, statusText: '', constructor: XHR, getResponseHeader: function (name){ return this.xhr.getResponseHeader(name); }, getAllResponseHeaders: function (){ return this.xhr.getAllResponseHeaders() || {}; }, end: function (status, statusText){ var _this = this, options = _this.options; _this.end = _this.abort = noop; _this.status = status; if( statusText ){ _this.statusText = statusText; } api.log('xhr.end:', status, statusText); options.complete(status == 200 || status == 201 ? false : _this.statusText || 'unknown', _this); if( _this.xhr && _this.xhr.node ){ setTimeout(function (){ var node = _this.xhr.node; try { node.parentNode.removeChild(node); } catch (e){} try { delete window[_this.uid]; } catch (e){} window[_this.uid] = _this.xhr.node = null; }, 9); } }, abort: function (){ this.end(0, 'abort'); if( this.xhr ){ this.xhr.aborted = true; this.xhr.abort(); } }, send: function (FormData){ var _this = this, options = this.options; FormData.toData(function (data){ if( data instanceof Error ){ _this.end(0, data.message); } else{ // Start uploading options.upload(options, _this); _this._send.call(_this, options, data); } }, options); }, _send: function (options, data){ var _this = this, xhr, uid = _this.uid, onLoadFnName = _this.uid + "Load", url = options.url; api.log('XHR._send:', data); if( !options.cache ){ // No cache url += (~url.indexOf('?') ? '&' : '?') + api.uid(); } if( data.nodeName ){ var jsonp = options.jsonp; // prepare callback in GET url = url.replace(/([a-z]+)=(\?)/i, '$1='+uid); // legacy options.upload(options, _this); var onPostMessage = function (evt){ if( ~url.indexOf(evt.origin) ){ try { var result = api.parseJSON(evt.data); if( result.id == uid ){ complete(result.status, result.statusText, result.response); } } catch( err ){ complete(0, err.message); } } }, // jsonp-callack complete = window[uid] = function (status, statusText, response){ _this.readyState = 4; _this.responseText = response; _this.end(status, statusText); api.event.off(window, 'message', onPostMessage); window[uid] = xhr = transport = window[onLoadFnName] = null; } ; _this.xhr.abort = function (){ try { if( transport.stop ){ transport.stop(); } else if( transport.contentWindow.stop ){ transport.contentWindow.stop(); } else { transport.contentWindow.document.execCommand('Stop'); } } catch (er) {} complete(0, "abort"); }; api.event.on(window, 'message', onPostMessage); window[onLoadFnName] = function (){ try { var win = transport.contentWindow , doc = win.document , result = win.result || api.parseJSON(doc.body.innerHTML) ; complete(result.status, result.statusText, result.response); } catch (e){ api.log('[transport.onload]', e); } }; xhr = document.createElement('div'); xhr.innerHTML = '
    ' + '' + (jsonp && (options.url.indexOf('=?') < 0) ? '' : '') + '
    ' ; // get form-data & transport var form = xhr.getElementsByTagName('form')[0] , transport = xhr.getElementsByTagName('iframe')[0] ; form.appendChild(data); api.log(form.parentNode.innerHTML); // append to DOM document.body.appendChild(xhr); // keep a reference to node-transport _this.xhr.node = xhr; // send _this.readyState = 2; // loaded try { form.submit(); } catch (err) { api.log('iframe.error: ' + err); } form = null; } else { // Clean url url = url.replace(/([a-z]+)=(\?)&?/i, ''); // html5 if (this.xhr && this.xhr.aborted) { api.log("Error: already aborted"); return; } xhr = _this.xhr = api.getXHR(); if (data.params) { url += (url.indexOf('?') < 0 ? "?" : "&") + data.params.join("&"); } xhr.open('POST', url, true); if( api.withCredentials ){ xhr.withCredentials = "true"; } if( !options.headers || !options.headers['X-Requested-With'] ){ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); } api.each(options.headers, function (val, key){ xhr.setRequestHeader(key, val); }); if ( options._chunked ) { // chunked upload if( xhr.upload ){ xhr.upload.addEventListener('progress', api.throttle(function (/**Event*/evt){ if (!data.retry) { // show progress only for correct chunk uploads options.progress({ type: evt.type , total: data.size , loaded: data.start + evt.loaded , totalSize: data.size }, _this, options); } }, 100), false); } xhr.onreadystatechange = function (){ var lkb = parseInt(xhr.getResponseHeader('X-Last-Known-Byte'), 10); _this.status = xhr.status; _this.statusText = xhr.statusText; _this.readyState = xhr.readyState; if( xhr.readyState == 4 ){ for( var k in _xhrResponsePostfix ){ _this['response'+k] = xhr['response'+k]; } xhr.onreadystatechange = null; if (!xhr.status || xhr.status - 201 > 0) { api.log("Error: " + xhr.status); // some kind of error // 0 - connection fail or timeout, if xhr.aborted is true, then it's not recoverable user action // up - server error if (((!xhr.status && !xhr.aborted) || 500 == xhr.status || 416 == xhr.status) && ++data.retry <= options.chunkUploadRetry) { // let's try again the same chunk // only applicable for recoverable error codes 500 && 416 var delay = xhr.status ? 0 : api.chunkNetworkDownRetryTimeout; // inform about recoverable problems options.pause(data.file, options); // smart restart if server reports about the last known byte api.log("X-Last-Known-Byte: " + lkb); if (lkb) { data.end = lkb; } else { data.end = data.start - 1; if (416 == xhr.status) { data.end = data.end - options.chunkSize; } } setTimeout(function () { _this._send(options, data); }, delay); } else { // no mo retries _this.end(xhr.status); } } else { // success data.retry = 0; if (data.end == data.size - 1) { // finished _this.end(xhr.status); } else { // next chunk // shift position if server reports about the last known byte api.log("X-Last-Known-Byte: " + lkb); if (lkb) { data.end = lkb; } data.file.FileAPIReadPosition = data.end; setTimeout(function () { _this._send(options, data); }, 0); } } xhr = null; } }; data.start = data.end + 1; data.end = Math.max(Math.min(data.start + options.chunkSize, data.size) - 1, data.start); // Retrieve a slice of file var file = data.file , slice = (file.slice || file.mozSlice || file.webkitSlice).call(file, data.start, data.end + 1) ; if( data.size && !slice.size ){ setTimeout(function (){ _this.end(-1); }); } else { xhr.setRequestHeader("Content-Range", "bytes " + data.start + "-" + data.end + "/" + data.size); xhr.setRequestHeader("Content-Disposition", 'attachment; filename=' + encodeURIComponent(data.name)); xhr.setRequestHeader("Content-Type", data.type || "application/octet-stream"); xhr.send(slice); } file = slice = null; } else { // single piece upload if( xhr.upload ){ // https://github.com/blueimp/jQuery-File-Upload/wiki/Fixing-Safari-hanging-on-very-high-speed-connections-%281Gbps%29 xhr.upload.addEventListener('progress', api.throttle(function (/**Event*/evt){ options.progress(evt, _this, options); }, 100), false); } xhr.onreadystatechange = function (){ _this.status = xhr.status; _this.statusText = xhr.statusText; _this.readyState = xhr.readyState; if( xhr.readyState == 4 ){ for( var k in _xhrResponsePostfix ){ _this['response'+k] = xhr['response'+k]; } xhr.onreadystatechange = null; if (!xhr.status || xhr.status > 201) { api.log("Error: " + xhr.status); if (((!xhr.status && !xhr.aborted) || 500 == xhr.status) && (options.retry || 0) < options.uploadRetry) { options.retry = (options.retry || 0) + 1; var delay = api.networkDownRetryTimeout; // inform about recoverable problems options.pause(options.file, options); setTimeout(function () { _this._send(options, data); }, delay); } else { //success _this.end(xhr.status); } } else { //success _this.end(xhr.status); } xhr = null; } }; if( api.isArray(data) ){ // multipart xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=_'+api.expando); var rawData = data.join('') +'--_'+ api.expando +'--'; /** @namespace xhr.sendAsBinary https://developer.mozilla.org/ru/XMLHttpRequest#Sending_binary_content */ if( xhr.sendAsBinary ){ xhr.sendAsBinary(rawData); } else { var bytes = Array.prototype.map.call(rawData, function(c){ return c.charCodeAt(0) & 0xff; }); xhr.send(new Uint8Array(bytes).buffer); } } else { // FormData xhr.send(data); } } } } }; // @export api.XHR = XHR; })(window, FileAPI); /** * @class FileAPI.Camera * @author RubaXa * @support Chrome 21+, FF 18+, Opera 12+ */ /*global window, FileAPI, jQuery */ /** @namespace LocalMediaStream -- https://developer.mozilla.org/en-US/docs/WebRTC/MediaStream_API#LocalMediaStream */ (function (window, api){ "use strict"; var URL = window.URL || window.webkitURL, document = window.document, navigator = window.navigator, getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia, html5 = !!getMedia ; // Support "media" api.support.media = html5; var Camera = function (video){ this.video = video; }; Camera.prototype = { isActive: function (){ return !!this._active; }, /** * Start camera streaming * @param {Function} callback */ start: function (callback){ var _this = this , video = _this.video , _successId , _failId , _complete = function (err){ _this._active = !err; clearTimeout(_failId); clearTimeout(_successId); // api.event.off(video, 'loadedmetadata', _complete); callback && callback(err, _this); } ; getMedia.call(navigator, { video: true }, function (stream/**LocalMediaStream*/){ // Success _this.stream = stream; // api.event.on(video, 'loadedmetadata', function (){ // _complete(null); // }); // Set camera stream video.src = URL.createObjectURL(stream); // Note: onloadedmetadata doesn't fire in Chrome when using it with getUserMedia. // See crbug.com/110938. _successId = setInterval(function (){ if( _detectVideoSignal(video) ){ _complete(null); } }, 1000); _failId = setTimeout(function (){ _complete('timeout'); }, 5000); // Go-go-go! video.play(); }, _complete/*error*/); }, /** * Stop camera streaming */ stop: function (){ try { this._active = false; this.video.pause(); this.stream.stop(); } catch( err ){ } }, /** * Create screenshot * @return {FileAPI.Camera.Shot} */ shot: function (){ return new Shot(this.video); } }; /** * Get camera element from container * * @static * @param {HTMLElement} el * @return {Camera} */ Camera.get = function (el){ return new Camera(el.firstChild); }; /** * Publish camera element into container * * @static * @param {HTMLElement} el * @param {Object} options * @param {Function} [callback] */ Camera.publish = function (el, options, callback){ if( typeof options == 'function' ){ callback = options; options = {}; } // Dimensions of "camera" options = api.extend({}, { width: '100%' , height: '100%' , start: true }, options); if( el.jquery ){ // Extract first element, from jQuery collection el = el[0]; } var doneFn = function (err){ if( err ){ callback(err); } else { // Get camera var cam = Camera.get(el); if( options.start ){ cam.start(callback); } else { callback(null, cam); } } }; el.style.width = _px(options.width); el.style.height = _px(options.height); if( api.html5 && html5 ){ // Create video element var video = document.createElement('video'); // Set dimensions video.style.width = _px(options.width); video.style.height = _px(options.height); // Clean container if( window.jQuery ){ jQuery(el).empty(); } else { el.innerHTML = ''; } // Add "camera" to container el.appendChild(video); // end doneFn(); } else { Camera.fallback(el, options, doneFn); } }; Camera.fallback = function (el, options, callback){ callback('not_support_camera'); }; /** * @class FileAPI.Camera.Shot */ var Shot = function (video){ var canvas = video.nodeName ? api.Image.toCanvas(video) : video; var shot = api.Image(canvas); shot.type = 'image/png'; shot.width = canvas.width; shot.height = canvas.height; shot.size = canvas.width * canvas.height * 4; return shot; }; /** * Add "px" postfix, if value is a number * * @private * @param {*} val * @return {String} */ function _px(val){ return val >= 0 ? val + 'px' : val; } /** * @private * @param {HTMLVideoElement} video * @return {Boolean} */ function _detectVideoSignal(video){ var canvas = document.createElement('canvas'), ctx, res = false; try { ctx = canvas.getContext('2d'); ctx.drawImage(video, 0, 0, 1, 1); res = ctx.getImageData(0, 0, 1, 1).data[4] != 255; } catch( e ){} return res; } // @export Camera.Shot = Shot; api.Camera = Camera; })(window, FileAPI); /** * FileAPI fallback to Flash * * @flash-developer "Vladimir Demidov" */ /*global window, FileAPI */ (function (window, jQuery, api) { "use strict"; var _each = api.each, _cameraQueue = []; if (api.support.flash && (api.media && (!api.support.media || !api.html5))) { (function () { function _wrap(fn) { var id = fn.wid = api.uid(); api.Flash._fn[id] = fn; return 'FileAPI.Flash._fn.' + id; } function _unwrap(fn) { try { api.Flash._fn[fn.wid] = null; delete api.Flash._fn[fn.wid]; } catch (e) { } } var flash = api.Flash; api.extend(api.Flash, { patchCamera: function () { api.Camera.fallback = function (el, options, callback) { var camId = api.uid(); api.log('FlashAPI.Camera.publish: ' + camId); flash.publish(el, camId, api.extend(options, { camera: true, onEvent: _wrap(function _(evt) { if (evt.type === 'camera') { _unwrap(_); if (evt.error) { api.log('FlashAPI.Camera.publish.error: ' + evt.error); callback(evt.error); } else { api.log('FlashAPI.Camera.publish.success: ' + camId); callback(null); } } }) })); }; // Run _each(_cameraQueue, function (args) { api.Camera.fallback.apply(api.Camera, args); }); _cameraQueue = []; // FileAPI.Camera:proto api.extend(api.Camera.prototype, { _id: function () { return this.video.id; }, start: function (callback) { var _this = this; flash.cmd(this._id(), 'camera.on', { callback: _wrap(function _(evt) { _unwrap(_); if (evt.error) { api.log('FlashAPI.camera.on.error: ' + evt.error); callback(evt.error, _this); } else { api.log('FlashAPI.camera.on.success: ' + _this._id()); _this._active = true; callback(null, _this); } }) }); }, stop: function () { this._active = false; flash.cmd(this._id(), 'camera.off'); }, shot: function () { api.log('FlashAPI.Camera.shot:', this._id()); var shot = api.Flash.cmd(this._id(), 'shot', {}); shot.type = 'image/png'; shot.flashId = this._id(); shot.isShot = true; return new api.Camera.Shot(shot); } }); } }); api.Camera.fallback = function () { _cameraQueue.push(arguments); }; }()); } }(window, window.jQuery, FileAPI)); if( typeof define === "function" && define.amd ){ define("FileAPI", [], function (){ return FileAPI; }); }PK!. 2abilian/web/resources/fileapi/FileAPI.html5.min.js/*! FileAPI 2.0.11 - BSD | git://github.com/mailru/FileAPI.git */ !function(a){"use strict";var b=a.HTMLCanvasElement&&a.HTMLCanvasElement.prototype,c=a.Blob&&function(){try{return Boolean(new Blob)}catch(a){return!1}}(),d=c&&a.Uint8Array&&function(){try{return 100===new Blob([new Uint8Array(100)]).size}catch(a){return!1}}(),e=a.BlobBuilder||a.WebKitBlobBuilder||a.MozBlobBuilder||a.MSBlobBuilder,f=(c||e)&&a.atob&&a.ArrayBuffer&&a.Uint8Array&&function(a){var b,f,g,h,i,j;for(b=a.split(",")[0].indexOf("base64")>=0?atob(a.split(",")[1]):decodeURIComponent(a.split(",")[1]),f=new ArrayBuffer(b.length),g=new Uint8Array(f),h=0;h0,E=a.dataURLtoBlob,F=/img/i,G=/canvas/i,H=/img|canvas/i,I=/input/i,J=/^data:[^,]+,/,K={}.toString,L=a.Math,M=function(b){return b=new a.Number(L.pow(1024,b)),b.from=function(a){return L.round(a*this)},b},N={},O=[],P="abort progress error load loadend",Q="status statusText readyState response responseXML responseText responseBody".split(" "),R="currentTarget",S="preventDefault",T=function(a){return a&&"length"in a},U=function(a,b,c){if(a)if(T(a))for(var d=0,e=a.length;e>d;d++)d in a&&b.call(c,a[d],d,a);else for(var f in a)a.hasOwnProperty(f)&&b.call(c,a[f],f,a)},V=function(a){for(var b=arguments,c=1,d=function(b,c){a[c]=b};c=c&&!d&&f.end()},isFail:function(){return d},fail:function(){!d&&a(d=!0)},end:function(){e||(e=!0,a())}};return f},each:U,afor:function(a,b){var c=0,d=a.length;T(a)&&d--?!function e(){b(d!=c&&e,a[c],c++)}():b(!1)},extend:V,isFile:function(a){return"[object File]"===K.call(a)},isBlob:function(a){return this.isFile(a)||"[object Blob]"===K.call(a)},isCanvas:function(a){return a&&G.test(a.nodeName)},getFilesFilter:function(a){return a="string"==typeof a?a:a.getAttribute&&a.getAttribute("accept")||"",a?new RegExp("("+a.replace(/\./g,"\\.").replace(/,/g,"|")+")$","i"):/./},readAsDataURL:function(a,b){_.isCanvas(a)?c(a,b,"load",_.toDataURL(a)):e(a,b,"DataURL")},readAsBinaryString:function(a,b){d("BinaryString")?e(a,b,"BinaryString"):e(a,function(a){if("load"==a.type)try{a.result=_.toBinaryString(a.result)}catch(c){a.type="error",a.message=c.toString()}b(a)},"DataURL")},readAsArrayBuffer:function(a,b){e(a,b,"ArrayBuffer")},readAsText:function(a,b,c){c||(c=b,b="utf-8"),e(a,c,"Text",b)},toDataURL:function(a,b){return"string"==typeof a?a:a.toDataURL?a.toDataURL(b||"image/png"):void 0},toBinaryString:function(b){return a.atob(_.toDataURL(b).replace(J,""))},readAsImage:function(a,d,e){if(_.isFile(a))if(t){var f=t.createObjectURL(a);f===b?c(a,d,"error"):_.readAsImage(f,d,e)}else _.readAsDataURL(a,function(b){"load"==b.type?_.readAsImage(b.result,d,e):(e||"error"==b.type)&&c(a,d,b,null,{loaded:b.loaded,total:b.total})});else if(_.isCanvas(a))c(a,d,"load",a);else if(F.test(a.nodeName))if(a.complete)c(a,d,"load",a);else{var g="error abort load";Y(a,g,function i(b){"load"==b.type&&t&&t.revokeObjectURL(a.src),X(a,g,i),c(a,d,b,a)})}else if(a.iframe)c(a,d,{type:"error"});else{var h=_.newImage(a.dataURL||a);_.readAsImage(h,d,e)}},checkFileObj:function(a){var b={},c=_.accept;return"object"==typeof a?b=a:b.name=(a+"").split(/\\|\//g).pop(),null==b.type&&(b.type=b.name.split(".").pop()),U(c,function(a,c){a=new RegExp(a.replace(/\s/g,"|"),"i"),(a.test(b.type)||_.ext2mime[b.type])&&(b.type=_.ext2mime[b.type]||c.split("/")[0]+"/"+b.type)}),b},getDropFiles:function(a,b){var c,d=[],e=[],j=l(a),k=j.files,m=j.items,n=T(m)&&m[0]&&h(m[0]),o=_.queue(function(){b(d,e)});if(n)if(D&&k){var p,q,r=k.length;for(c=new Array(r);r--;){p=k[r];try{q=h(m[r])}catch(s){_.log("[err] getDropFiles: ",s),q=null}c[r]=g(q)&&(q.isDirectory||q.isFile&&p.name==p.name.normalize("NFC"))?q:p}}else c=m;else c=k;U(c||[],function(a){o.inc();try{n&&g(a)?i(a,function(a,b,c){a?_.log("[err] getDropFiles:",a):d.push.apply(d,b),e.push.apply(e,c),o.next()}):f(a,function(b,c){b?d.push(a):a.error=c,e.push(a),o.next()})}catch(b){o.next(),_.log("[err] getDropFiles: ",b)}}),o.check()},getFiles:function(a,b,c){var d=[];return c?(_.filterFiles(_.getFiles(a),b,c),null):(a.jquery&&(a.each(function(){d=d.concat(_.getFiles(this))}),a=d,d=[]),"string"==typeof b&&(b=_.getFilesFilter(b)),a.originalEvent?a=Z(a.originalEvent):a.srcElement&&(a=Z(a)),a.dataTransfer?a=a.dataTransfer:a.target&&(a=a.target),a.files?(d=a.files,A||(d[0].blob=a,d[0].iframe=!0)):!A&&k(a)?_.trim(a.value)&&(d=[_.checkFileObj(a.value)],d[0].blob=a,d[0].iframe=!0):T(a)&&(d=a),_.filter(d,function(a){return!b||b.test(a.name)}))},getTotalSize:function(a){for(var b=0,c=a&&a.length;c--;)b+=a[c].size;return b},getInfo:function(a,b){var c={},d=O.concat();_.isFile(a)?!function e(){var f=d.shift();f?f.test(a.type)?f(a,function(a,d){a?b(a):(V(c,d),e())}):e():b(!1,c)}():b("not_support_info",c)},addInfoReader:function(a,b){b.test=function(b){return a.test(b)},O.push(b)},filter:function(a,b){for(var c,d=[],e=0,f=a.length;f>e;e++)e in a&&(c=a[e],b.call(c,c,e,a)&&d.push(c));return d},filterFiles:function(a,b,c){if(a.length){var d,e=a.concat(),f=[],g=[];!function h(){e.length?(d=e.shift(),_.getInfo(d,function(a,c){(b(d,a?!1:c)?f:g).push(d),h()})):c(f,g)}()}else c([],a)},upload:function(a){a=V({jsonp:"callback",prepare:_.F,beforeupload:_.F,upload:_.F,fileupload:_.F,fileprogress:_.F,filecomplete:_.F,progress:_.F,complete:_.F,pause:_.F,imageOriginal:!0,chunkSize:_.chunkSize,chunkUploadRetry:_.chunkUploadRetry,uploadRetry:_.uploadRetry},a),a.imageAutoOrientation&&!a.imageTransform&&(a.imageTransform={rotate:"auto"});var b,c=new _.XHR(a),d=this._getFilesDataArray(a.files),e=this,f=0,g=0,h=!1;return U(d,function(a){f+=a.size}),c.files=[],U(d,function(a){c.files.push(a.file)}),c.total=f,c.loaded=0,c.filesLeft=d.length,a.beforeupload(c,a),b=function(){var i=d.shift(),k=i&&i.file,l=!1,m=j(a);if(c.filesLeft=d.length,k&&k.name===_.expando&&(k=null,_.log("[warn] FileAPI.upload() — called without files")),("abort"!=c.statusText||c.current)&&i){if(h=!1,c.currentFile=k,k&&a.prepare(k,m)===!1)return void b.call(e);m.file=k,e._getFormData(m,i,function(h){g||a.upload(c,a);var j=new _.XHR(V({},m,{upload:k?function(){a.fileupload(k,j,m)}:o,progress:k?function(b){l||(l=b.loaded===b.total,a.fileprogress({type:"progress",total:i.total=b.total,loaded:i.loaded=b.loaded},k,j,m),a.progress({type:"progress",total:f,loaded:c.loaded=g+i.size*(b.loaded/b.total)||0},k,j,m))}:o,complete:function(d){U(Q,function(a){c[a]=j[a]}),k&&(i.total=i.total||i.size,i.loaded=i.total,d||(this.progress(i),l=!0,g+=i.size,c.loaded=g),a.filecomplete(d,j,k,m)),setTimeout(function(){b.call(e)},0)}}));c.abort=function(a){a||(d.length=0),this.current=a,j.abort()},j.send(h)})}else{var n=200==c.status||201==c.status||204==c.status;a.complete(n?!1:c.statusText||"error",c,a),h=!0}},setTimeout(b,0),c.append=function(a,g){a=_._getFilesDataArray([].concat(a)),U(a,function(a){f+=a.size,c.files.push(a.file),g?d.unshift(a):d.push(a)}),c.statusText="",h&&b.call(e)},c.remove=function(a){for(var b,c=d.length;c--;)d[c].file==a&&(b=d.splice(c,1),f-=b.size);return b},c},_getFilesDataArray:function(a){var b=[],c={};if(k(a)){var d=_.getFiles(a);c[a.name||"file"]=null!==a.getAttribute("multiple")?d:d[0]}else T(a)&&k(a[0])?U(a,function(a){c[a.name||"file"]=_.getFiles(a)}):c=a;return U(c,function e(a,c){T(a)?U(a,function(a){e(a,c)}):a&&(a.name||a.image)&&b.push({name:c,file:a,size:a.size,total:a.size,loaded:0})}),b.length||b.push({file:{name:_.expando}}),b},_getFormData:function(a,b,c){var d=b.file,e=b.name,f=d.name,g=d.type,h=_.support.transform&&a.imageTransform,i=new _.Form,j=_.queue(function(){c(i)}),k=h&&m(h),l=_.postNameConcat;U(a.data,function n(a,b){"object"==typeof a?U(a,function(a,c){n(a,l(b,c))}):i.append(b,a)}),function o(b){b.image?(j.inc(),b.toData(function(a,b){f=f||(new Date).getTime()+".png",o(b),j.next()})):_.Image&&h&&(/^image/.test(b.type)||H.test(b.nodeName))?(j.inc(),k&&(h=[h]),_.Image.transform(b,h,a.imageAutoOrientation,function(c,d){if(k&&!c)E||_.flashEngine||(i.multipart=!0),i.append(e,d[0],f,h[0].type||g);else{var m=0;c||U(d,function(a,b){E||_.flashEngine||(i.multipart=!0),h[b].postName||(m=1),i.append(h[b].postName||l(e,b),a,f,h[b].type||g)}),(c||a.imageOriginal)&&i.append(l(e,m?"original":null),b,f,g)}j.next()})):f!==_.expando&&i.append(e,b,f)}(d),j.check()},reset:function(a,b){var c,d;return z?(d=z(a).clone(!0).insertBefore(a).val("")[0],b||z(a).remove()):(c=a.parentNode,d=c.insertBefore(a.cloneNode(!0),a),d.value="",b||c.removeChild(a),U(N[_.uid(a)],function(b,c){U(b,function(b){X(a,c,b),W(d,c,b)})})),d},load:function(a,b){var c=_.getXHR();return c?(c.open("GET",a,!0),c.overrideMimeType&&c.overrideMimeType("text/plain; charset=x-user-defined"),W(c,"progress",function(a){a.lengthComputable&&b({type:a.type,loaded:a.loaded,total:a.total},c)}),c.onreadystatechange=function(){if(4==c.readyState)if(c.onreadystatechange=null,200==c.status){a=a.split("/");var d={name:a[a.length-1],size:c.getResponseHeader("Content-Length"),type:c.getResponseHeader("Content-Type")};d.dataURL="data:"+d.type+";base64,"+_.encode64(c.responseBody||c.responseText),b({type:"load",result:d},c)}else b({type:"error"},c)},c.send(null)):b({type:"error"}),c},encode64:function(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c="",d=0;for("string"!=typeof a&&(a=String(a));d>2,k=(3&g)<<4|h>>4;isNaN(h)?e=f=64:(e=(15&h)<<2|i>>6,f=isNaN(i)?64:63&i),c+=b.charAt(j)+b.charAt(k)+b.charAt(e)+b.charAt(f)}return c}};_.addInfoReader(/^image/,function(a,b){if(!a.__dimensions){var c=a.__dimensions=_.defer();_.readAsImage(a,function(a){var b=a.target;c.resolve("load"==a.type?!1:"error",{width:b.width,height:b.height}),b.src=_.EMPTY_PNG,b=null})}a.__dimensions.then(b)}),_.event.dnd=function(a,b,c){var d,e;c||(c=b,b=_.F),w?(W(a,"dragenter dragleave dragover",b.ff=b.ff||function(a){for(var c=l(a).types,f=c&&c.length,g=!1;f--;)if(~c[f].indexOf("File")){a[S](),e!==a.type&&(e=a.type,"dragleave"!=e&&b.call(a[R],!0,a),g=!0);break}g&&(clearTimeout(d),d=setTimeout(function(){b.call(a[R],"dragleave"!=e,a)},50))}),W(a,"drop",c.ff=c.ff||function(a){a[S](),e=0,b.call(a[R],!1,a),_.getDropFiles(a,function(b,d){c.call(a[R],b,d,a)})})):_.log("Drag'n'Drop -- not supported")},_.event.dnd.off=function(a,b,c){X(a,"dragenter dragleave dragover",b.ff),X(a,"drop",c.ff)},z&&!z.fn.dnd&&(z.fn.dnd=function(a,b){return this.each(function(){_.event.dnd(this,a,b)})},z.fn.offdnd=function(a,b){return this.each(function(){_.event.dnd.off(this,a,b)})}),a.FileAPI=V(_,a.FileAPI),_.log("FileAPI: "+_.version),_.log("protocol: "+a.location.protocol),_.log("doctype: ["+q.name+"] "+q.publicId+" "+q.systemId),U(p.getElementsByTagName("meta"),function(a){/x-ua-compatible/i.test(a.getAttribute("http-equiv"))&&_.log("meta.http-equiv: "+a.getAttribute("content"))}),_.flashUrl||(_.flashUrl=_.staticPath+"FileAPI.flash.swf"),_.flashImageUrl||(_.flashImageUrl=_.staticPath+"FileAPI.flash.image.swf"),_.flashWebcamUrl||(_.flashWebcamUrl=_.staticPath+"FileAPI.flash.camera.swf")}(window,void 0),function(a,b,c){"use strict";function d(b){if(b instanceof d){var c=new d(b.file);return a.extend(c.matrix,b.matrix),c}return this instanceof d?(this.file=b,this.size=b.size||100,void(this.matrix={sx:0,sy:0,sw:0,sh:0,dx:0,dy:0,dw:0,dh:0,resize:0,deg:0,quality:1,filter:0})):new d(b)}var e=Math.min,f=Math.round,g=function(){return b.createElement("canvas")},h=!1,i={8:270,3:180,6:90,7:270,4:180,5:90};try{h=g().toDataURL("image/png").indexOf("data:image/png")>-1}catch(j){}d.prototype={image:!0,constructor:d,set:function(b){return a.extend(this.matrix,b),this},crop:function(a,b,d,e){return d===c&&(d=a,e=b,a=b=0),this.set({sx:a,sy:b,sw:d,sh:e||d})},resize:function(a,b,c){return/min|max|height|width/.test(b)&&(c=b,b=a),this.set({dw:a,dh:b||a,resize:c})},preview:function(a,b){return this.resize(a,b||a,"preview")},rotate:function(a){return this.set({deg:a})},filter:function(a){return this.set({filter:a})},overlay:function(a){return this.set({overlay:a})},clone:function(){return new d(this)},_load:function(b,c){var d=this;/img|video/i.test(b.nodeName)?c.call(d,null,b):a.readAsImage(b,function(a){c.call(d,"load"!=a.type,a.result)})},_apply:function(b,c){var f,h=g(),i=this.getMatrix(b),j=h.getContext("2d"),k=b.videoWidth||b.width,l=b.videoHeight||b.height,m=i.deg,n=i.dw,o=i.dh,p=k,q=l,r=i.filter,s=b,t=i.overlay,u=a.queue(function(){b.src=a.EMPTY_PNG,c(!1,h)}),v=a.renderImageToCanvas;for(m-=360*Math.floor(m/360),b._type=this.file.type;i.multipass&&e(p/n,q/o)>2;)p=p/2+.5|0,q=q/2+.5|0,f=g(),f.width=p,f.height=q,s!==b?(v(f,s,0,0,s.width,s.height,0,0,p,q),s=f):(s=f,v(s,b,i.sx,i.sy,i.sw,i.sh,0,0,p,q),i.sx=i.sy=i.sw=i.sh=0);h.width=m%180?o:n,h.height=m%180?n:o,h.type=i.type,h.quality=i.quality,j.rotate(m*Math.PI/180),v(j.canvas,s,i.sx,i.sy,i.sw||s.width,i.sh||s.height,180==m||270==m?-n:0,90==m||180==m?-o:0,n,o),n=h.width,o=h.height,t&&a.each([].concat(t),function(b){u.inc();var c=new window.Image,d=function(){var e=0|b.x,f=0|b.y,g=b.w||c.width,h=b.h||c.height,i=b.rel;e=1==i||4==i||7==i?(n-g+e)/2:2==i||5==i||8==i?n-(g+e):e,f=3==i||4==i||5==i?(o-h+f)/2:i>=6?o-(h+f):f,a.event.off(c,"error load abort",d);try{j.globalAlpha=b.opacity||1,j.drawImage(c,e,f,g,h)}catch(k){}u.next()};a.event.on(c,"error load abort",d),c.src=b.src,c.complete&&d()}),r&&(u.inc(),d.applyFilter(h,r,u.next)),u.check()},getMatrix:function(b){var c=a.extend({},this.matrix),d=c.sw=c.sw||b.videoWidth||b.naturalWidth||b.width,g=c.sh=c.sh||b.videoHeight||b.naturalHeight||b.height,h=c.dw=c.dw||d,i=c.dh=c.dh||g,j=d/g,k=h/i,l=c.resize;if("preview"==l){if(h!=d||i!=g){var m,n;k>=j?(m=d,n=m/k):(n=g,m=n*k),(m!=d||n!=g)&&(c.sx=~~((d-m)/2),c.sy=~~((g-n)/2),d=m,g=n)}}else"height"==l?h=i*j:"width"==l?i=h/j:l&&(d>h||g>i?"min"==l?(h=f(k>j?e(d,h):i*j),i=f(k>j?h/j:e(g,i))):(h=f(j>=k?e(d,h):i*j),i=f(j>=k?h/j:e(g,i))):(h=d,i=g));return c.sw=d,c.sh=g,c.dw=h,c.dh=i,c.multipass=a.multiPassResize,c},_trans:function(b){this._load(this.file,function(c,d){if(c)b(c);else try{this._apply(d,b)}catch(c){a.log("[err] FileAPI.Image.fn._apply:",c),b(c)}})},get:function(b){if(a.support.transform){var c=this,d=c.matrix;"auto"==d.deg?a.getInfo(c.file,function(a,e){d.deg=i[e&&e.exif&&e.exif.Orientation]||0,c._trans(b)}):c._trans(b)}else b("not_support_transform");return this},toData:function(a){return this.get(a)}},d.exifOrientation=i,d.transform=function(b,e,f,g){function h(h,i){var j={},k=a.queue(function(a){g(a,j)});h?k.fail():a.each(e,function(a,e){if(!k.isFail()){var g=new d(i.nodeType?i:b),h="function"==typeof a;if(h?a(i,g):a.width?g[a.preview?"preview":"resize"](a.width,a.height,a.strategy):a.maxWidth&&(i.width>a.maxWidth||i.height>a.maxHeight)&&g.resize(a.maxWidth,a.maxHeight,"max"),a.crop){var l=a.crop;g.crop(0|l.x,0|l.y,l.w||l.width,l.h||l.height)}a.rotate===c&&f&&(a.rotate="auto"),g.set({type:g.matrix.type||a.type||b.type||"image/png"}),h||g.set({deg:a.rotate,overlay:a.overlay,filter:a.filter,quality:a.quality||1}),k.inc(),g.toData(function(a,b){a?k.fail():(j[e]=b,k.next())})}})}b.width?h(!1,b):a.getInfo(b,h)},a.each(["TOP","CENTER","BOTTOM"],function(b,c){a.each(["LEFT","CENTER","RIGHT"],function(a,e){d[b+"_"+a]=3*c+e,d[a+"_"+b]=3*c+e})}),d.toCanvas=function(a){var c=b.createElement("canvas");return c.width=a.videoWidth||a.width,c.height=a.videoHeight||a.height,c.getContext("2d").drawImage(a,0,0),c},d.fromDataURL=function(b,c,d){var e=a.newImage(b);a.extend(e,c),d(e)},d.applyFilter=function(b,c,e){"function"==typeof c?c(b,e):window.Caman&&window.Caman("IMG"==b.tagName?d.toCanvas(b):b,function(){"string"==typeof c?this[c]():a.each(c,function(a,b){this[b](a)},this),this.render(e)})},a.renderImageToCanvas=function(b,c,d,e,f,g,h,i,j,k){try{return b.getContext("2d").drawImage(c,d,e,f,g,h,i,j,k)}catch(l){throw a.log("renderImageToCanvas failed"),l}},a.support.canvas=a.support.transform=h,a.Image=d}(FileAPI,document),function(a){"use strict";a(FileAPI)}(function(a){"use strict";if(window.navigator&&window.navigator.platform&&/iP(hone|od|ad)/.test(window.navigator.platform)){var b=a.renderImageToCanvas;a.detectSubsampling=function(a){var b,c;return a.width*a.height>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-a.width+1,0),0===c.getImageData(0,0,1,1).data[3]):!1},a.detectVerticalSquash=function(a,b){var c,d,e,f,g,h=a.naturalHeight||a.height,i=document.createElement("canvas"),j=i.getContext("2d");for(b&&(h/=2),i.width=1,i.height=h,j.drawImage(a,0,0),c=j.getImageData(0,0,1,h).data,d=0,e=h,f=h;f>d;)g=c[4*(f-1)+3],0===g?e=f:d=f,f=e+d>>1;return f/h||1},a.renderImageToCanvas=function(c,d,e,f,g,h,i,j,k,l){if("image/jpeg"===d._type){var m,n,o,p,q=c.getContext("2d"),r=document.createElement("canvas"),s=1024,t=r.getContext("2d");if(r.width=s,r.height=s,q.save(),m=a.detectSubsampling(d),m&&(e/=2,f/=2,g/=2,h/=2),n=a.detectVerticalSquash(d,m),m||1!==n){for(f*=n,k=Math.ceil(s*k/g),l=Math.ceil(s*l/h/n),j=0,p=0;h>p;){for(i=0,o=0;g>o;)t.clearRect(0,0,s,s),t.drawImage(d,e,f,g,h,-o,-p,g,h),q.drawImage(r,0,0,s,s,i,j,k,l),o+=s,i+=k;p+=s,j+=l}return q.restore(),c}}return b(c,d,e,f,g,h,i,j,k,l)}}}),function(a,b){"use strict";function c(b,c,d){var e=b.blob,f=b.file;if(f){if(!e.toDataURL)return void a.readAsBinaryString(e,function(a){"load"==a.type&&c(b,a.result)});var g={"image/jpeg":".jpe?g","image/png":".png"},h=g[b.type]?b.type:"image/png",i=g[h]||".png",j=e.quality||1;f.match(new RegExp(i+"$","i"))||(f+=i.replace("?","")),b.file=f,b.type=h,!d&&e.toBlob?e.toBlob(function(a){c(b,a)},h,j):c(b,a.toBinaryString(e.toDataURL(h,j)))}else c(b,e)}var d=b.document,e=b.FormData,f=function(){this.items=[]},g=b.encodeURIComponent;f.prototype={append:function(a,b,c,d){this.items.push({name:a,blob:b&&b.blob||(void 0==b?"":b),file:b&&(c||b.name),type:b&&(d||b.type)})},each:function(a){for(var b=0,c=this.items.length;c>b;b++)a.call(this,this.items[b])},toData:function(b,c){c._chunked=a.support.chunked&&c.chunkSize>0&&1==a.filter(this.items,function(a){return a.file}).length,a.support.html5?a.formData&&!this.multipart&&e?c._chunked?(a.log("FileAPI.Form.toPlainData"),this.toPlainData(b)):(a.log("FileAPI.Form.toFormData"),this.toFormData(b)):(a.log("FileAPI.Form.toMultipartData"),this.toMultipartData(b)):(a.log("FileAPI.Form.toHtmlData"),this.toHtmlData(b))},_to:function(b,c,d,e){var f=a.queue(function(){c(b)});this.each(function(g){try{d(g,b,f,e)}catch(h){a.log("FileAPI.Form._to: "+h.message),c(h)}}),f.check()},toHtmlData:function(b){this._to(d.createDocumentFragment(),b,function(b,c){var e,f=b.blob;b.file?(a.reset(f,!0),f.name=b.name,f.disabled=!1,c.appendChild(f)):(e=d.createElement("input"),e.name=b.name,e.type="hidden",e.value=f,c.appendChild(e))})},toPlainData:function(a){this._to({},a,function(a,b,d){a.file&&(b.type=a.file),a.blob.toBlob?(d.inc(),c(a,function(a,c){b.name=a.name,b.file=c,b.size=c.length,b.type=a.type,d.next()})):a.file?(b.name=a.blob.name,b.file=a.blob,b.size=a.blob.size,b.type=a.type):(b.params||(b.params=[]),b.params.push(g(a.name)+"="+g(a.blob))),b.start=-1,b.end=b.file&&b.file.FileAPIReadPosition||-1,b.retry=0})},toFormData:function(a){this._to(new e,a,function(a,b,d){a.blob&&a.blob.toBlob?(d.inc(),c(a,function(a,c){b.append(a.name,c,a.file),d.next()})):a.file?b.append(a.name,a.blob,a.file):b.append(a.name,a.blob),a.file&&b.append("_"+a.name,a.file)})},toMultipartData:function(b){this._to([],b,function(a,b,d,e){d.inc(),c(a,function(a,c){b.push("--_"+e+('\r\nContent-Disposition: form-data; name="'+a.name+'"'+(a.file?'; filename="'+g(a.file)+'"':"")+(a.file?"\r\nContent-Type: "+(a.type||"application/octet-stream"):"")+"\r\n\r\n"+(a.file?c:g(c))+"\r\n")),d.next()},!0)},a.expando)}},a.Form=f}(FileAPI,window),function(a,b){"use strict";var c=function(){},d=a.document,e=function(a){this.uid=b.uid(),this.xhr={abort:c,getResponseHeader:c,getAllResponseHeaders:c},this.options=a},f={"":1,XML:1,Text:1,Body:1};e.prototype={status:0,statusText:"",constructor:e,getResponseHeader:function(a){return this.xhr.getResponseHeader(a)},getAllResponseHeaders:function(){return this.xhr.getAllResponseHeaders()||{}},end:function(d,e){var f=this,g=f.options;f.end=f.abort=c,f.status=d,e&&(f.statusText=e),b.log("xhr.end:",d,e),g.complete(200==d||201==d?!1:f.statusText||"unknown",f),f.xhr&&f.xhr.node&&setTimeout(function(){var b=f.xhr.node;try{b.parentNode.removeChild(b)}catch(c){}try{delete a[f.uid]}catch(c){}a[f.uid]=f.xhr.node=null},9)},abort:function(){this.end(0,"abort"),this.xhr&&(this.xhr.aborted=!0,this.xhr.abort())},send:function(a){var b=this,c=this.options;a.toData(function(a){a instanceof Error?b.end(0,a.message):(c.upload(c,b),b._send.call(b,c,a))},c)},_send:function(c,e){var g,h=this,i=h.uid,j=h.uid+"Load",k=c.url;if(b.log("XHR._send:",e),c.cache||(k+=(~k.indexOf("?")?"&":"?")+b.uid()),e.nodeName){var l=c.jsonp;k=k.replace(/([a-z]+)=(\?)/i,"$1="+i),c.upload(c,h);var m=function(a){if(~k.indexOf(a.origin))try{var c=b.parseJSON(a.data);c.id==i&&n(c.status,c.statusText,c.response)}catch(d){n(0,d.message)}},n=a[i]=function(c,d,e){h.readyState=4,h.responseText=e,h.end(c,d),b.event.off(a,"message",m),a[i]=g=p=a[j]=null};h.xhr.abort=function(){try{p.stop?p.stop():p.contentWindow.stop?p.contentWindow.stop():p.contentWindow.document.execCommand("Stop")}catch(a){}n(0,"abort")},b.event.on(a,"message",m),a[j]=function(){try{var a=p.contentWindow,c=a.document,d=a.result||b.parseJSON(c.body.innerHTML);n(d.status,d.statusText,d.response)}catch(e){b.log("[transport.onload]",e)}},g=d.createElement("div"),g.innerHTML='
    '+(l&&c.url.indexOf("=?")<0?'':"")+"
    ";var o=g.getElementsByTagName("form")[0],p=g.getElementsByTagName("iframe")[0];o.appendChild(e),b.log(o.parentNode.innerHTML),d.body.appendChild(g),h.xhr.node=g,h.readyState=2;try{o.submit()}catch(q){b.log("iframe.error: "+q)}o=null}else{if(k=k.replace(/([a-z]+)=(\?)&?/i,""),this.xhr&&this.xhr.aborted)return void b.log("Error: already aborted");if(g=h.xhr=b.getXHR(),e.params&&(k+=(k.indexOf("?")<0?"?":"&")+e.params.join("&")),g.open("POST",k,!0),b.withCredentials&&(g.withCredentials="true"),c.headers&&c.headers["X-Requested-With"]||g.setRequestHeader("X-Requested-With","XMLHttpRequest"),b.each(c.headers,function(a,b){g.setRequestHeader(b,a)}),c._chunked){g.upload&&g.upload.addEventListener("progress",b.throttle(function(a){e.retry||c.progress({type:a.type,total:e.size,loaded:e.start+a.loaded,totalSize:e.size},h,c)},100),!1),g.onreadystatechange=function(){var a=parseInt(g.getResponseHeader("X-Last-Known-Byte"),10);if(h.status=g.status,h.statusText=g.statusText,h.readyState=g.readyState,4==g.readyState){for(var d in f)h["response"+d]=g["response"+d];if(g.onreadystatechange=null,!g.status||g.status-201>0)if(b.log("Error: "+g.status),(!g.status&&!g.aborted||500==g.status||416==g.status)&&++e.retry<=c.chunkUploadRetry){var i=g.status?0:b.chunkNetworkDownRetryTimeout;c.pause(e.file,c),b.log("X-Last-Known-Byte: "+a),a?e.end=a:(e.end=e.start-1,416==g.status&&(e.end=e.end-c.chunkSize)),setTimeout(function(){h._send(c,e)},i)}else h.end(g.status);else e.retry=0,e.end==e.size-1?h.end(g.status):(b.log("X-Last-Known-Byte: "+a),a&&(e.end=a),e.file.FileAPIReadPosition=e.end,setTimeout(function(){h._send(c,e)},0));g=null}},e.start=e.end+1,e.end=Math.max(Math.min(e.start+c.chunkSize,e.size)-1,e.start);var r=e.file,s=(r.slice||r.mozSlice||r.webkitSlice).call(r,e.start,e.end+1);e.size&&!s.size?setTimeout(function(){h.end(-1)}):(g.setRequestHeader("Content-Range","bytes "+e.start+"-"+e.end+"/"+e.size),g.setRequestHeader("Content-Disposition","attachment; filename="+encodeURIComponent(e.name)),g.setRequestHeader("Content-Type",e.type||"application/octet-stream"),g.send(s)),r=s=null}else if(g.upload&&g.upload.addEventListener("progress",b.throttle(function(a){c.progress(a,h,c)},100),!1),g.onreadystatechange=function(){if(h.status=g.status,h.statusText=g.statusText,h.readyState=g.readyState,4==g.readyState){for(var a in f)h["response"+a]=g["response"+a];if(g.onreadystatechange=null,!g.status||g.status>201)if(b.log("Error: "+g.status),(!g.status&&!g.aborted||500==g.status)&&(c.retry||0)=0?a+"px":a}function d(a){var b,c=f.createElement("canvas"),d=!1;try{b=c.getContext("2d"),b.drawImage(a,0,0,1,1),d=255!=b.getImageData(0,0,1,1).data[4]}catch(e){}return d}var e=a.URL||a.webkitURL,f=a.document,g=a.navigator,h=g.getUserMedia||g.webkitGetUserMedia||g.mozGetUserMedia||g.msGetUserMedia,i=!!h;b.support.media=i;var j=function(a){this.video=a};j.prototype={isActive:function(){return!!this._active},start:function(a){var b,c,f=this,i=f.video,j=function(d){f._active=!d,clearTimeout(c),clearTimeout(b),a&&a(d,f)};h.call(g,{video:!0},function(a){f.stream=a,i.src=e.createObjectURL(a),b=setInterval(function(){d(i)&&j(null)},1e3),c=setTimeout(function(){j("timeout")},5e3),i.play()},j)},stop:function(){try{this._active=!1,this.video.pause(),this.stream.stop()}catch(a){}},shot:function(){return new k(this.video)}},j.get=function(a){return new j(a.firstChild)},j.publish=function(d,e,g){"function"==typeof e&&(g=e,e={}),e=b.extend({},{width:"100%",height:"100%",start:!0},e),d.jquery&&(d=d[0]); var h=function(a){if(a)g(a);else{var b=j.get(d);e.start?b.start(g):g(null,b)}};if(d.style.width=c(e.width),d.style.height=c(e.height),b.html5&&i){var k=f.createElement("video");k.style.width=c(e.width),k.style.height=c(e.height),a.jQuery?jQuery(d).empty():d.innerHTML="",d.appendChild(k),h()}else j.fallback(d,e,h)},j.fallback=function(a,b,c){c("not_support_camera")};var k=function(a){var c=a.nodeName?b.Image.toCanvas(a):a,d=b.Image(c);return d.type="image/png",d.width=c.width,d.height=c.height,d.size=c.width*c.height*4,d};j.Shot=k,b.Camera=j}(window,FileAPI),function(a,b,c){"use strict";var d=c.each,e=[];!c.support.flash||!c.media||c.support.media&&c.html5||!function(){function a(a){var b=a.wid=c.uid();return c.Flash._fn[b]=a,"FileAPI.Flash._fn."+b}function b(a){try{c.Flash._fn[a.wid]=null,delete c.Flash._fn[a.wid]}catch(b){}}var f=c.Flash;c.extend(c.Flash,{patchCamera:function(){c.Camera.fallback=function(d,e,g){var h=c.uid();c.log("FlashAPI.Camera.publish: "+h),f.publish(d,h,c.extend(e,{camera:!0,onEvent:a(function i(a){"camera"===a.type&&(b(i),a.error?(c.log("FlashAPI.Camera.publish.error: "+a.error),g(a.error)):(c.log("FlashAPI.Camera.publish.success: "+h),g(null)))})}))},d(e,function(a){c.Camera.fallback.apply(c.Camera,a)}),e=[],c.extend(c.Camera.prototype,{_id:function(){return this.video.id},start:function(d){var e=this;f.cmd(this._id(),"camera.on",{callback:a(function g(a){b(g),a.error?(c.log("FlashAPI.camera.on.error: "+a.error),d(a.error,e)):(c.log("FlashAPI.camera.on.success: "+e._id()),e._active=!0,d(null,e))})})},stop:function(){this._active=!1,f.cmd(this._id(),"camera.off")},shot:function(){c.log("FlashAPI.Camera.shot:",this._id());var a=c.Flash.cmd(this._id(),"shot",{});return a.type="image/png",a.flashId=this._id(),a.isShot=!0,new c.Camera.Shot(a)}})}}),c.Camera.fallback=function(){e.push(arguments)}}()}(window,window.jQuery,FileAPI),"function"==typeof define&&define.amd&&define("FileAPI",[],function(){return FileAPI});PK!hb(abilian/web/resources/fileapi/FileAPI.js/*! FileAPI 2.0.11 - BSD | git://github.com/mailru/FileAPI.git * FileAPI — a set of javascript tools for working with files. Multiupload, drag'n'drop and chunked file upload. Images: crop, resize and auto orientation by EXIF. */ /* * JavaScript Canvas to Blob 2.0.5 * https://github.com/blueimp/JavaScript-Canvas-to-Blob * * Copyright 2012, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT * * Based on stackoverflow user Stoive's code snippet: * http://stackoverflow.com/q/4998908 */ /*jslint nomen: true, regexp: true */ /*global window, atob, Blob, ArrayBuffer, Uint8Array */ (function (window) { 'use strict'; var CanvasPrototype = window.HTMLCanvasElement && window.HTMLCanvasElement.prototype, hasBlobConstructor = window.Blob && (function () { try { return Boolean(new Blob()); } catch (e) { return false; } }()), hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && (function () { try { return new Blob([new Uint8Array(100)]).size === 100; } catch (e) { return false; } }()), BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob && window.ArrayBuffer && window.Uint8Array && function (dataURI) { var byteString, arrayBuffer, intArray, i, mimeString, bb; if (dataURI.split(',')[0].indexOf('base64') >= 0) { // Convert base64 to raw binary data held in a string: byteString = atob(dataURI.split(',')[1]); } else { // Convert base64/URLEncoded data component to raw binary data: byteString = decodeURIComponent(dataURI.split(',')[1]); } // Write the bytes of the string to an ArrayBuffer: arrayBuffer = new ArrayBuffer(byteString.length); intArray = new Uint8Array(arrayBuffer); for (i = 0; i < byteString.length; i += 1) { intArray[i] = byteString.charCodeAt(i); } // Separate out the mime component: mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // Write the ArrayBuffer (or ArrayBufferView) to a blob: if (hasBlobConstructor) { return new Blob( [hasArrayBufferViewSupport ? intArray : arrayBuffer], {type: mimeString} ); } bb = new BlobBuilder(); bb.append(arrayBuffer); return bb.getBlob(mimeString); }; if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) { if (CanvasPrototype.mozGetAsFile) { CanvasPrototype.toBlob = function (callback, type, quality) { if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) { callback(dataURLtoBlob(this.toDataURL(type, quality))); } else { callback(this.mozGetAsFile('blob', type)); } }; } else if (CanvasPrototype.toDataURL && dataURLtoBlob) { CanvasPrototype.toBlob = function (callback, type, quality) { callback(dataURLtoBlob(this.toDataURL(type, quality))); }; } } window.dataURLtoBlob = dataURLtoBlob; })(window); /*jslint evil: true */ /*global window, URL, webkitURL, ActiveXObject */ (function (window, undef){ 'use strict'; var gid = 1, noop = function (){}, document = window.document, doctype = document.doctype || {}, userAgent = window.navigator.userAgent, safari = /safari\//i.test(userAgent) && !/chrome\//i.test(userAgent), // https://github.com/blueimp/JavaScript-Load-Image/blob/master/load-image.js#L48 apiURL = (window.createObjectURL && window) || (window.URL && URL.revokeObjectURL && URL) || (window.webkitURL && webkitURL), Blob = window.Blob, File = window.File, FileReader = window.FileReader, FormData = window.FormData, XMLHttpRequest = window.XMLHttpRequest, jQuery = window.jQuery, html5 = !!(File && (FileReader && (window.Uint8Array || FormData || XMLHttpRequest.prototype.sendAsBinary))) && !(safari && /windows/i.test(userAgent)), // BugFix: https://github.com/mailru/FileAPI/issues/25 cors = html5 && ('withCredentials' in (new XMLHttpRequest)), chunked = html5 && !!Blob && !!(Blob.prototype.webkitSlice || Blob.prototype.mozSlice || Blob.prototype.slice), normalize = ('' + ''.normalize).indexOf('[native code]') > 0, // https://github.com/blueimp/JavaScript-Canvas-to-Blob dataURLtoBlob = window.dataURLtoBlob, _rimg = /img/i, _rcanvas = /canvas/i, _rimgcanvas = /img|canvas/i, _rinput = /input/i, _rdata = /^data:[^,]+,/, _toString = {}.toString, Math = window.Math, _SIZE_CONST = function (pow){ pow = new window.Number(Math.pow(1024, pow)); pow.from = function (sz){ return Math.round(sz * this); }; return pow; }, _elEvents = {}, // element event listeners _infoReader = [], // list of file info processors _readerEvents = 'abort progress error load loadend', _xhrPropsExport = 'status statusText readyState response responseXML responseText responseBody'.split(' '), currentTarget = 'currentTarget', // for minimize preventDefault = 'preventDefault', // and this too _isArray = function (ar) { return ar && ('length' in ar); }, /** * Iterate over a object or array */ _each = function (obj, fn, ctx){ if( obj ){ if( _isArray(obj) ){ for( var i = 0, n = obj.length; i < n; i++ ){ if( i in obj ){ fn.call(ctx, obj[i], i, obj); } } } else { for( var key in obj ){ if( obj.hasOwnProperty(key) ){ fn.call(ctx, obj[key], key, obj); } } } } }, /** * Merge the contents of two or more objects together into the first object */ _extend = function (dst){ var args = arguments, i = 1, _ext = function (val, key){ dst[key] = val; }; for( ; i < args.length; i++ ){ _each(args[i], _ext); } return dst; }, /** * Add event listener */ _on = function (el, type, fn){ if( el ){ var uid = api.uid(el); if( !_elEvents[uid] ){ _elEvents[uid] = {}; } var isFileReader = (FileReader && el) && (el instanceof FileReader); _each(type.split(/\s+/), function (type){ if( jQuery && !isFileReader){ jQuery.event.add(el, type, fn); } else { if( !_elEvents[uid][type] ){ _elEvents[uid][type] = []; } _elEvents[uid][type].push(fn); if( el.addEventListener ){ el.addEventListener(type, fn, false); } else if( el.attachEvent ){ el.attachEvent('on'+type, fn); } else { el['on'+type] = fn; } } }); } }, /** * Remove event listener */ _off = function (el, type, fn){ if( el ){ var uid = api.uid(el), events = _elEvents[uid] || {}; var isFileReader = (FileReader && el) && (el instanceof FileReader); _each(type.split(/\s+/), function (type){ if( jQuery && !isFileReader){ jQuery.event.remove(el, type, fn); } else { var fns = events[type] || [], i = fns.length; while( i-- ){ if( fns[i] === fn ){ fns.splice(i, 1); break; } } if( el.addEventListener ){ el.removeEventListener(type, fn, false); } else if( el.detachEvent ){ el.detachEvent('on'+type, fn); } else { el['on'+type] = null; } } }); } }, _one = function(el, type, fn){ _on(el, type, function _(evt){ _off(el, type, _); fn(evt); }); }, _fixEvent = function (evt){ if( !evt.target ){ evt.target = window.event && window.event.srcElement || document; } if( evt.target.nodeType === 3 ){ evt.target = evt.target.parentNode; } return evt; }, _supportInputAttr = function (attr){ var input = document.createElement('input'); input.setAttribute('type', "file"); return attr in input; }, /** * FileAPI (core object) */ api = { version: '2.0.11', cors: false, html5: true, media: false, formData: true, multiPassResize: true, debug: false, pingUrl: false, multiFlash: false, flashAbortTimeout: 0, withCredentials: true, staticPath: './dist/', flashUrl: 0, // @default: './FileAPI.flash.swf' flashImageUrl: 0, // @default: './FileAPI.flash.image.swf' postNameConcat: function (name, idx){ return name + (idx != null ? '['+ idx +']' : ''); }, ext2mime: { jpg: 'image/jpeg' , tif: 'image/tiff' , txt: 'text/plain' }, // Fallback for flash accept: { 'image/*': 'art bm bmp dwg dxf cbr cbz fif fpx gif ico iefs jfif jpe jpeg jpg jps jut mcf nap nif pbm pcx pgm pict pm png pnm qif qtif ras rast rf rp svf tga tif tiff xbm xbm xpm xwd' , 'audio/*': 'm4a flac aac rm mpa wav wma ogg mp3 mp2 m3u mod amf dmf dsm far gdm imf it m15 med okt s3m stm sfx ult uni xm sid ac3 dts cue aif aiff wpl ape mac mpc mpp shn wv nsf spc gym adplug adx dsp adp ymf ast afc hps xs' , 'video/*': 'm4v 3gp nsv ts ty strm rm rmvb m3u ifo mov qt divx xvid bivx vob nrg img iso pva wmv asf asx ogm m2v avi bin dat dvr-ms mpg mpeg mp4 mkv avc vp3 svq3 nuv viv dv fli flv wpl' }, uploadRetry : 0, networkDownRetryTimeout : 5000, // milliseconds, don't flood when network is down chunkSize : 0, chunkUploadRetry : 0, chunkNetworkDownRetryTimeout : 2000, // milliseconds, don't flood when network is down KB: _SIZE_CONST(1), MB: _SIZE_CONST(2), GB: _SIZE_CONST(3), TB: _SIZE_CONST(4), EMPTY_PNG: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII=', expando: 'fileapi' + (new Date).getTime(), uid: function (obj){ return obj ? (obj[api.expando] = obj[api.expando] || api.uid()) : (++gid, api.expando + gid) ; }, log: function (){ if( api.debug && window.console && console.log ){ if( console.log.apply ){ console.log.apply(console, arguments); } else { console.log([].join.call(arguments, ' ')); } } }, /** * Create new image * * @param {String} [src] * @param {Function} [fn] 1. error -- boolean, 2. img -- Image element * @returns {HTMLElement} */ newImage: function (src, fn){ var img = document.createElement('img'); if( fn ){ api.event.one(img, 'error load', function (evt){ fn(evt.type == 'error', img); img = null; }); } img.src = src; return img; }, /** * Get XHR * @returns {XMLHttpRequest} */ getXHR: function (){ var xhr; if( XMLHttpRequest ){ xhr = new XMLHttpRequest; } else if( window.ActiveXObject ){ try { xhr = new ActiveXObject('MSXML2.XMLHttp.3.0'); } catch (e) { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } } return xhr; }, isArray: _isArray, support: { dnd: cors && ('ondrop' in document.createElement('div')), cors: cors, html5: html5, chunked: chunked, dataURI: true, accept: _supportInputAttr('accept'), multiple: _supportInputAttr('multiple') }, event: { on: _on , off: _off , one: _one , fix: _fixEvent }, throttle: function(fn, delay) { var id, args; return function _throttle(){ args = arguments; if( !id ){ fn.apply(window, args); id = setTimeout(function (){ id = 0; fn.apply(window, args); }, delay); } }; }, F: function (){}, parseJSON: function (str){ var json; if( window.JSON && JSON.parse ){ json = JSON.parse(str); } else { json = (new Function('return ('+str.replace(/([\r\n])/g, '\\$1')+');'))(); } return json; }, trim: function (str){ str = String(str); return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ''); }, /** * Simple Defer * @return {Object} */ defer: function (){ var list = [] , result , error , defer = { resolve: function (err, res){ defer.resolve = noop; error = err || false; result = res; while( res = list.shift() ){ res(error, result); } }, then: function (fn){ if( error !== undef ){ fn(error, result); } else { list.push(fn); } } }; return defer; }, queue: function (fn){ var _idx = 0 , _length = 0 , _fail = false , _end = false , queue = { inc: function (){ _length++; }, next: function (){ _idx++; setTimeout(queue.check, 0); }, check: function (){ (_idx >= _length) && !_fail && queue.end(); }, isFail: function (){ return _fail; }, fail: function (){ !_fail && fn(_fail = true); }, end: function (){ if( !_end ){ _end = true; fn(); } } } ; return queue; }, /** * For each object * * @param {Object|Array} obj * @param {Function} fn * @param {*} [ctx] */ each: _each, /** * Async for * @param {Array} array * @param {Function} callback */ afor: function (array, callback){ var i = 0, n = array.length; if( _isArray(array) && n-- ){ (function _next(){ callback(n != i && _next, array[i], i++); })(); } else { callback(false); } }, /** * Merge the contents of two or more objects together into the first object * * @param {Object} dst * @return {Object} */ extend: _extend, /** * Is file? * @param {File} file * @return {Boolean} */ isFile: function (file){ return _toString.call(file) === '[object File]'; }, /** * Is blob? * @param {Blob} blob * @returns {Boolean} */ isBlob: function (blob) { return this.isFile(blob) || (_toString.call(blob) === '[object Blob]'); }, /** * Is canvas element * * @param {HTMLElement} el * @return {Boolean} */ isCanvas: function (el){ return el && _rcanvas.test(el.nodeName); }, getFilesFilter: function (filter){ filter = typeof filter == 'string' ? filter : (filter.getAttribute && filter.getAttribute('accept') || ''); return filter ? new RegExp('('+ filter.replace(/\./g, '\\.').replace(/,/g, '|') +')$', 'i') : /./; }, /** * Read as DataURL * * @param {File|Element} file * @param {Function} fn */ readAsDataURL: function (file, fn){ if( api.isCanvas(file) ){ _emit(file, fn, 'load', api.toDataURL(file)); } else { _readAs(file, fn, 'DataURL'); } }, /** * Read as Binary string * * @param {File} file * @param {Function} fn */ readAsBinaryString: function (file, fn){ if( _hasSupportReadAs('BinaryString') ){ _readAs(file, fn, 'BinaryString'); } else { // Hello IE10! _readAs(file, function (evt){ if( evt.type == 'load' ){ try { // dataURL -> binaryString evt.result = api.toBinaryString(evt.result); } catch (e){ evt.type = 'error'; evt.message = e.toString(); } } fn(evt); }, 'DataURL'); } }, /** * Read as ArrayBuffer * * @param {File} file * @param {Function} fn */ readAsArrayBuffer: function(file, fn){ _readAs(file, fn, 'ArrayBuffer'); }, /** * Read as text * * @param {File} file * @param {String} encoding * @param {Function} [fn] */ readAsText: function(file, encoding, fn){ if( !fn ){ fn = encoding; encoding = 'utf-8'; } _readAs(file, fn, 'Text', encoding); }, /** * Convert image or canvas to DataURL * * @param {Element} el Image or Canvas element * @param {String} [type] mime-type * @return {String} */ toDataURL: function (el, type){ if( typeof el == 'string' ){ return el; } else if( el.toDataURL ){ return el.toDataURL(type || 'image/png'); } }, /** * Canvert string, image or canvas to binary string * * @param {String|Element} val * @return {String} */ toBinaryString: function (val){ return window.atob(api.toDataURL(val).replace(_rdata, '')); }, /** * Read file or DataURL as ImageElement * * @param {File|String} file * @param {Function} fn * @param {Boolean} [progress] */ readAsImage: function (file, fn, progress){ if( api.isFile(file) ){ if( apiURL ){ /** @namespace apiURL.createObjectURL */ var data = apiURL.createObjectURL(file); if( data === undef ){ _emit(file, fn, 'error'); } else { api.readAsImage(data, fn, progress); } } else { api.readAsDataURL(file, function (evt){ if( evt.type == 'load' ){ api.readAsImage(evt.result, fn, progress); } else if( progress || evt.type == 'error' ){ _emit(file, fn, evt, null, { loaded: evt.loaded, total: evt.total }); } }); } } else if( api.isCanvas(file) ){ _emit(file, fn, 'load', file); } else if( _rimg.test(file.nodeName) ){ if( file.complete ){ _emit(file, fn, 'load', file); } else { var events = 'error abort load'; _one(file, events, function _fn(evt){ if( evt.type == 'load' && apiURL ){ /** @namespace apiURL.revokeObjectURL */ apiURL.revokeObjectURL(file.src); } _off(file, events, _fn); _emit(file, fn, evt, file); }); } } else if( file.iframe ){ _emit(file, fn, { type: 'error' }); } else { // Created image var img = api.newImage(file.dataURL || file); api.readAsImage(img, fn, progress); } }, /** * Make file by name * * @param {String} name * @return {Array} */ checkFileObj: function (name){ var file = {}, accept = api.accept; if( typeof name == 'object' ){ file = name; } else { file.name = (name + '').split(/\\|\//g).pop(); } if( file.type == null ){ file.type = file.name.split('.').pop(); } _each(accept, function (ext, type){ ext = new RegExp(ext.replace(/\s/g, '|'), 'i'); if( ext.test(file.type) || api.ext2mime[file.type] ){ file.type = api.ext2mime[file.type] || (type.split('/')[0] +'/'+ file.type); } }); return file; }, /** * Get drop files * * @param {Event} evt * @param {Function} callback */ getDropFiles: function (evt, callback){ var files = [] , all = [] , items , dataTransfer = _getDataTransfer(evt) , transFiles = dataTransfer.files , transItems = dataTransfer.items , entrySupport = _isArray(transItems) && transItems[0] && _getAsEntry(transItems[0]) , queue = api.queue(function (){ callback(files, all); }) ; if( entrySupport ){ if( normalize && transFiles ){ var i = transFiles.length , file , entry ; items = new Array(i); while( i-- ){ file = transFiles[i]; try { entry = _getAsEntry(transItems[i]); } catch( err ){ api.log('[err] getDropFiles: ', err); entry = null; } if( _isEntry(entry) ){ // OSX filesystems use Unicode Normalization Form D (NFD), // and entry.file(…) can't read the files with the same names if( entry.isDirectory || (entry.isFile && file.name == file.name.normalize('NFC')) ){ items[i] = entry; } else { items[i] = file; } } else { items[i] = file; } } } else { items = transItems; } } else { items = transFiles; } _each(items || [], function (item){ queue.inc(); try { if( entrySupport && _isEntry(item) ){ _readEntryAsFiles(item, function (err, entryFiles, allEntries){ if( err ){ api.log('[err] getDropFiles:', err); } else { files.push.apply(files, entryFiles); } all.push.apply(all, allEntries); queue.next(); }); } else { _isRegularFile(item, function (yes, err){ if( yes ){ files.push(item); } else { item.error = err; } all.push(item); queue.next(); }); } } catch( err ){ queue.next(); api.log('[err] getDropFiles: ', err); } }); queue.check(); }, /** * Get file list * * @param {HTMLInputElement|Event} input * @param {String|Function} [filter] * @param {Function} [callback] * @return {Array|Null} */ getFiles: function (input, filter, callback){ var files = []; if( callback ){ api.filterFiles(api.getFiles(input), filter, callback); return null; } if( input.jquery ){ // jQuery object input.each(function (){ files = files.concat(api.getFiles(this)); }); input = files; files = []; } if( typeof filter == 'string' ){ filter = api.getFilesFilter(filter); } if( input.originalEvent ){ // jQuery event input = _fixEvent(input.originalEvent); } else if( input.srcElement ){ // IE Event input = _fixEvent(input); } if( input.dataTransfer ){ // Drag'n'Drop input = input.dataTransfer; } else if( input.target ){ // Event input = input.target; } if( input.files ){ // Input[type="file"] files = input.files; if( !html5 ){ // Partial support for file api files[0].blob = input; files[0].iframe = true; } } else if( !html5 && isInputFile(input) ){ if( api.trim(input.value) ){ files = [api.checkFileObj(input.value)]; files[0].blob = input; files[0].iframe = true; } } else if( _isArray(input) ){ files = input; } return api.filter(files, function (file){ return !filter || filter.test(file.name); }); }, /** * Get total file size * @param {Array} files * @return {Number} */ getTotalSize: function (files){ var size = 0, i = files && files.length; while( i-- ){ size += files[i].size; } return size; }, /** * Get image information * * @param {File} file * @param {Function} fn */ getInfo: function (file, fn){ var info = {}, readers = _infoReader.concat(); if( api.isFile(file) ){ (function _next(){ var reader = readers.shift(); if( reader ){ if( reader.test(file.type) ){ reader(file, function (err, res){ if( err ){ fn(err); } else { _extend(info, res); _next(); } }); } else { _next(); } } else { fn(false, info); } })(); } else { fn('not_support_info', info); } }, /** * Add information reader * * @param {RegExp} mime * @param {Function} fn */ addInfoReader: function (mime, fn){ fn.test = function (type){ return mime.test(type); }; _infoReader.push(fn); }, /** * Filter of array * * @param {Array} input * @param {Function} fn * @return {Array} */ filter: function (input, fn){ var result = [], i = 0, n = input.length, val; for( ; i < n; i++ ){ if( i in input ){ val = input[i]; if( fn.call(val, val, i, input) ){ result.push(val); } } } return result; }, /** * Filter files * * @param {Array} files * @param {Function} eachFn * @param {Function} resultFn */ filterFiles: function (files, eachFn, resultFn){ if( files.length ){ // HTML5 or Flash var queue = files.concat(), file, result = [], deleted = []; (function _next(){ if( queue.length ){ file = queue.shift(); api.getInfo(file, function (err, info){ (eachFn(file, err ? false : info) ? result : deleted).push(file); _next(); }); } else { resultFn(result, deleted); } })(); } else { resultFn([], files); } }, upload: function (options){ options = _extend({ jsonp: 'callback' , prepare: api.F , beforeupload: api.F , upload: api.F , fileupload: api.F , fileprogress: api.F , filecomplete: api.F , progress: api.F , complete: api.F , pause: api.F , imageOriginal: true , chunkSize: api.chunkSize , chunkUploadRetry: api.chunkUploadRetry , uploadRetry: api.uploadRetry }, options); if( options.imageAutoOrientation && !options.imageTransform ){ options.imageTransform = { rotate: 'auto' }; } var proxyXHR = new api.XHR(options) , dataArray = this._getFilesDataArray(options.files) , _this = this , _total = 0 , _loaded = 0 , _nextFile , _complete = false ; // calc total size _each(dataArray, function (data){ _total += data.size; }); // Array of files proxyXHR.files = []; _each(dataArray, function (data){ proxyXHR.files.push(data.file); }); // Set upload status props proxyXHR.total = _total; proxyXHR.loaded = 0; proxyXHR.filesLeft = dataArray.length; // emit "beforeupload" event options.beforeupload(proxyXHR, options); // Upload by file _nextFile = function (){ var data = dataArray.shift() , _file = data && data.file , _fileLoaded = false , _fileOptions = _simpleClone(options) ; proxyXHR.filesLeft = dataArray.length; if( _file && _file.name === api.expando ){ _file = null; api.log('[warn] FileAPI.upload() — called without files'); } if( ( proxyXHR.statusText != 'abort' || proxyXHR.current ) && data ){ // Mark active job _complete = false; // Set current upload file proxyXHR.currentFile = _file; // Prepare file options if (_file && options.prepare(_file, _fileOptions) === false) { _nextFile.call(_this); return; } _fileOptions.file = _file; _this._getFormData(_fileOptions, data, function (form){ if( !_loaded ){ // emit "upload" event options.upload(proxyXHR, options); } var xhr = new api.XHR(_extend({}, _fileOptions, { upload: _file ? function (){ // emit "fileupload" event options.fileupload(_file, xhr, _fileOptions); } : noop, progress: _file ? function (evt){ if( !_fileLoaded ){ // For ignore the double calls. _fileLoaded = (evt.loaded === evt.total); // emit "fileprogress" event options.fileprogress({ type: 'progress' , total: data.total = evt.total , loaded: data.loaded = evt.loaded }, _file, xhr, _fileOptions); // emit "progress" event options.progress({ type: 'progress' , total: _total , loaded: proxyXHR.loaded = (_loaded + data.size * (evt.loaded/evt.total)) || 0 }, _file, xhr, _fileOptions); } } : noop, complete: function (err){ _each(_xhrPropsExport, function (name){ proxyXHR[name] = xhr[name]; }); if( _file ){ data.total = (data.total || data.size); data.loaded = data.total; if( !err ) { // emulate 100% "progress" this.progress(data); // fixed throttle event _fileLoaded = true; // bytes loaded _loaded += data.size; // data.size != data.total, it's desirable fix this proxyXHR.loaded = _loaded; } // emit "filecomplete" event options.filecomplete(err, xhr, _file, _fileOptions); } // upload next file setTimeout(function () {_nextFile.call(_this);}, 0); } })); // xhr // ... proxyXHR.abort = function (current){ if (!current) { dataArray.length = 0; } this.current = current; xhr.abort(); }; // Start upload xhr.send(form); }); } else { var successful = proxyXHR.status == 200 || proxyXHR.status == 201 || proxyXHR.status == 204; options.complete(successful ? false : (proxyXHR.statusText || 'error'), proxyXHR, options); // Mark done state _complete = true; } }; // Next tick setTimeout(_nextFile, 0); // Append more files to the existing request // first - add them to the queue head/tail proxyXHR.append = function (files, first) { files = api._getFilesDataArray([].concat(files)); _each(files, function (data) { _total += data.size; proxyXHR.files.push(data.file); if (first) { dataArray.unshift(data); } else { dataArray.push(data); } }); proxyXHR.statusText = ""; if( _complete ){ _nextFile.call(_this); } }; // Removes file from queue by file reference and returns it proxyXHR.remove = function (file) { var i = dataArray.length, _file; while( i-- ){ if( dataArray[i].file == file ){ _file = dataArray.splice(i, 1); _total -= _file.size; } } return _file; }; return proxyXHR; }, _getFilesDataArray: function (data){ var files = [], oFiles = {}; if( isInputFile(data) ){ var tmp = api.getFiles(data); oFiles[data.name || 'file'] = data.getAttribute('multiple') !== null ? tmp : tmp[0]; } else if( _isArray(data) && isInputFile(data[0]) ){ _each(data, function (input){ oFiles[input.name || 'file'] = api.getFiles(input); }); } else { oFiles = data; } _each(oFiles, function add(file, name){ if( _isArray(file) ){ _each(file, function (file){ add(file, name); }); } else if( file && (file.name || file.image) ){ files.push({ name: name , file: file , size: file.size , total: file.size , loaded: 0 }); } }); if( !files.length ){ // Create fake `file` object files.push({ file: { name: api.expando } }); } return files; }, _getFormData: function (options, data, fn){ var file = data.file , name = data.name , filename = file.name , filetype = file.type , trans = api.support.transform && options.imageTransform , Form = new api.Form , queue = api.queue(function (){ fn(Form); }) , isOrignTrans = trans && _isOriginTransform(trans) , postNameConcat = api.postNameConcat ; // Append data _each(options.data, function add(val, name){ if( typeof val == 'object' ){ _each(val, function (v, i){ add(v, postNameConcat(name, i)); }); } else { Form.append(name, val); } }); (function _addFile(file/**Object*/){ if( file.image ){ // This is a FileAPI.Image queue.inc(); file.toData(function (err, image){ // @todo: error filename = filename || (new Date).getTime()+'.png'; _addFile(image); queue.next(); }); } else if( api.Image && trans && (/^image/.test(file.type) || _rimgcanvas.test(file.nodeName)) ){ queue.inc(); if( isOrignTrans ){ // Convert to array for transform function trans = [trans]; } api.Image.transform(file, trans, options.imageAutoOrientation, function (err, images){ if( isOrignTrans && !err ){ if( !dataURLtoBlob && !api.flashEngine ){ // Canvas.toBlob or Flash not supported, use multipart Form.multipart = true; } Form.append(name, images[0], filename, trans[0].type || filetype); } else { var addOrigin = 0; if( !err ){ _each(images, function (image, idx){ if( !dataURLtoBlob && !api.flashEngine ){ Form.multipart = true; } if( !trans[idx].postName ){ addOrigin = 1; } Form.append(trans[idx].postName || postNameConcat(name, idx), image, filename, trans[idx].type || filetype); }); } if( err || options.imageOriginal ){ Form.append(postNameConcat(name, (addOrigin ? 'original' : null)), file, filename, filetype); } } queue.next(); }); } else if( filename !== api.expando ){ Form.append(name, file, filename); } })(file); queue.check(); }, reset: function (inp, notRemove){ var parent, clone; if( jQuery ){ clone = jQuery(inp).clone(true).insertBefore(inp).val('')[0]; if( !notRemove ){ jQuery(inp).remove(); } } else { parent = inp.parentNode; clone = parent.insertBefore(inp.cloneNode(true), inp); clone.value = ''; if( !notRemove ){ parent.removeChild(inp); } _each(_elEvents[api.uid(inp)], function (fns, type){ _each(fns, function (fn){ _off(inp, type, fn); _on(clone, type, fn); }); }); } return clone; }, /** * Load remote file * * @param {String} url * @param {Function} fn * @return {XMLHttpRequest} */ load: function (url, fn){ var xhr = api.getXHR(); if( xhr ){ xhr.open('GET', url, true); if( xhr.overrideMimeType ){ xhr.overrideMimeType('text/plain; charset=x-user-defined'); } _on(xhr, 'progress', function (/**Event*/evt){ /** @namespace evt.lengthComputable */ if( evt.lengthComputable ){ fn({ type: evt.type, loaded: evt.loaded, total: evt.total }, xhr); } }); xhr.onreadystatechange = function(){ if( xhr.readyState == 4 ){ xhr.onreadystatechange = null; if( xhr.status == 200 ){ url = url.split('/'); /** @namespace xhr.responseBody */ var file = { name: url[url.length-1] , size: xhr.getResponseHeader('Content-Length') , type: xhr.getResponseHeader('Content-Type') }; file.dataURL = 'data:'+file.type+';base64,' + api.encode64(xhr.responseBody || xhr.responseText); fn({ type: 'load', result: file }, xhr); } else { fn({ type: 'error' }, xhr); } } }; xhr.send(null); } else { fn({ type: 'error' }); } return xhr; }, encode64: function (str){ var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=', outStr = '', i = 0; if( typeof str !== 'string' ){ str = String(str); } while( i < str.length ){ //all three "& 0xff" added below are there to fix a known bug //with bytes returned by xhr.responseText var byte1 = str.charCodeAt(i++) & 0xff , byte2 = str.charCodeAt(i++) & 0xff , byte3 = str.charCodeAt(i++) & 0xff , enc1 = byte1 >> 2 , enc2 = ((byte1 & 3) << 4) | (byte2 >> 4) , enc3, enc4 ; if( isNaN(byte2) ){ enc3 = enc4 = 64; } else { enc3 = ((byte2 & 15) << 2) | (byte3 >> 6); enc4 = isNaN(byte3) ? 64 : byte3 & 63; } outStr += b64.charAt(enc1) + b64.charAt(enc2) + b64.charAt(enc3) + b64.charAt(enc4); } return outStr; } } // api ; function _emit(target, fn, name, res, ext){ var evt = { type: name.type || name , target: target , result: res }; _extend(evt, ext); fn(evt); } function _hasSupportReadAs(method){ return FileReader && !!FileReader.prototype['readAs' + method]; } function _readAs(file, fn, method, encoding){ if( api.isBlob(file) && _hasSupportReadAs(method) ){ var Reader = new FileReader; // Add event listener _on(Reader, _readerEvents, function _fn(evt){ var type = evt.type; if( type == 'progress' ){ _emit(file, fn, evt, evt.target.result, { loaded: evt.loaded, total: evt.total }); } else if( type == 'loadend' ){ _off(Reader, _readerEvents, _fn); Reader = null; } else { _emit(file, fn, evt, evt.target.result); } }); try { // ReadAs ... if( encoding ){ Reader['readAs' + method](file, encoding); } else { Reader['readAs' + method](file); } } catch (err){ _emit(file, fn, 'error', undef, { error: err.toString() }); } } else { _emit(file, fn, 'error', undef, { error: 'filreader_not_support_' + method }); } } function _isRegularFile(file, callback){ // http://stackoverflow.com/questions/8856628/detecting-folders-directories-in-javascript-filelist-objects if( !file.type && (safari || ((file.size % 4096) === 0 && (file.size <= 102400))) ){ if( FileReader ){ try { var reader = new FileReader(); _one(reader, _readerEvents, function (evt){ var isFile = evt.type != 'error'; if( isFile ){ reader.abort(); callback(isFile); } else { callback(false, reader.error); } }); reader.readAsDataURL(file); } catch( err ){ callback(false, err); } } else { callback(null, new Error('FileReader is not supported')); } } else { callback(true); } } function _isEntry(item){ return item && (item.isFile || item.isDirectory); } function _getAsEntry(item){ var entry; if( item.getAsEntry ){ entry = item.getAsEntry(); } else if( item.webkitGetAsEntry ){ entry = item.webkitGetAsEntry(); } return entry; } function _readEntryAsFiles(entry, callback){ if( !entry ){ // error var err = new Error('invalid entry'); entry = new Object(entry); entry.error = err; callback(err.message, [], [entry]); } else if( entry.isFile ){ // Read as file entry.file(function (file){ // success file.fullPath = entry.fullPath; callback(false, [file], [file]); }, function (err){ // error entry.error = err; callback('FileError.code: ' + err.code, [], [entry]); }); } else if( entry.isDirectory ){ var reader = entry.createReader() , firstAttempt = true , files = [] , all = [entry] ; var onerror = function (err){ // error entry.error = err; callback('DirectoryError.code: ' + err.code, files, all); }; var ondone = function ondone(entries){ if( firstAttempt ){ firstAttempt = false; if( !entries.length ){ entry.error = new Error('directory is empty'); } } // success if( entries.length ){ api.afor(entries, function (next, entry){ _readEntryAsFiles(entry, function (err, entryFiles, allEntries){ if( !err ){ files = files.concat(entryFiles); } all = all.concat(allEntries); if( next ){ next(); } else { reader.readEntries(ondone, onerror); } }); }); } else { callback(false, files, all); } }; reader.readEntries(ondone, onerror); } else { _readEntryAsFiles(_getAsEntry(entry), callback); } } function _simpleClone(obj){ var copy = {}; _each(obj, function (val, key){ if( val && (typeof val === 'object') && (val.nodeType === void 0) ){ val = _extend({}, val); } copy[key] = val; }); return copy; } function isInputFile(el){ return _rinput.test(el && el.tagName); } function _getDataTransfer(evt){ return (evt.originalEvent || evt || '').dataTransfer || {}; } function _isOriginTransform(trans){ var key; for( key in trans ){ if( trans.hasOwnProperty(key) ){ if( !(trans[key] instanceof Object || key === 'overlay' || key === 'filter') ){ return true; } } } return false; } // Add default image info reader api.addInfoReader(/^image/, function (file/**File*/, callback/**Function*/){ if( !file.__dimensions ){ var defer = file.__dimensions = api.defer(); api.readAsImage(file, function (evt){ var img = evt.target; defer.resolve(evt.type == 'load' ? false : 'error', { width: img.width , height: img.height }); img.src = api.EMPTY_PNG; img = null; }); } file.__dimensions.then(callback); }); /** * Drag'n'Drop special event * * @param {HTMLElement} el * @param {Function} onHover * @param {Function} onDrop */ api.event.dnd = function (el, onHover, onDrop){ var _id, _type; if( !onDrop ){ onDrop = onHover; onHover = api.F; } if( FileReader ){ // Hover _on(el, 'dragenter dragleave dragover', onHover.ff = onHover.ff || function (evt){ var types = _getDataTransfer(evt).types , i = types && types.length , debounceTrigger = false ; while( i-- ){ if( ~types[i].indexOf('File') ){ evt[preventDefault](); if( _type !== evt.type ){ _type = evt.type; // Store current type of event if( _type != 'dragleave' ){ onHover.call(evt[currentTarget], true, evt); } debounceTrigger = true; } break; // exit from "while" } } if( debounceTrigger ){ clearTimeout(_id); _id = setTimeout(function (){ onHover.call(evt[currentTarget], _type != 'dragleave', evt); }, 50); } }); // Drop _on(el, 'drop', onDrop.ff = onDrop.ff || function (evt){ evt[preventDefault](); _type = 0; onHover.call(evt[currentTarget], false, evt); api.getDropFiles(evt, function (files, all){ onDrop.call(evt[currentTarget], files, all, evt); }); }); } else { api.log("Drag'n'Drop -- not supported"); } }; /** * Remove drag'n'drop * @param {HTMLElement} el * @param {Function} onHover * @param {Function} onDrop */ api.event.dnd.off = function (el, onHover, onDrop){ _off(el, 'dragenter dragleave dragover', onHover.ff); _off(el, 'drop', onDrop.ff); }; // Support jQuery if( jQuery && !jQuery.fn.dnd ){ jQuery.fn.dnd = function (onHover, onDrop){ return this.each(function (){ api.event.dnd(this, onHover, onDrop); }); }; jQuery.fn.offdnd = function (onHover, onDrop){ return this.each(function (){ api.event.dnd.off(this, onHover, onDrop); }); }; } // @export window.FileAPI = _extend(api, window.FileAPI); // Debug info api.log('FileAPI: ' + api.version); api.log('protocol: ' + window.location.protocol); api.log('doctype: [' + doctype.name + '] ' + doctype.publicId + ' ' + doctype.systemId); // @detect 'x-ua-compatible' _each(document.getElementsByTagName('meta'), function (meta){ if( /x-ua-compatible/i.test(meta.getAttribute('http-equiv')) ){ api.log('meta.http-equiv: ' + meta.getAttribute('content')); } }); // @configuration if( !api.flashUrl ){ api.flashUrl = api.staticPath + 'FileAPI.flash.swf'; } if( !api.flashImageUrl ){ api.flashImageUrl = api.staticPath + 'FileAPI.flash.image.swf'; } if( !api.flashWebcamUrl ){ api.flashWebcamUrl = api.staticPath + 'FileAPI.flash.camera.swf'; } })(window, void 0); /*global window, FileAPI, document */ (function (api, document, undef) { 'use strict'; var min = Math.min, round = Math.round, getCanvas = function () { return document.createElement('canvas'); }, support = false, exifOrientation = { 8: 270 , 3: 180 , 6: 90 , 7: 270 , 4: 180 , 5: 90 } ; try { support = getCanvas().toDataURL('image/png').indexOf('data:image/png') > -1; } catch (e){} function Image(file){ if( file instanceof Image ){ var img = new Image(file.file); api.extend(img.matrix, file.matrix); return img; } else if( !(this instanceof Image) ){ return new Image(file); } this.file = file; this.size = file.size || 100; this.matrix = { sx: 0, sy: 0, sw: 0, sh: 0, dx: 0, dy: 0, dw: 0, dh: 0, resize: 0, // min, max OR preview deg: 0, quality: 1, // jpeg quality filter: 0 }; } Image.prototype = { image: true, constructor: Image, set: function (attrs){ api.extend(this.matrix, attrs); return this; }, crop: function (x, y, w, h){ if( w === undef ){ w = x; h = y; x = y = 0; } return this.set({ sx: x, sy: y, sw: w, sh: h || w }); }, resize: function (w, h, strategy){ if( /min|max|height|width/.test(h) ){ strategy = h; h = w; } return this.set({ dw: w, dh: h || w, resize: strategy }); }, preview: function (w, h){ return this.resize(w, h || w, 'preview'); }, rotate: function (deg){ return this.set({ deg: deg }); }, filter: function (filter){ return this.set({ filter: filter }); }, overlay: function (images){ return this.set({ overlay: images }); }, clone: function (){ return new Image(this); }, _load: function (image, fn){ var self = this; if( /img|video/i.test(image.nodeName) ){ fn.call(self, null, image); } else { api.readAsImage(image, function (evt){ fn.call(self, evt.type != 'load', evt.result); }); } }, _apply: function (image, fn){ var canvas = getCanvas() , m = this.getMatrix(image) , ctx = canvas.getContext('2d') , width = image.videoWidth || image.width , height = image.videoHeight || image.height , deg = m.deg , dw = m.dw , dh = m.dh , w = width , h = height , filter = m.filter , copy // canvas copy , buffer = image , overlay = m.overlay , queue = api.queue(function (){ image.src = api.EMPTY_PNG; fn(false, canvas); }) , renderImageToCanvas = api.renderImageToCanvas ; // Normalize angle deg = deg - Math.floor(deg/360)*360; // For `renderImageToCanvas` image._type = this.file.type; while(m.multipass && min(w/dw, h/dh) > 2 ){ w = (w/2 + 0.5)|0; h = (h/2 + 0.5)|0; copy = getCanvas(); copy.width = w; copy.height = h; if( buffer !== image ){ renderImageToCanvas(copy, buffer, 0, 0, buffer.width, buffer.height, 0, 0, w, h); buffer = copy; } else { buffer = copy; renderImageToCanvas(buffer, image, m.sx, m.sy, m.sw, m.sh, 0, 0, w, h); m.sx = m.sy = m.sw = m.sh = 0; } } canvas.width = (deg % 180) ? dh : dw; canvas.height = (deg % 180) ? dw : dh; canvas.type = m.type; canvas.quality = m.quality; ctx.rotate(deg * Math.PI / 180); renderImageToCanvas(ctx.canvas, buffer , m.sx, m.sy , m.sw || buffer.width , m.sh || buffer.height , (deg == 180 || deg == 270 ? -dw : 0) , (deg == 90 || deg == 180 ? -dh : 0) , dw, dh ); dw = canvas.width; dh = canvas.height; // Apply overlay overlay && api.each([].concat(overlay), function (over){ queue.inc(); // preload var img = new window.Image, fn = function (){ var x = over.x|0 , y = over.y|0 , w = over.w || img.width , h = over.h || img.height , rel = over.rel ; // center | right | left x = (rel == 1 || rel == 4 || rel == 7) ? (dw - w + x)/2 : (rel == 2 || rel == 5 || rel == 8 ? dw - (w + x) : x); // center | bottom | top y = (rel == 3 || rel == 4 || rel == 5) ? (dh - h + y)/2 : (rel >= 6 ? dh - (h + y) : y); api.event.off(img, 'error load abort', fn); try { ctx.globalAlpha = over.opacity || 1; ctx.drawImage(img, x, y, w, h); } catch (er){} queue.next(); }; api.event.on(img, 'error load abort', fn); img.src = over.src; if( img.complete ){ fn(); } }); if( filter ){ queue.inc(); Image.applyFilter(canvas, filter, queue.next); } queue.check(); }, getMatrix: function (image){ var m = api.extend({}, this.matrix) , sw = m.sw = m.sw || image.videoWidth || image.naturalWidth || image.width , sh = m.sh = m.sh || image.videoHeight || image.naturalHeight || image.height , dw = m.dw = m.dw || sw , dh = m.dh = m.dh || sh , sf = sw/sh, df = dw/dh , strategy = m.resize ; if( strategy == 'preview' ){ if( dw != sw || dh != sh ){ // Make preview var w, h; if( df >= sf ){ w = sw; h = w / df; } else { h = sh; w = h * df; } if( w != sw || h != sh ){ m.sx = ~~((sw - w)/2); m.sy = ~~((sh - h)/2); sw = w; sh = h; } } } else if( strategy == 'height' ){ dw = dh * sf; } else if( strategy == 'width' ){ dh = dw / sf; } else if( strategy ){ if( !(sw > dw || sh > dh) ){ dw = sw; dh = sh; } else if( strategy == 'min' ){ dw = round(sf < df ? min(sw, dw) : dh*sf); dh = round(sf < df ? dw/sf : min(sh, dh)); } else { dw = round(sf >= df ? min(sw, dw) : dh*sf); dh = round(sf >= df ? dw/sf : min(sh, dh)); } } m.sw = sw; m.sh = sh; m.dw = dw; m.dh = dh; m.multipass = api.multiPassResize; return m; }, _trans: function (fn){ this._load(this.file, function (err, image){ if( err ){ fn(err); } else { try { this._apply(image, fn); } catch (err){ api.log('[err] FileAPI.Image.fn._apply:', err); fn(err); } } }); }, get: function (fn){ if( api.support.transform ){ var _this = this, matrix = _this.matrix; if( matrix.deg == 'auto' ){ api.getInfo(_this.file, function (err, info){ // rotate by exif orientation matrix.deg = exifOrientation[info && info.exif && info.exif.Orientation] || 0; _this._trans(fn); }); } else { _this._trans(fn); } } else { fn('not_support_transform'); } return this; }, toData: function (fn){ return this.get(fn); } }; Image.exifOrientation = exifOrientation; Image.transform = function (file, transform, autoOrientation, fn){ function _transform(err, img){ // img -- info object var images = {} , queue = api.queue(function (err){ fn(err, images); }) ; if( !err ){ api.each(transform, function (params, name){ if( !queue.isFail() ){ var ImgTrans = new Image(img.nodeType ? img : file), isFn = typeof params == 'function'; if( isFn ){ params(img, ImgTrans); } else if( params.width ){ ImgTrans[params.preview ? 'preview' : 'resize'](params.width, params.height, params.strategy); } else { if( params.maxWidth && (img.width > params.maxWidth || img.height > params.maxHeight) ){ ImgTrans.resize(params.maxWidth, params.maxHeight, 'max'); } } if( params.crop ){ var crop = params.crop; ImgTrans.crop(crop.x|0, crop.y|0, crop.w || crop.width, crop.h || crop.height); } if( params.rotate === undef && autoOrientation ){ params.rotate = 'auto'; } ImgTrans.set({ type: ImgTrans.matrix.type || params.type || file.type || 'image/png' }); if( !isFn ){ ImgTrans.set({ deg: params.rotate , overlay: params.overlay , filter: params.filter , quality: params.quality || 1 }); } queue.inc(); ImgTrans.toData(function (err, image){ if( err ){ queue.fail(); } else { images[name] = image; queue.next(); } }); } }); } else { queue.fail(); } } // @todo: Оло-ло, нужно рефакторить это место if( file.width ){ _transform(false, file); } else { api.getInfo(file, _transform); } }; // @const api.each(['TOP', 'CENTER', 'BOTTOM'], function (x, i){ api.each(['LEFT', 'CENTER', 'RIGHT'], function (y, j){ Image[x+'_'+y] = i*3 + j; Image[y+'_'+x] = i*3 + j; }); }); /** * Trabsform element to canvas * * @param {Image|HTMLVideoElement} el * @returns {Canvas} */ Image.toCanvas = function(el){ var canvas = document.createElement('canvas'); canvas.width = el.videoWidth || el.width; canvas.height = el.videoHeight || el.height; canvas.getContext('2d').drawImage(el, 0, 0); return canvas; }; /** * Create image from DataURL * @param {String} dataURL * @param {Object} size * @param {Function} callback */ Image.fromDataURL = function (dataURL, size, callback){ var img = api.newImage(dataURL); api.extend(img, size); callback(img); }; /** * Apply filter (caman.js) * * @param {Canvas|Image} canvas * @param {String|Function} filter * @param {Function} doneFn */ Image.applyFilter = function (canvas, filter, doneFn){ if( typeof filter == 'function' ){ filter(canvas, doneFn); } else if( window.Caman ){ // http://camanjs.com/guides/ window.Caman(canvas.tagName == 'IMG' ? Image.toCanvas(canvas) : canvas, function (){ if( typeof filter == 'string' ){ this[filter](); } else { api.each(filter, function (val, method){ this[method](val); }, this); } this.render(doneFn); }); } }; /** * For load-image-ios.js */ api.renderImageToCanvas = function (canvas, img, sx, sy, sw, sh, dx, dy, dw, dh){ try { return canvas.getContext('2d').drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh); } catch (ex) { api.log('renderImageToCanvas failed'); throw ex; } }; // @export api.support.canvas = api.support.transform = support; api.Image = Image; })(FileAPI, document); /* * JavaScript Load Image iOS scaling fixes 1.0.3 * https://github.com/blueimp/JavaScript-Load-Image * * Copyright 2013, Sebastian Tschan * https://blueimp.net * * iOS image scaling fixes based on * https://github.com/stomita/ios-imagefile-megapixel * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ /*jslint nomen: true, bitwise: true */ /*global FileAPI, window, document */ (function (factory) { 'use strict'; factory(FileAPI); }(function (loadImage) { 'use strict'; // Only apply fixes on the iOS platform: if (!window.navigator || !window.navigator.platform || !(/iP(hone|od|ad)/).test(window.navigator.platform)) { return; } var originalRenderMethod = loadImage.renderImageToCanvas; // Detects subsampling in JPEG images: loadImage.detectSubsampling = function (img) { var canvas, context; if (img.width * img.height > 1024 * 1024) { // only consider mexapixel images canvas = document.createElement('canvas'); canvas.width = canvas.height = 1; context = canvas.getContext('2d'); context.drawImage(img, -img.width + 1, 0); // subsampled image becomes half smaller in rendering size. // check alpha channel value to confirm image is covering edge pixel or not. // if alpha value is 0 image is not covering, hence subsampled. return context.getImageData(0, 0, 1, 1).data[3] === 0; } return false; }; // Detects vertical squash in JPEG images: loadImage.detectVerticalSquash = function (img, subsampled) { var naturalHeight = img.naturalHeight || img.height, canvas = document.createElement('canvas'), context = canvas.getContext('2d'), data, sy, ey, py, alpha; if (subsampled) { naturalHeight /= 2; } canvas.width = 1; canvas.height = naturalHeight; context.drawImage(img, 0, 0); data = context.getImageData(0, 0, 1, naturalHeight).data; // search image edge pixel position in case it is squashed vertically: sy = 0; ey = naturalHeight; py = naturalHeight; while (py > sy) { alpha = data[(py - 1) * 4 + 3]; if (alpha === 0) { ey = py; } else { sy = py; } py = (ey + sy) >> 1; } return (py / naturalHeight) || 1; }; // Renders image to canvas while working around iOS image scaling bugs: // https://github.com/blueimp/JavaScript-Load-Image/issues/13 loadImage.renderImageToCanvas = function ( canvas, img, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight ) { if (img._type === 'image/jpeg') { var context = canvas.getContext('2d'), tmpCanvas = document.createElement('canvas'), tileSize = 1024, tmpContext = tmpCanvas.getContext('2d'), subsampled, vertSquashRatio, tileX, tileY; tmpCanvas.width = tileSize; tmpCanvas.height = tileSize; context.save(); subsampled = loadImage.detectSubsampling(img); if (subsampled) { sourceX /= 2; sourceY /= 2; sourceWidth /= 2; sourceHeight /= 2; } vertSquashRatio = loadImage.detectVerticalSquash(img, subsampled); if (subsampled || vertSquashRatio !== 1) { sourceY *= vertSquashRatio; destWidth = Math.ceil(tileSize * destWidth / sourceWidth); destHeight = Math.ceil( tileSize * destHeight / sourceHeight / vertSquashRatio ); destY = 0; tileY = 0; while (tileY < sourceHeight) { destX = 0; tileX = 0; while (tileX < sourceWidth) { tmpContext.clearRect(0, 0, tileSize, tileSize); tmpContext.drawImage( img, sourceX, sourceY, sourceWidth, sourceHeight, -tileX, -tileY, sourceWidth, sourceHeight ); context.drawImage( tmpCanvas, 0, 0, tileSize, tileSize, destX, destY, destWidth, destHeight ); tileX += tileSize; destX += destWidth; } tileY += tileSize; destY += destHeight; } context.restore(); return canvas; } } return originalRenderMethod( canvas, img, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight ); }; })); /*global window, FileAPI */ (function (api, window){ "use strict"; var document = window.document , FormData = window.FormData , Form = function (){ this.items = []; } , encodeURIComponent = window.encodeURIComponent ; Form.prototype = { append: function (name, blob, file, type){ this.items.push({ name: name , blob: blob && blob.blob || (blob == void 0 ? '' : blob) , file: blob && (file || blob.name) , type: blob && (type || blob.type) }); }, each: function (fn){ var i = 0, n = this.items.length; for( ; i < n; i++ ){ fn.call(this, this.items[i]); } }, toData: function (fn, options){ // allow chunked transfer if we have only one file to send // flag is used below and in XHR._send options._chunked = api.support.chunked && options.chunkSize > 0 && api.filter(this.items, function (item){ return item.file; }).length == 1; if( !api.support.html5 ){ api.log('FileAPI.Form.toHtmlData'); this.toHtmlData(fn); } else if( !api.formData || this.multipart || !FormData ){ api.log('FileAPI.Form.toMultipartData'); this.toMultipartData(fn); } else if( options._chunked ){ api.log('FileAPI.Form.toPlainData'); this.toPlainData(fn); } else { api.log('FileAPI.Form.toFormData'); this.toFormData(fn); } }, _to: function (data, complete, next, arg){ var queue = api.queue(function (){ complete(data); }); this.each(function (file){ try{ next(file, data, queue, arg); } catch( err ){ api.log('FileAPI.Form._to: ' + err.message); complete(err); } }); queue.check(); }, toHtmlData: function (fn){ this._to(document.createDocumentFragment(), fn, function (file, data/**DocumentFragment*/){ var blob = file.blob, hidden; if( file.file ){ api.reset(blob, true); // set new name blob.name = file.name; blob.disabled = false; data.appendChild(blob); } else { hidden = document.createElement('input'); hidden.name = file.name; hidden.type = 'hidden'; hidden.value = blob; data.appendChild(hidden); } }); }, toPlainData: function (fn){ this._to({}, fn, function (file, data, queue){ if( file.file ){ data.type = file.file; } if( file.blob.toBlob ){ // canvas queue.inc(); _convertFile(file, function (file, blob){ data.name = file.name; data.file = blob; data.size = blob.length; data.type = file.type; queue.next(); }); } else if( file.file ){ // file data.name = file.blob.name; data.file = file.blob; data.size = file.blob.size; data.type = file.type; } else { // additional data if( !data.params ){ data.params = []; } data.params.push(encodeURIComponent(file.name) +"="+ encodeURIComponent(file.blob)); } data.start = -1; data.end = data.file && data.file.FileAPIReadPosition || -1; data.retry = 0; }); }, toFormData: function (fn){ this._to(new FormData, fn, function (file, data, queue){ if( file.blob && file.blob.toBlob ){ queue.inc(); _convertFile(file, function (file, blob){ data.append(file.name, blob, file.file); queue.next(); }); } else if( file.file ){ data.append(file.name, file.blob, file.file); } else { data.append(file.name, file.blob); } if( file.file ){ data.append('_'+file.name, file.file); } }); }, toMultipartData: function (fn){ this._to([], fn, function (file, data, queue, boundary){ queue.inc(); _convertFile(file, function (file, blob){ data.push( '--_' + boundary + ('\r\nContent-Disposition: form-data; name="'+ file.name +'"'+ (file.file ? '; filename="'+ encodeURIComponent(file.file) +'"' : '') + (file.file ? '\r\nContent-Type: '+ (file.type || 'application/octet-stream') : '') + '\r\n' + '\r\n'+ (file.file ? blob : encodeURIComponent(blob)) + '\r\n') ); queue.next(); }, true); }, api.expando); } }; function _convertFile(file, fn, useBinaryString){ var blob = file.blob, filename = file.file; if( filename ){ if( !blob.toDataURL ){ // The Blob is not an image. api.readAsBinaryString(blob, function (evt){ if( evt.type == 'load' ){ fn(file, evt.result); } }); return; } var mime = { 'image/jpeg': '.jpe?g', 'image/png': '.png' } , type = mime[file.type] ? file.type : 'image/png' , ext = mime[type] || '.png' , quality = blob.quality || 1 ; if( !filename.match(new RegExp(ext+'$', 'i')) ){ // Does not change the current extension, but add a new one. filename += ext.replace('?', ''); } file.file = filename; file.type = type; if( !useBinaryString && blob.toBlob ){ blob.toBlob(function (blob){ fn(file, blob); }, type, quality); } else { fn(file, api.toBinaryString(blob.toDataURL(type, quality))); } } else { fn(file, blob); } } // @export api.Form = Form; })(FileAPI, window); /*global window, FileAPI, Uint8Array */ (function (window, api){ "use strict"; var noop = function (){} , document = window.document , XHR = function (options){ this.uid = api.uid(); this.xhr = { abort: noop , getResponseHeader: noop , getAllResponseHeaders: noop }; this.options = options; }, _xhrResponsePostfix = { '': 1, XML: 1, Text: 1, Body: 1 } ; XHR.prototype = { status: 0, statusText: '', constructor: XHR, getResponseHeader: function (name){ return this.xhr.getResponseHeader(name); }, getAllResponseHeaders: function (){ return this.xhr.getAllResponseHeaders() || {}; }, end: function (status, statusText){ var _this = this, options = _this.options; _this.end = _this.abort = noop; _this.status = status; if( statusText ){ _this.statusText = statusText; } api.log('xhr.end:', status, statusText); options.complete(status == 200 || status == 201 ? false : _this.statusText || 'unknown', _this); if( _this.xhr && _this.xhr.node ){ setTimeout(function (){ var node = _this.xhr.node; try { node.parentNode.removeChild(node); } catch (e){} try { delete window[_this.uid]; } catch (e){} window[_this.uid] = _this.xhr.node = null; }, 9); } }, abort: function (){ this.end(0, 'abort'); if( this.xhr ){ this.xhr.aborted = true; this.xhr.abort(); } }, send: function (FormData){ var _this = this, options = this.options; FormData.toData(function (data){ if( data instanceof Error ){ _this.end(0, data.message); } else{ // Start uploading options.upload(options, _this); _this._send.call(_this, options, data); } }, options); }, _send: function (options, data){ var _this = this, xhr, uid = _this.uid, onLoadFnName = _this.uid + "Load", url = options.url; api.log('XHR._send:', data); if( !options.cache ){ // No cache url += (~url.indexOf('?') ? '&' : '?') + api.uid(); } if( data.nodeName ){ var jsonp = options.jsonp; // prepare callback in GET url = url.replace(/([a-z]+)=(\?)/i, '$1='+uid); // legacy options.upload(options, _this); var onPostMessage = function (evt){ if( ~url.indexOf(evt.origin) ){ try { var result = api.parseJSON(evt.data); if( result.id == uid ){ complete(result.status, result.statusText, result.response); } } catch( err ){ complete(0, err.message); } } }, // jsonp-callack complete = window[uid] = function (status, statusText, response){ _this.readyState = 4; _this.responseText = response; _this.end(status, statusText); api.event.off(window, 'message', onPostMessage); window[uid] = xhr = transport = window[onLoadFnName] = null; } ; _this.xhr.abort = function (){ try { if( transport.stop ){ transport.stop(); } else if( transport.contentWindow.stop ){ transport.contentWindow.stop(); } else { transport.contentWindow.document.execCommand('Stop'); } } catch (er) {} complete(0, "abort"); }; api.event.on(window, 'message', onPostMessage); window[onLoadFnName] = function (){ try { var win = transport.contentWindow , doc = win.document , result = win.result || api.parseJSON(doc.body.innerHTML) ; complete(result.status, result.statusText, result.response); } catch (e){ api.log('[transport.onload]', e); } }; xhr = document.createElement('div'); xhr.innerHTML = '
    ' + '' + (jsonp && (options.url.indexOf('=?') < 0) ? '' : '') + '
    ' ; // get form-data & transport var form = xhr.getElementsByTagName('form')[0] , transport = xhr.getElementsByTagName('iframe')[0] ; form.appendChild(data); api.log(form.parentNode.innerHTML); // append to DOM document.body.appendChild(xhr); // keep a reference to node-transport _this.xhr.node = xhr; // send _this.readyState = 2; // loaded try { form.submit(); } catch (err) { api.log('iframe.error: ' + err); } form = null; } else { // Clean url url = url.replace(/([a-z]+)=(\?)&?/i, ''); // html5 if (this.xhr && this.xhr.aborted) { api.log("Error: already aborted"); return; } xhr = _this.xhr = api.getXHR(); if (data.params) { url += (url.indexOf('?') < 0 ? "?" : "&") + data.params.join("&"); } xhr.open('POST', url, true); if( api.withCredentials ){ xhr.withCredentials = "true"; } if( !options.headers || !options.headers['X-Requested-With'] ){ xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); } api.each(options.headers, function (val, key){ xhr.setRequestHeader(key, val); }); if ( options._chunked ) { // chunked upload if( xhr.upload ){ xhr.upload.addEventListener('progress', api.throttle(function (/**Event*/evt){ if (!data.retry) { // show progress only for correct chunk uploads options.progress({ type: evt.type , total: data.size , loaded: data.start + evt.loaded , totalSize: data.size }, _this, options); } }, 100), false); } xhr.onreadystatechange = function (){ var lkb = parseInt(xhr.getResponseHeader('X-Last-Known-Byte'), 10); _this.status = xhr.status; _this.statusText = xhr.statusText; _this.readyState = xhr.readyState; if( xhr.readyState == 4 ){ for( var k in _xhrResponsePostfix ){ _this['response'+k] = xhr['response'+k]; } xhr.onreadystatechange = null; if (!xhr.status || xhr.status - 201 > 0) { api.log("Error: " + xhr.status); // some kind of error // 0 - connection fail or timeout, if xhr.aborted is true, then it's not recoverable user action // up - server error if (((!xhr.status && !xhr.aborted) || 500 == xhr.status || 416 == xhr.status) && ++data.retry <= options.chunkUploadRetry) { // let's try again the same chunk // only applicable for recoverable error codes 500 && 416 var delay = xhr.status ? 0 : api.chunkNetworkDownRetryTimeout; // inform about recoverable problems options.pause(data.file, options); // smart restart if server reports about the last known byte api.log("X-Last-Known-Byte: " + lkb); if (lkb) { data.end = lkb; } else { data.end = data.start - 1; if (416 == xhr.status) { data.end = data.end - options.chunkSize; } } setTimeout(function () { _this._send(options, data); }, delay); } else { // no mo retries _this.end(xhr.status); } } else { // success data.retry = 0; if (data.end == data.size - 1) { // finished _this.end(xhr.status); } else { // next chunk // shift position if server reports about the last known byte api.log("X-Last-Known-Byte: " + lkb); if (lkb) { data.end = lkb; } data.file.FileAPIReadPosition = data.end; setTimeout(function () { _this._send(options, data); }, 0); } } xhr = null; } }; data.start = data.end + 1; data.end = Math.max(Math.min(data.start + options.chunkSize, data.size) - 1, data.start); // Retrieve a slice of file var file = data.file , slice = (file.slice || file.mozSlice || file.webkitSlice).call(file, data.start, data.end + 1) ; if( data.size && !slice.size ){ setTimeout(function (){ _this.end(-1); }); } else { xhr.setRequestHeader("Content-Range", "bytes " + data.start + "-" + data.end + "/" + data.size); xhr.setRequestHeader("Content-Disposition", 'attachment; filename=' + encodeURIComponent(data.name)); xhr.setRequestHeader("Content-Type", data.type || "application/octet-stream"); xhr.send(slice); } file = slice = null; } else { // single piece upload if( xhr.upload ){ // https://github.com/blueimp/jQuery-File-Upload/wiki/Fixing-Safari-hanging-on-very-high-speed-connections-%281Gbps%29 xhr.upload.addEventListener('progress', api.throttle(function (/**Event*/evt){ options.progress(evt, _this, options); }, 100), false); } xhr.onreadystatechange = function (){ _this.status = xhr.status; _this.statusText = xhr.statusText; _this.readyState = xhr.readyState; if( xhr.readyState == 4 ){ for( var k in _xhrResponsePostfix ){ _this['response'+k] = xhr['response'+k]; } xhr.onreadystatechange = null; if (!xhr.status || xhr.status > 201) { api.log("Error: " + xhr.status); if (((!xhr.status && !xhr.aborted) || 500 == xhr.status) && (options.retry || 0) < options.uploadRetry) { options.retry = (options.retry || 0) + 1; var delay = api.networkDownRetryTimeout; // inform about recoverable problems options.pause(options.file, options); setTimeout(function () { _this._send(options, data); }, delay); } else { //success _this.end(xhr.status); } } else { //success _this.end(xhr.status); } xhr = null; } }; if( api.isArray(data) ){ // multipart xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=_'+api.expando); var rawData = data.join('') +'--_'+ api.expando +'--'; /** @namespace xhr.sendAsBinary https://developer.mozilla.org/ru/XMLHttpRequest#Sending_binary_content */ if( xhr.sendAsBinary ){ xhr.sendAsBinary(rawData); } else { var bytes = Array.prototype.map.call(rawData, function(c){ return c.charCodeAt(0) & 0xff; }); xhr.send(new Uint8Array(bytes).buffer); } } else { // FormData xhr.send(data); } } } } }; // @export api.XHR = XHR; })(window, FileAPI); /** * @class FileAPI.Camera * @author RubaXa * @support Chrome 21+, FF 18+, Opera 12+ */ /*global window, FileAPI, jQuery */ /** @namespace LocalMediaStream -- https://developer.mozilla.org/en-US/docs/WebRTC/MediaStream_API#LocalMediaStream */ (function (window, api){ "use strict"; var URL = window.URL || window.webkitURL, document = window.document, navigator = window.navigator, getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia, html5 = !!getMedia ; // Support "media" api.support.media = html5; var Camera = function (video){ this.video = video; }; Camera.prototype = { isActive: function (){ return !!this._active; }, /** * Start camera streaming * @param {Function} callback */ start: function (callback){ var _this = this , video = _this.video , _successId , _failId , _complete = function (err){ _this._active = !err; clearTimeout(_failId); clearTimeout(_successId); // api.event.off(video, 'loadedmetadata', _complete); callback && callback(err, _this); } ; getMedia.call(navigator, { video: true }, function (stream/**LocalMediaStream*/){ // Success _this.stream = stream; // api.event.on(video, 'loadedmetadata', function (){ // _complete(null); // }); // Set camera stream video.src = URL.createObjectURL(stream); // Note: onloadedmetadata doesn't fire in Chrome when using it with getUserMedia. // See crbug.com/110938. _successId = setInterval(function (){ if( _detectVideoSignal(video) ){ _complete(null); } }, 1000); _failId = setTimeout(function (){ _complete('timeout'); }, 5000); // Go-go-go! video.play(); }, _complete/*error*/); }, /** * Stop camera streaming */ stop: function (){ try { this._active = false; this.video.pause(); this.stream.stop(); } catch( err ){ } }, /** * Create screenshot * @return {FileAPI.Camera.Shot} */ shot: function (){ return new Shot(this.video); } }; /** * Get camera element from container * * @static * @param {HTMLElement} el * @return {Camera} */ Camera.get = function (el){ return new Camera(el.firstChild); }; /** * Publish camera element into container * * @static * @param {HTMLElement} el * @param {Object} options * @param {Function} [callback] */ Camera.publish = function (el, options, callback){ if( typeof options == 'function' ){ callback = options; options = {}; } // Dimensions of "camera" options = api.extend({}, { width: '100%' , height: '100%' , start: true }, options); if( el.jquery ){ // Extract first element, from jQuery collection el = el[0]; } var doneFn = function (err){ if( err ){ callback(err); } else { // Get camera var cam = Camera.get(el); if( options.start ){ cam.start(callback); } else { callback(null, cam); } } }; el.style.width = _px(options.width); el.style.height = _px(options.height); if( api.html5 && html5 ){ // Create video element var video = document.createElement('video'); // Set dimensions video.style.width = _px(options.width); video.style.height = _px(options.height); // Clean container if( window.jQuery ){ jQuery(el).empty(); } else { el.innerHTML = ''; } // Add "camera" to container el.appendChild(video); // end doneFn(); } else { Camera.fallback(el, options, doneFn); } }; Camera.fallback = function (el, options, callback){ callback('not_support_camera'); }; /** * @class FileAPI.Camera.Shot */ var Shot = function (video){ var canvas = video.nodeName ? api.Image.toCanvas(video) : video; var shot = api.Image(canvas); shot.type = 'image/png'; shot.width = canvas.width; shot.height = canvas.height; shot.size = canvas.width * canvas.height * 4; return shot; }; /** * Add "px" postfix, if value is a number * * @private * @param {*} val * @return {String} */ function _px(val){ return val >= 0 ? val + 'px' : val; } /** * @private * @param {HTMLVideoElement} video * @return {Boolean} */ function _detectVideoSignal(video){ var canvas = document.createElement('canvas'), ctx, res = false; try { ctx = canvas.getContext('2d'); ctx.drawImage(video, 0, 0, 1, 1); res = ctx.getImageData(0, 0, 1, 1).data[4] != 255; } catch( e ){} return res; } // @export Camera.Shot = Shot; api.Camera = Camera; })(window, FileAPI); /** * FileAPI fallback to Flash * * @flash-developer "Vladimir Demidov" */ /*global window, ActiveXObject, FileAPI */ (function (window, jQuery, api) { "use strict"; var document = window.document , location = window.location , navigator = window.navigator , _each = api.each ; api.support.flash = (function (){ var mime = navigator.mimeTypes, has = false; if( navigator.plugins && typeof navigator.plugins['Shockwave Flash'] == 'object' ){ has = navigator.plugins['Shockwave Flash'].description && !(mime && mime['application/x-shockwave-flash'] && !mime['application/x-shockwave-flash'].enabledPlugin); } else { try { has = !!(window.ActiveXObject && new ActiveXObject('ShockwaveFlash.ShockwaveFlash')); } catch(er){ api.log('Flash -- does not supported.'); } } if( has && /^file:/i.test(location) ){ api.log('[warn] Flash does not work on `file:` protocol.'); } return has; })(); api.support.flash && (0 || !api.html5 || !api.support.html5 || (api.cors && !api.support.cors) || (api.media && !api.support.media) ) && (function (){ var _attr = api.uid() , _retry = 0 , _files = {} , _rhttp = /^https?:/i , flash = { _fn: {}, /** * Initialization & preload flash object */ init: function (){ var child = document.body && document.body.firstChild; if( child ){ do { if( child.nodeType == 1 ){ api.log('FlashAPI.state: awaiting'); var dummy = document.createElement('div'); dummy.id = '_' + _attr; _css(dummy, { top: 1 , right: 1 , width: 5 , height: 5 , position: 'absolute' , zIndex: 1e6+'' // set max zIndex }); child.parentNode.insertBefore(dummy, child); flash.publish(dummy, _attr); return; } } while( child = child.nextSibling ); } if( _retry < 10 ){ setTimeout(flash.init, ++_retry*50); } }, /** * Publish flash-object * * @param {HTMLElement} el * @param {String} id * @param {Object} [opts] */ publish: function (el, id, opts){ opts = opts || {}; el.innerHTML = _makeFlashHTML({ id: id , src: _getUrl(api.flashUrl, 'r=' + api.version) // , src: _getUrl('http://v.demidov.boom.corp.mail.ru/uploaderfileapi/FlashFileAPI.swf?1') , wmode: opts.camera ? '' : 'transparent' , flashvars: 'callback=' + (opts.onEvent || 'FileAPI.Flash.onEvent') + '&flashId='+ id + '&storeKey='+ navigator.userAgent.match(/\d/ig).join('') +'_'+ api.version + (flash.isReady || (api.pingUrl ? '&ping='+api.pingUrl : '')) + '&timeout='+api.flashAbortTimeout + (opts.camera ? '&useCamera=' + _getUrl(api.flashWebcamUrl) : '') + '&debug='+(api.debug?"1":"") }, opts); }, ready: function (){ api.log('FlashAPI.state: ready'); flash.ready = api.F; flash.isReady = true; flash.patch(); flash.patchCamera && flash.patchCamera(); api.event.on(document, 'mouseover', flash.mouseover); api.event.on(document, 'click', function (evt){ if( flash.mouseover(evt) ){ evt.preventDefault ? evt.preventDefault() : (evt.returnValue = true) ; } }); }, getEl: function (){ return document.getElementById('_'+_attr); }, getWrapper: function (node){ do { if( /js-fileapi-wrapper/.test(node.className) ){ return node; } } while( (node = node.parentNode) && (node !== document.body) ); }, mouseover: function (evt){ var target = api.event.fix(evt).target; if( /input/i.test(target.nodeName) && target.type == 'file' && !target.disabled ){ var state = target.getAttribute(_attr) , wrapper = flash.getWrapper(target) ; if( api.multiFlash ){ // check state: // p — published // i — initialization // r — ready if( state == 'i' || state == 'r' ){ // publish fail return false; } else if( state != 'p' ){ // set "init" state target.setAttribute(_attr, 'i'); var dummy = document.createElement('div'); if( !wrapper ){ api.log('[err] FlashAPI.mouseover: js-fileapi-wrapper not found'); return; } _css(dummy, { top: 0 , left: 0 , width: target.offsetWidth , height: target.offsetHeight , zIndex: 1e6+'' // set max zIndex , position: 'absolute' }); wrapper.appendChild(dummy); flash.publish(dummy, api.uid()); // set "publish" state target.setAttribute(_attr, 'p'); } return true; } else if( wrapper ){ // Use one flash element var box = _getDimensions(wrapper); _css(flash.getEl(), box); // Set current input flash.curInp = target; } } else if( !/object|embed/i.test(target.nodeName) ){ _css(flash.getEl(), { top: 1, left: 1, width: 5, height: 5 }); } }, onEvent: function (evt){ var type = evt.type; if( type == 'ready' ){ try { // set "ready" state flash.getInput(evt.flashId).setAttribute(_attr, 'r'); } catch (e){ } flash.ready(); setTimeout(function (){ flash.mouseenter(evt); }, 50); return true; } else if( type === 'ping' ){ api.log('(flash -> js).ping:', [evt.status, evt.savedStatus], evt.error); } else if( type === 'log' ){ api.log('(flash -> js).log:', evt.target); } else if( type in flash ){ setTimeout(function (){ api.log('FlashAPI.event.'+evt.type+':', evt); flash[type](evt); }, 1); } }, mouseenter: function (evt){ var node = flash.getInput(evt.flashId); if( node ){ // Set multiple mode flash.cmd(evt, 'multiple', node.getAttribute('multiple') != null); // Set files filter var accept = [], exts = {}; _each((node.getAttribute('accept') || '').split(/,\s*/), function (mime){ api.accept[mime] && _each(api.accept[mime].split(' '), function (ext){ exts[ext] = 1; }); }); _each(exts, function (i, ext){ accept.push( ext ); }); flash.cmd(evt, 'accept', accept.length ? accept.join(',')+','+accept.join(',').toUpperCase() : '*'); } }, get: function (id){ return document[id] || window[id] || document.embeds[id]; }, getInput: function (id){ if( api.multiFlash ){ try { var node = flash.getWrapper(flash.get(id)); if( node ){ return node.getElementsByTagName('input')[0]; } } catch (e){ api.log('[err] Can not find "input" by flashId:', id, e); } } else { return flash.curInp; } }, select: function (evt){ var inp = flash.getInput(evt.flashId) , uid = api.uid(inp) , files = evt.target.files , event ; _each(files, function (file){ api.checkFileObj(file); }); _files[uid] = files; if( document.createEvent ){ event = document.createEvent('Event'); event.files = files; event.initEvent('change', true, true); inp.dispatchEvent(event); } else if( jQuery ){ jQuery(inp).trigger({ type: 'change', files: files }); } else { event = document.createEventObject(); event.files = files; inp.fireEvent('onchange', event); } }, cmd: function (id, name, data, last){ try { api.log('(js -> flash).'+name+':', data); return flash.get(id.flashId || id).cmd(name, data); } catch (err){ api.log('(js -> flash).onError:', err.toString()); if( !last ){ // try again setTimeout(function (){ flash.cmd(id, name, data, true); }, 50); } } }, patch: function (){ api.flashEngine = true; // FileAPI _inherit(api, { getFiles: function (input, filter, callback){ if( callback ){ api.filterFiles(api.getFiles(input), filter, callback); return null; } var files = api.isArray(input) ? input : _files[api.uid(input.target || input.srcElement || input)]; if( !files ){ // Файлов нету, вызываем родительский метод return this.parent.apply(this, arguments); } if( filter ){ filter = api.getFilesFilter(filter); files = api.filter(files, function (file){ return filter.test(file.name); }); } return files; }, getInfo: function (file, fn){ if( _isHtmlFile(file) ){ this.parent.apply(this, arguments); } else if( file.isShot ){ fn(null, file.info = { width: file.width, height: file.height }); } else { if( !file.__info ){ var defer = file.__info = api.defer(); flash.cmd(file, 'getFileInfo', { id: file.id , callback: _wrap(function _(err, info){ _unwrap(_); defer.resolve(err, file.info = info); }) }); } file.__info.then(fn); } } }); // FileAPI.Image api.support.transform = true; api.Image && _inherit(api.Image.prototype, { get: function (fn, scaleMode){ this.set({ scaleMode: scaleMode || 'noScale' }); // noScale, exactFit return this.parent(fn); }, _load: function (file, fn){ api.log('FlashAPI.Image._load:', file); if( _isHtmlFile(file) ){ this.parent.apply(this, arguments); } else { var _this = this; api.getInfo(file, function (err){ fn.call(_this, err, file); }); } }, _apply: function (file, fn){ api.log('FlashAPI.Image._apply:', file); if( _isHtmlFile(file) ){ this.parent.apply(this, arguments); } else { var m = this.getMatrix(file.info), doneFn = fn; flash.cmd(file, 'imageTransform', { id: file.id , matrix: m , callback: _wrap(function _(err, base64){ api.log('FlashAPI.Image._apply.callback:', err); _unwrap(_); if( err ){ doneFn(err); } else if( !api.support.html5 && (!api.support.dataURI || base64.length > 3e4) ){ _makeFlashImage({ width: (m.deg % 180) ? m.dh : m.dw , height: (m.deg % 180) ? m.dw : m.dh , scale: m.scaleMode }, base64, doneFn); } else { if( m.filter ){ doneFn = function (err, img){ if( err ){ fn(err); } else { api.Image.applyFilter(img, m.filter, function (){ fn(err, this.canvas); }); } }; } api.newImage('data:'+ file.type +';base64,'+ base64, doneFn); } }) }); } }, toData: function (fn){ var file = this.file , info = file.info , matrix = this.getMatrix(info) ; api.log('FlashAPI.Image.toData'); if( _isHtmlFile(file) ){ this.parent.apply(this, arguments); } else { if( matrix.deg == 'auto' ){ matrix.deg = api.Image.exifOrientation[info && info.exif && info.exif.Orientation] || 0; } fn.call(this, !file.info, { id: file.id , flashId: file.flashId , name: file.name , type: file.type , matrix: matrix }); } } }); api.Image && _inherit(api.Image, { fromDataURL: function (dataURL, size, callback){ if( !api.support.dataURI || dataURL.length > 3e4 ){ _makeFlashImage( api.extend({ scale: 'exactFit' }, size) , dataURL.replace(/^data:[^,]+,/, '') , function (err, el){ callback(el); } ); } else { this.parent(dataURL, size, callback); } } }); // FileAPI.Form _inherit(api.Form.prototype, { toData: function (fn){ var items = this.items, i = items.length; for( ; i--; ){ if( items[i].file && _isHtmlFile(items[i].blob) ){ return this.parent.apply(this, arguments); } } api.log('FlashAPI.Form.toData'); fn(items); } }); // FileAPI.XHR _inherit(api.XHR.prototype, { _send: function (options, formData){ if( formData.nodeName || formData.append && api.support.html5 || api.isArray(formData) && (typeof formData[0] === 'string') ){ // HTML5, Multipart or IFrame return this.parent.apply(this, arguments); } var data = {} , files = {} , _this = this , flashId , fileId ; _each(formData, function (item){ if( item.file ){ files[item.name] = item = _getFileDescr(item.blob); fileId = item.id; flashId = item.flashId; } else { data[item.name] = item.blob; } }); if( !fileId ){ flashId = _attr; } if( !flashId ){ api.log('[err] FlashAPI._send: flashId -- undefined'); return this.parent.apply(this, arguments); } else { api.log('FlashAPI.XHR._send: '+ flashId +' -> '+ fileId); } _this.xhr = { headers: {}, abort: function (){ flash.cmd(flashId, 'abort', { id: fileId }); }, getResponseHeader: function (name){ return this.headers[name]; }, getAllResponseHeaders: function (){ return this.headers; } }; var queue = api.queue(function (){ flash.cmd(flashId, 'upload', { url: _getUrl(options.url.replace(/([a-z]+)=(\?)&?/i, '')) , data: data , files: fileId ? files : null , headers: options.headers || {} , callback: _wrap(function upload(evt){ var type = evt.type, result = evt.result; api.log('FlashAPI.upload.'+type); if( type == 'progress' ){ evt.loaded = Math.min(evt.loaded, evt.total); // @todo fixme evt.lengthComputable = true; options.progress(evt); } else if( type == 'complete' ){ _unwrap(upload); if( typeof result == 'string' ){ _this.responseText = result.replace(/%22/g, "\"").replace(/%5c/g, "\\").replace(/%26/g, "&").replace(/%25/g, "%"); } _this.end(evt.status || 200); } else if( type == 'abort' || type == 'error' ){ _this.end(evt.status || 0, evt.message); _unwrap(upload); } }) }); }); // #2174: FileReference.load() call while FileReference.upload() or vice versa _each(files, function (file){ queue.inc(); api.getInfo(file, queue.next); }); queue.check(); } }); } } ; function _makeFlashHTML(opts){ return ('' + '' + '' + '' + '' + '' + '' + '' + '' + '').replace(/#(\w+)#/ig, function (a, name){ return opts[name]; }) ; } function _css(el, css){ if( el && el.style ){ var key, val; for( key in css ){ val = css[key]; if( typeof val == 'number' ){ val += 'px'; } try { el.style[key] = val; } catch (e) {} } } } function _inherit(obj, methods){ _each(methods, function (fn, name){ var prev = obj[name]; obj[name] = function (){ this.parent = prev; return fn.apply(this, arguments); }; }); } function _isHtmlFile(file){ return file && !file.flashId; } function _wrap(fn){ var id = fn.wid = api.uid(); flash._fn[id] = fn; return 'FileAPI.Flash._fn.'+id; } function _unwrap(fn){ try { flash._fn[fn.wid] = null; delete flash._fn[fn.wid]; } catch(e){} } function _getUrl(url, params){ if( !_rhttp.test(url) ){ if( /^\.\//.test(url) || '/' != url.charAt(0) ){ var path = location.pathname; path = path.substr(0, path.lastIndexOf('/')); url = (path +'/'+ url).replace('/./', '/'); } if( '//' != url.substr(0, 2) ){ url = '//' + location.host + url; } if( !_rhttp.test(url) ){ url = location.protocol + url; } } if( params ){ url += (/\?/.test(url) ? '&' : '?') + params; } return url; } function _makeFlashImage(opts, base64, fn){ var key , flashId = api.uid() , el = document.createElement('div') , attempts = 10 ; for( key in opts ){ el.setAttribute(key, opts[key]); el[key] = opts[key]; } _css(el, opts); opts.width = '100%'; opts.height = '100%'; el.innerHTML = _makeFlashHTML(api.extend({ id: flashId , src: _getUrl(api.flashImageUrl, 'r='+ api.uid()) , wmode: 'opaque' , flashvars: 'scale='+ opts.scale +'&callback='+_wrap(function _(){ _unwrap(_); if( --attempts > 0 ){ _setImage(); } return true; }) }, opts)); function _setImage(){ try { // Get flash-object by id var img = flash.get(flashId); img.setImage(base64); } catch (e){ api.log('[err] FlashAPI.Preview.setImage -- can not set "base64":', e); } } fn(false, el); el = null; } function _getFileDescr(file){ return { id: file.id , name: file.name , matrix: file.matrix , flashId: file.flashId }; } function _getDimensions(el){ var box = el.getBoundingClientRect() , body = document.body , docEl = (el && el.ownerDocument).documentElement ; return { top: box.top + (window.pageYOffset || docEl.scrollTop) - (docEl.clientTop || body.clientTop || 0) , left: box.left + (window.pageXOffset || docEl.scrollLeft) - (docEl.clientLeft || body.clientLeft || 0) , width: box.right - box.left , height: box.bottom - box.top }; } // @export api.Flash = flash; // Check dataURI support api.newImage('data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==', function (err, img){ api.support.dataURI = !(img.width != 1 || img.height != 1); flash.init(); }); })(); })(window, window.jQuery, FileAPI); /** * FileAPI fallback to Flash * * @flash-developer "Vladimir Demidov" */ /*global window, FileAPI */ (function (window, jQuery, api) { "use strict"; var _each = api.each, _cameraQueue = []; if (api.support.flash && (api.media && (!api.support.media || !api.html5))) { (function () { function _wrap(fn) { var id = fn.wid = api.uid(); api.Flash._fn[id] = fn; return 'FileAPI.Flash._fn.' + id; } function _unwrap(fn) { try { api.Flash._fn[fn.wid] = null; delete api.Flash._fn[fn.wid]; } catch (e) { } } var flash = api.Flash; api.extend(api.Flash, { patchCamera: function () { api.Camera.fallback = function (el, options, callback) { var camId = api.uid(); api.log('FlashAPI.Camera.publish: ' + camId); flash.publish(el, camId, api.extend(options, { camera: true, onEvent: _wrap(function _(evt) { if (evt.type === 'camera') { _unwrap(_); if (evt.error) { api.log('FlashAPI.Camera.publish.error: ' + evt.error); callback(evt.error); } else { api.log('FlashAPI.Camera.publish.success: ' + camId); callback(null); } } }) })); }; // Run _each(_cameraQueue, function (args) { api.Camera.fallback.apply(api.Camera, args); }); _cameraQueue = []; // FileAPI.Camera:proto api.extend(api.Camera.prototype, { _id: function () { return this.video.id; }, start: function (callback) { var _this = this; flash.cmd(this._id(), 'camera.on', { callback: _wrap(function _(evt) { _unwrap(_); if (evt.error) { api.log('FlashAPI.camera.on.error: ' + evt.error); callback(evt.error, _this); } else { api.log('FlashAPI.camera.on.success: ' + _this._id()); _this._active = true; callback(null, _this); } }) }); }, stop: function () { this._active = false; flash.cmd(this._id(), 'camera.off'); }, shot: function () { api.log('FlashAPI.Camera.shot:', this._id()); var shot = api.Flash.cmd(this._id(), 'shot', {}); shot.type = 'image/png'; shot.flashId = this._id(); shot.isShot = true; return new api.Camera.Shot(shot); } }); } }); api.Camera.fallback = function () { _cameraQueue.push(arguments); }; }()); } }(window, window.jQuery, FileAPI)); if( typeof define === "function" && define.amd ){ define("FileAPI", [], function (){ return FileAPI; }); }PK!Vƪƪ,abilian/web/resources/fileapi/FileAPI.min.js/*! FileAPI 2.0.11 - BSD | git://github.com/mailru/FileAPI.git */ !function(a){"use strict";var b=a.HTMLCanvasElement&&a.HTMLCanvasElement.prototype,c=a.Blob&&function(){try{return Boolean(new Blob)}catch(a){return!1}}(),d=c&&a.Uint8Array&&function(){try{return 100===new Blob([new Uint8Array(100)]).size}catch(a){return!1}}(),e=a.BlobBuilder||a.WebKitBlobBuilder||a.MozBlobBuilder||a.MSBlobBuilder,f=(c||e)&&a.atob&&a.ArrayBuffer&&a.Uint8Array&&function(a){var b,f,g,h,i,j;for(b=a.split(",")[0].indexOf("base64")>=0?atob(a.split(",")[1]):decodeURIComponent(a.split(",")[1]),f=new ArrayBuffer(b.length),g=new Uint8Array(f),h=0;h0,E=a.dataURLtoBlob,F=/img/i,G=/canvas/i,H=/img|canvas/i,I=/input/i,J=/^data:[^,]+,/,K={}.toString,L=a.Math,M=function(b){return b=new a.Number(L.pow(1024,b)),b.from=function(a){return L.round(a*this)},b},N={},O=[],P="abort progress error load loadend",Q="status statusText readyState response responseXML responseText responseBody".split(" "),R="currentTarget",S="preventDefault",T=function(a){return a&&"length"in a},U=function(a,b,c){if(a)if(T(a))for(var d=0,e=a.length;e>d;d++)d in a&&b.call(c,a[d],d,a);else for(var f in a)a.hasOwnProperty(f)&&b.call(c,a[f],f,a)},V=function(a){for(var b=arguments,c=1,d=function(b,c){a[c]=b};c=c&&!d&&f.end()},isFail:function(){return d},fail:function(){!d&&a(d=!0)},end:function(){e||(e=!0,a())}};return f},each:U,afor:function(a,b){var c=0,d=a.length;T(a)&&d--?!function e(){b(d!=c&&e,a[c],c++)}():b(!1)},extend:V,isFile:function(a){return"[object File]"===K.call(a)},isBlob:function(a){return this.isFile(a)||"[object Blob]"===K.call(a)},isCanvas:function(a){return a&&G.test(a.nodeName)},getFilesFilter:function(a){return a="string"==typeof a?a:a.getAttribute&&a.getAttribute("accept")||"",a?new RegExp("("+a.replace(/\./g,"\\.").replace(/,/g,"|")+")$","i"):/./},readAsDataURL:function(a,b){_.isCanvas(a)?c(a,b,"load",_.toDataURL(a)):e(a,b,"DataURL")},readAsBinaryString:function(a,b){d("BinaryString")?e(a,b,"BinaryString"):e(a,function(a){if("load"==a.type)try{a.result=_.toBinaryString(a.result)}catch(c){a.type="error",a.message=c.toString()}b(a)},"DataURL")},readAsArrayBuffer:function(a,b){e(a,b,"ArrayBuffer")},readAsText:function(a,b,c){c||(c=b,b="utf-8"),e(a,c,"Text",b)},toDataURL:function(a,b){return"string"==typeof a?a:a.toDataURL?a.toDataURL(b||"image/png"):void 0},toBinaryString:function(b){return a.atob(_.toDataURL(b).replace(J,""))},readAsImage:function(a,d,e){if(_.isFile(a))if(t){var f=t.createObjectURL(a);f===b?c(a,d,"error"):_.readAsImage(f,d,e)}else _.readAsDataURL(a,function(b){"load"==b.type?_.readAsImage(b.result,d,e):(e||"error"==b.type)&&c(a,d,b,null,{loaded:b.loaded,total:b.total})});else if(_.isCanvas(a))c(a,d,"load",a);else if(F.test(a.nodeName))if(a.complete)c(a,d,"load",a);else{var g="error abort load";Y(a,g,function i(b){"load"==b.type&&t&&t.revokeObjectURL(a.src),X(a,g,i),c(a,d,b,a)})}else if(a.iframe)c(a,d,{type:"error"});else{var h=_.newImage(a.dataURL||a);_.readAsImage(h,d,e)}},checkFileObj:function(a){var b={},c=_.accept;return"object"==typeof a?b=a:b.name=(a+"").split(/\\|\//g).pop(),null==b.type&&(b.type=b.name.split(".").pop()),U(c,function(a,c){a=new RegExp(a.replace(/\s/g,"|"),"i"),(a.test(b.type)||_.ext2mime[b.type])&&(b.type=_.ext2mime[b.type]||c.split("/")[0]+"/"+b.type)}),b},getDropFiles:function(a,b){var c,d=[],e=[],j=l(a),k=j.files,m=j.items,n=T(m)&&m[0]&&h(m[0]),o=_.queue(function(){b(d,e)});if(n)if(D&&k){var p,q,r=k.length;for(c=new Array(r);r--;){p=k[r];try{q=h(m[r])}catch(s){_.log("[err] getDropFiles: ",s),q=null}c[r]=g(q)&&(q.isDirectory||q.isFile&&p.name==p.name.normalize("NFC"))?q:p}}else c=m;else c=k;U(c||[],function(a){o.inc();try{n&&g(a)?i(a,function(a,b,c){a?_.log("[err] getDropFiles:",a):d.push.apply(d,b),e.push.apply(e,c),o.next()}):f(a,function(b,c){b?d.push(a):a.error=c,e.push(a),o.next()})}catch(b){o.next(),_.log("[err] getDropFiles: ",b)}}),o.check()},getFiles:function(a,b,c){var d=[];return c?(_.filterFiles(_.getFiles(a),b,c),null):(a.jquery&&(a.each(function(){d=d.concat(_.getFiles(this))}),a=d,d=[]),"string"==typeof b&&(b=_.getFilesFilter(b)),a.originalEvent?a=Z(a.originalEvent):a.srcElement&&(a=Z(a)),a.dataTransfer?a=a.dataTransfer:a.target&&(a=a.target),a.files?(d=a.files,A||(d[0].blob=a,d[0].iframe=!0)):!A&&k(a)?_.trim(a.value)&&(d=[_.checkFileObj(a.value)],d[0].blob=a,d[0].iframe=!0):T(a)&&(d=a),_.filter(d,function(a){return!b||b.test(a.name)}))},getTotalSize:function(a){for(var b=0,c=a&&a.length;c--;)b+=a[c].size;return b},getInfo:function(a,b){var c={},d=O.concat();_.isFile(a)?!function e(){var f=d.shift();f?f.test(a.type)?f(a,function(a,d){a?b(a):(V(c,d),e())}):e():b(!1,c)}():b("not_support_info",c)},addInfoReader:function(a,b){b.test=function(b){return a.test(b)},O.push(b)},filter:function(a,b){for(var c,d=[],e=0,f=a.length;f>e;e++)e in a&&(c=a[e],b.call(c,c,e,a)&&d.push(c));return d},filterFiles:function(a,b,c){if(a.length){var d,e=a.concat(),f=[],g=[];!function h(){e.length?(d=e.shift(),_.getInfo(d,function(a,c){(b(d,a?!1:c)?f:g).push(d),h()})):c(f,g)}()}else c([],a)},upload:function(a){a=V({jsonp:"callback",prepare:_.F,beforeupload:_.F,upload:_.F,fileupload:_.F,fileprogress:_.F,filecomplete:_.F,progress:_.F,complete:_.F,pause:_.F,imageOriginal:!0,chunkSize:_.chunkSize,chunkUploadRetry:_.chunkUploadRetry,uploadRetry:_.uploadRetry},a),a.imageAutoOrientation&&!a.imageTransform&&(a.imageTransform={rotate:"auto"});var b,c=new _.XHR(a),d=this._getFilesDataArray(a.files),e=this,f=0,g=0,h=!1;return U(d,function(a){f+=a.size}),c.files=[],U(d,function(a){c.files.push(a.file)}),c.total=f,c.loaded=0,c.filesLeft=d.length,a.beforeupload(c,a),b=function(){var i=d.shift(),k=i&&i.file,l=!1,m=j(a);if(c.filesLeft=d.length,k&&k.name===_.expando&&(k=null,_.log("[warn] FileAPI.upload() — called without files")),("abort"!=c.statusText||c.current)&&i){if(h=!1,c.currentFile=k,k&&a.prepare(k,m)===!1)return void b.call(e);m.file=k,e._getFormData(m,i,function(h){g||a.upload(c,a);var j=new _.XHR(V({},m,{upload:k?function(){a.fileupload(k,j,m)}:o,progress:k?function(b){l||(l=b.loaded===b.total,a.fileprogress({type:"progress",total:i.total=b.total,loaded:i.loaded=b.loaded},k,j,m),a.progress({type:"progress",total:f,loaded:c.loaded=g+i.size*(b.loaded/b.total)||0},k,j,m))}:o,complete:function(d){U(Q,function(a){c[a]=j[a]}),k&&(i.total=i.total||i.size,i.loaded=i.total,d||(this.progress(i),l=!0,g+=i.size,c.loaded=g),a.filecomplete(d,j,k,m)),setTimeout(function(){b.call(e)},0)}}));c.abort=function(a){a||(d.length=0),this.current=a,j.abort()},j.send(h)})}else{var n=200==c.status||201==c.status||204==c.status;a.complete(n?!1:c.statusText||"error",c,a),h=!0}},setTimeout(b,0),c.append=function(a,g){a=_._getFilesDataArray([].concat(a)),U(a,function(a){f+=a.size,c.files.push(a.file),g?d.unshift(a):d.push(a)}),c.statusText="",h&&b.call(e)},c.remove=function(a){for(var b,c=d.length;c--;)d[c].file==a&&(b=d.splice(c,1),f-=b.size);return b},c},_getFilesDataArray:function(a){var b=[],c={};if(k(a)){var d=_.getFiles(a);c[a.name||"file"]=null!==a.getAttribute("multiple")?d:d[0]}else T(a)&&k(a[0])?U(a,function(a){c[a.name||"file"]=_.getFiles(a)}):c=a;return U(c,function e(a,c){T(a)?U(a,function(a){e(a,c)}):a&&(a.name||a.image)&&b.push({name:c,file:a,size:a.size,total:a.size,loaded:0})}),b.length||b.push({file:{name:_.expando}}),b},_getFormData:function(a,b,c){var d=b.file,e=b.name,f=d.name,g=d.type,h=_.support.transform&&a.imageTransform,i=new _.Form,j=_.queue(function(){c(i)}),k=h&&m(h),l=_.postNameConcat;U(a.data,function n(a,b){"object"==typeof a?U(a,function(a,c){n(a,l(b,c))}):i.append(b,a)}),function o(b){b.image?(j.inc(),b.toData(function(a,b){f=f||(new Date).getTime()+".png",o(b),j.next()})):_.Image&&h&&(/^image/.test(b.type)||H.test(b.nodeName))?(j.inc(),k&&(h=[h]),_.Image.transform(b,h,a.imageAutoOrientation,function(c,d){if(k&&!c)E||_.flashEngine||(i.multipart=!0),i.append(e,d[0],f,h[0].type||g);else{var m=0;c||U(d,function(a,b){E||_.flashEngine||(i.multipart=!0),h[b].postName||(m=1),i.append(h[b].postName||l(e,b),a,f,h[b].type||g)}),(c||a.imageOriginal)&&i.append(l(e,m?"original":null),b,f,g)}j.next()})):f!==_.expando&&i.append(e,b,f)}(d),j.check()},reset:function(a,b){var c,d;return z?(d=z(a).clone(!0).insertBefore(a).val("")[0],b||z(a).remove()):(c=a.parentNode,d=c.insertBefore(a.cloneNode(!0),a),d.value="",b||c.removeChild(a),U(N[_.uid(a)],function(b,c){U(b,function(b){X(a,c,b),W(d,c,b)})})),d},load:function(a,b){var c=_.getXHR();return c?(c.open("GET",a,!0),c.overrideMimeType&&c.overrideMimeType("text/plain; charset=x-user-defined"),W(c,"progress",function(a){a.lengthComputable&&b({type:a.type,loaded:a.loaded,total:a.total},c)}),c.onreadystatechange=function(){if(4==c.readyState)if(c.onreadystatechange=null,200==c.status){a=a.split("/");var d={name:a[a.length-1],size:c.getResponseHeader("Content-Length"),type:c.getResponseHeader("Content-Type")};d.dataURL="data:"+d.type+";base64,"+_.encode64(c.responseBody||c.responseText),b({type:"load",result:d},c)}else b({type:"error"},c)},c.send(null)):b({type:"error"}),c},encode64:function(a){var b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c="",d=0;for("string"!=typeof a&&(a=String(a));d>2,k=(3&g)<<4|h>>4;isNaN(h)?e=f=64:(e=(15&h)<<2|i>>6,f=isNaN(i)?64:63&i),c+=b.charAt(j)+b.charAt(k)+b.charAt(e)+b.charAt(f)}return c}};_.addInfoReader(/^image/,function(a,b){if(!a.__dimensions){var c=a.__dimensions=_.defer();_.readAsImage(a,function(a){var b=a.target;c.resolve("load"==a.type?!1:"error",{width:b.width,height:b.height}),b.src=_.EMPTY_PNG,b=null})}a.__dimensions.then(b)}),_.event.dnd=function(a,b,c){var d,e;c||(c=b,b=_.F),w?(W(a,"dragenter dragleave dragover",b.ff=b.ff||function(a){for(var c=l(a).types,f=c&&c.length,g=!1;f--;)if(~c[f].indexOf("File")){a[S](),e!==a.type&&(e=a.type,"dragleave"!=e&&b.call(a[R],!0,a),g=!0);break}g&&(clearTimeout(d),d=setTimeout(function(){b.call(a[R],"dragleave"!=e,a)},50))}),W(a,"drop",c.ff=c.ff||function(a){a[S](),e=0,b.call(a[R],!1,a),_.getDropFiles(a,function(b,d){c.call(a[R],b,d,a)})})):_.log("Drag'n'Drop -- not supported")},_.event.dnd.off=function(a,b,c){X(a,"dragenter dragleave dragover",b.ff),X(a,"drop",c.ff)},z&&!z.fn.dnd&&(z.fn.dnd=function(a,b){return this.each(function(){_.event.dnd(this,a,b)})},z.fn.offdnd=function(a,b){return this.each(function(){_.event.dnd.off(this,a,b)})}),a.FileAPI=V(_,a.FileAPI),_.log("FileAPI: "+_.version),_.log("protocol: "+a.location.protocol),_.log("doctype: ["+q.name+"] "+q.publicId+" "+q.systemId),U(p.getElementsByTagName("meta"),function(a){/x-ua-compatible/i.test(a.getAttribute("http-equiv"))&&_.log("meta.http-equiv: "+a.getAttribute("content"))}),_.flashUrl||(_.flashUrl=_.staticPath+"FileAPI.flash.swf"),_.flashImageUrl||(_.flashImageUrl=_.staticPath+"FileAPI.flash.image.swf"),_.flashWebcamUrl||(_.flashWebcamUrl=_.staticPath+"FileAPI.flash.camera.swf")}(window,void 0),function(a,b,c){"use strict";function d(b){if(b instanceof d){var c=new d(b.file);return a.extend(c.matrix,b.matrix),c}return this instanceof d?(this.file=b,this.size=b.size||100,void(this.matrix={sx:0,sy:0,sw:0,sh:0,dx:0,dy:0,dw:0,dh:0,resize:0,deg:0,quality:1,filter:0})):new d(b)}var e=Math.min,f=Math.round,g=function(){return b.createElement("canvas")},h=!1,i={8:270,3:180,6:90,7:270,4:180,5:90};try{h=g().toDataURL("image/png").indexOf("data:image/png")>-1}catch(j){}d.prototype={image:!0,constructor:d,set:function(b){return a.extend(this.matrix,b),this},crop:function(a,b,d,e){return d===c&&(d=a,e=b,a=b=0),this.set({sx:a,sy:b,sw:d,sh:e||d})},resize:function(a,b,c){return/min|max|height|width/.test(b)&&(c=b,b=a),this.set({dw:a,dh:b||a,resize:c})},preview:function(a,b){return this.resize(a,b||a,"preview")},rotate:function(a){return this.set({deg:a})},filter:function(a){return this.set({filter:a})},overlay:function(a){return this.set({overlay:a})},clone:function(){return new d(this)},_load:function(b,c){var d=this;/img|video/i.test(b.nodeName)?c.call(d,null,b):a.readAsImage(b,function(a){c.call(d,"load"!=a.type,a.result)})},_apply:function(b,c){var f,h=g(),i=this.getMatrix(b),j=h.getContext("2d"),k=b.videoWidth||b.width,l=b.videoHeight||b.height,m=i.deg,n=i.dw,o=i.dh,p=k,q=l,r=i.filter,s=b,t=i.overlay,u=a.queue(function(){b.src=a.EMPTY_PNG,c(!1,h)}),v=a.renderImageToCanvas;for(m-=360*Math.floor(m/360),b._type=this.file.type;i.multipass&&e(p/n,q/o)>2;)p=p/2+.5|0,q=q/2+.5|0,f=g(),f.width=p,f.height=q,s!==b?(v(f,s,0,0,s.width,s.height,0,0,p,q),s=f):(s=f,v(s,b,i.sx,i.sy,i.sw,i.sh,0,0,p,q),i.sx=i.sy=i.sw=i.sh=0);h.width=m%180?o:n,h.height=m%180?n:o,h.type=i.type,h.quality=i.quality,j.rotate(m*Math.PI/180),v(j.canvas,s,i.sx,i.sy,i.sw||s.width,i.sh||s.height,180==m||270==m?-n:0,90==m||180==m?-o:0,n,o),n=h.width,o=h.height,t&&a.each([].concat(t),function(b){u.inc();var c=new window.Image,d=function(){var e=0|b.x,f=0|b.y,g=b.w||c.width,h=b.h||c.height,i=b.rel;e=1==i||4==i||7==i?(n-g+e)/2:2==i||5==i||8==i?n-(g+e):e,f=3==i||4==i||5==i?(o-h+f)/2:i>=6?o-(h+f):f,a.event.off(c,"error load abort",d);try{j.globalAlpha=b.opacity||1,j.drawImage(c,e,f,g,h)}catch(k){}u.next()};a.event.on(c,"error load abort",d),c.src=b.src,c.complete&&d()}),r&&(u.inc(),d.applyFilter(h,r,u.next)),u.check()},getMatrix:function(b){var c=a.extend({},this.matrix),d=c.sw=c.sw||b.videoWidth||b.naturalWidth||b.width,g=c.sh=c.sh||b.videoHeight||b.naturalHeight||b.height,h=c.dw=c.dw||d,i=c.dh=c.dh||g,j=d/g,k=h/i,l=c.resize;if("preview"==l){if(h!=d||i!=g){var m,n;k>=j?(m=d,n=m/k):(n=g,m=n*k),(m!=d||n!=g)&&(c.sx=~~((d-m)/2),c.sy=~~((g-n)/2),d=m,g=n)}}else"height"==l?h=i*j:"width"==l?i=h/j:l&&(d>h||g>i?"min"==l?(h=f(k>j?e(d,h):i*j),i=f(k>j?h/j:e(g,i))):(h=f(j>=k?e(d,h):i*j),i=f(j>=k?h/j:e(g,i))):(h=d,i=g));return c.sw=d,c.sh=g,c.dw=h,c.dh=i,c.multipass=a.multiPassResize,c},_trans:function(b){this._load(this.file,function(c,d){if(c)b(c);else try{this._apply(d,b)}catch(c){a.log("[err] FileAPI.Image.fn._apply:",c),b(c)}})},get:function(b){if(a.support.transform){var c=this,d=c.matrix;"auto"==d.deg?a.getInfo(c.file,function(a,e){d.deg=i[e&&e.exif&&e.exif.Orientation]||0,c._trans(b)}):c._trans(b)}else b("not_support_transform");return this},toData:function(a){return this.get(a)}},d.exifOrientation=i,d.transform=function(b,e,f,g){function h(h,i){var j={},k=a.queue(function(a){g(a,j)});h?k.fail():a.each(e,function(a,e){if(!k.isFail()){var g=new d(i.nodeType?i:b),h="function"==typeof a;if(h?a(i,g):a.width?g[a.preview?"preview":"resize"](a.width,a.height,a.strategy):a.maxWidth&&(i.width>a.maxWidth||i.height>a.maxHeight)&&g.resize(a.maxWidth,a.maxHeight,"max"),a.crop){var l=a.crop;g.crop(0|l.x,0|l.y,l.w||l.width,l.h||l.height)}a.rotate===c&&f&&(a.rotate="auto"),g.set({type:g.matrix.type||a.type||b.type||"image/png"}),h||g.set({deg:a.rotate,overlay:a.overlay,filter:a.filter,quality:a.quality||1}),k.inc(),g.toData(function(a,b){a?k.fail():(j[e]=b,k.next())})}})}b.width?h(!1,b):a.getInfo(b,h)},a.each(["TOP","CENTER","BOTTOM"],function(b,c){a.each(["LEFT","CENTER","RIGHT"],function(a,e){d[b+"_"+a]=3*c+e,d[a+"_"+b]=3*c+e})}),d.toCanvas=function(a){var c=b.createElement("canvas");return c.width=a.videoWidth||a.width,c.height=a.videoHeight||a.height,c.getContext("2d").drawImage(a,0,0),c},d.fromDataURL=function(b,c,d){var e=a.newImage(b);a.extend(e,c),d(e)},d.applyFilter=function(b,c,e){"function"==typeof c?c(b,e):window.Caman&&window.Caman("IMG"==b.tagName?d.toCanvas(b):b,function(){"string"==typeof c?this[c]():a.each(c,function(a,b){this[b](a)},this),this.render(e)})},a.renderImageToCanvas=function(b,c,d,e,f,g,h,i,j,k){try{return b.getContext("2d").drawImage(c,d,e,f,g,h,i,j,k)}catch(l){throw a.log("renderImageToCanvas failed"),l}},a.support.canvas=a.support.transform=h,a.Image=d}(FileAPI,document),function(a){"use strict";a(FileAPI)}(function(a){"use strict";if(window.navigator&&window.navigator.platform&&/iP(hone|od|ad)/.test(window.navigator.platform)){var b=a.renderImageToCanvas;a.detectSubsampling=function(a){var b,c;return a.width*a.height>1048576?(b=document.createElement("canvas"),b.width=b.height=1,c=b.getContext("2d"),c.drawImage(a,-a.width+1,0),0===c.getImageData(0,0,1,1).data[3]):!1},a.detectVerticalSquash=function(a,b){var c,d,e,f,g,h=a.naturalHeight||a.height,i=document.createElement("canvas"),j=i.getContext("2d");for(b&&(h/=2),i.width=1,i.height=h,j.drawImage(a,0,0),c=j.getImageData(0,0,1,h).data,d=0,e=h,f=h;f>d;)g=c[4*(f-1)+3],0===g?e=f:d=f,f=e+d>>1;return f/h||1},a.renderImageToCanvas=function(c,d,e,f,g,h,i,j,k,l){if("image/jpeg"===d._type){var m,n,o,p,q=c.getContext("2d"),r=document.createElement("canvas"),s=1024,t=r.getContext("2d");if(r.width=s,r.height=s,q.save(),m=a.detectSubsampling(d),m&&(e/=2,f/=2,g/=2,h/=2),n=a.detectVerticalSquash(d,m),m||1!==n){for(f*=n,k=Math.ceil(s*k/g),l=Math.ceil(s*l/h/n),j=0,p=0;h>p;){for(i=0,o=0;g>o;)t.clearRect(0,0,s,s),t.drawImage(d,e,f,g,h,-o,-p,g,h),q.drawImage(r,0,0,s,s,i,j,k,l),o+=s,i+=k;p+=s,j+=l}return q.restore(),c}}return b(c,d,e,f,g,h,i,j,k,l)}}}),function(a,b){"use strict";function c(b,c,d){var e=b.blob,f=b.file;if(f){if(!e.toDataURL)return void a.readAsBinaryString(e,function(a){"load"==a.type&&c(b,a.result)});var g={"image/jpeg":".jpe?g","image/png":".png"},h=g[b.type]?b.type:"image/png",i=g[h]||".png",j=e.quality||1;f.match(new RegExp(i+"$","i"))||(f+=i.replace("?","")),b.file=f,b.type=h,!d&&e.toBlob?e.toBlob(function(a){c(b,a)},h,j):c(b,a.toBinaryString(e.toDataURL(h,j)))}else c(b,e)}var d=b.document,e=b.FormData,f=function(){this.items=[]},g=b.encodeURIComponent;f.prototype={append:function(a,b,c,d){this.items.push({name:a,blob:b&&b.blob||(void 0==b?"":b),file:b&&(c||b.name),type:b&&(d||b.type)})},each:function(a){for(var b=0,c=this.items.length;c>b;b++)a.call(this,this.items[b])},toData:function(b,c){c._chunked=a.support.chunked&&c.chunkSize>0&&1==a.filter(this.items,function(a){return a.file}).length,a.support.html5?a.formData&&!this.multipart&&e?c._chunked?(a.log("FileAPI.Form.toPlainData"),this.toPlainData(b)):(a.log("FileAPI.Form.toFormData"),this.toFormData(b)):(a.log("FileAPI.Form.toMultipartData"),this.toMultipartData(b)):(a.log("FileAPI.Form.toHtmlData"),this.toHtmlData(b))},_to:function(b,c,d,e){var f=a.queue(function(){c(b)});this.each(function(g){try{d(g,b,f,e)}catch(h){a.log("FileAPI.Form._to: "+h.message),c(h)}}),f.check()},toHtmlData:function(b){this._to(d.createDocumentFragment(),b,function(b,c){var e,f=b.blob;b.file?(a.reset(f,!0),f.name=b.name,f.disabled=!1,c.appendChild(f)):(e=d.createElement("input"),e.name=b.name,e.type="hidden",e.value=f,c.appendChild(e))})},toPlainData:function(a){this._to({},a,function(a,b,d){a.file&&(b.type=a.file),a.blob.toBlob?(d.inc(),c(a,function(a,c){b.name=a.name,b.file=c,b.size=c.length,b.type=a.type,d.next()})):a.file?(b.name=a.blob.name,b.file=a.blob,b.size=a.blob.size,b.type=a.type):(b.params||(b.params=[]),b.params.push(g(a.name)+"="+g(a.blob))),b.start=-1,b.end=b.file&&b.file.FileAPIReadPosition||-1,b.retry=0})},toFormData:function(a){this._to(new e,a,function(a,b,d){a.blob&&a.blob.toBlob?(d.inc(),c(a,function(a,c){b.append(a.name,c,a.file),d.next()})):a.file?b.append(a.name,a.blob,a.file):b.append(a.name,a.blob),a.file&&b.append("_"+a.name,a.file)})},toMultipartData:function(b){this._to([],b,function(a,b,d,e){d.inc(),c(a,function(a,c){b.push("--_"+e+('\r\nContent-Disposition: form-data; name="'+a.name+'"'+(a.file?'; filename="'+g(a.file)+'"':"")+(a.file?"\r\nContent-Type: "+(a.type||"application/octet-stream"):"")+"\r\n\r\n"+(a.file?c:g(c))+"\r\n")),d.next()},!0)},a.expando)}},a.Form=f}(FileAPI,window),function(a,b){"use strict";var c=function(){},d=a.document,e=function(a){this.uid=b.uid(),this.xhr={abort:c,getResponseHeader:c,getAllResponseHeaders:c},this.options=a},f={"":1,XML:1,Text:1,Body:1};e.prototype={status:0,statusText:"",constructor:e,getResponseHeader:function(a){return this.xhr.getResponseHeader(a)},getAllResponseHeaders:function(){return this.xhr.getAllResponseHeaders()||{}},end:function(d,e){var f=this,g=f.options;f.end=f.abort=c,f.status=d,e&&(f.statusText=e),b.log("xhr.end:",d,e),g.complete(200==d||201==d?!1:f.statusText||"unknown",f),f.xhr&&f.xhr.node&&setTimeout(function(){var b=f.xhr.node;try{b.parentNode.removeChild(b)}catch(c){}try{delete a[f.uid]}catch(c){}a[f.uid]=f.xhr.node=null},9)},abort:function(){this.end(0,"abort"),this.xhr&&(this.xhr.aborted=!0,this.xhr.abort())},send:function(a){var b=this,c=this.options;a.toData(function(a){a instanceof Error?b.end(0,a.message):(c.upload(c,b),b._send.call(b,c,a))},c)},_send:function(c,e){var g,h=this,i=h.uid,j=h.uid+"Load",k=c.url;if(b.log("XHR._send:",e),c.cache||(k+=(~k.indexOf("?")?"&":"?")+b.uid()),e.nodeName){var l=c.jsonp;k=k.replace(/([a-z]+)=(\?)/i,"$1="+i),c.upload(c,h);var m=function(a){if(~k.indexOf(a.origin))try{var c=b.parseJSON(a.data);c.id==i&&n(c.status,c.statusText,c.response)}catch(d){n(0,d.message)}},n=a[i]=function(c,d,e){h.readyState=4,h.responseText=e,h.end(c,d),b.event.off(a,"message",m),a[i]=g=p=a[j]=null};h.xhr.abort=function(){try{p.stop?p.stop():p.contentWindow.stop?p.contentWindow.stop():p.contentWindow.document.execCommand("Stop")}catch(a){}n(0,"abort")},b.event.on(a,"message",m),a[j]=function(){try{var a=p.contentWindow,c=a.document,d=a.result||b.parseJSON(c.body.innerHTML);n(d.status,d.statusText,d.response)}catch(e){b.log("[transport.onload]",e)}},g=d.createElement("div"),g.innerHTML='
    '+(l&&c.url.indexOf("=?")<0?'':"")+"
    ";var o=g.getElementsByTagName("form")[0],p=g.getElementsByTagName("iframe")[0];o.appendChild(e),b.log(o.parentNode.innerHTML),d.body.appendChild(g),h.xhr.node=g,h.readyState=2;try{o.submit()}catch(q){b.log("iframe.error: "+q)}o=null}else{if(k=k.replace(/([a-z]+)=(\?)&?/i,""),this.xhr&&this.xhr.aborted)return void b.log("Error: already aborted");if(g=h.xhr=b.getXHR(),e.params&&(k+=(k.indexOf("?")<0?"?":"&")+e.params.join("&")),g.open("POST",k,!0),b.withCredentials&&(g.withCredentials="true"),c.headers&&c.headers["X-Requested-With"]||g.setRequestHeader("X-Requested-With","XMLHttpRequest"),b.each(c.headers,function(a,b){g.setRequestHeader(b,a)}),c._chunked){g.upload&&g.upload.addEventListener("progress",b.throttle(function(a){e.retry||c.progress({type:a.type,total:e.size,loaded:e.start+a.loaded,totalSize:e.size},h,c)},100),!1),g.onreadystatechange=function(){var a=parseInt(g.getResponseHeader("X-Last-Known-Byte"),10);if(h.status=g.status,h.statusText=g.statusText,h.readyState=g.readyState,4==g.readyState){for(var d in f)h["response"+d]=g["response"+d];if(g.onreadystatechange=null,!g.status||g.status-201>0)if(b.log("Error: "+g.status),(!g.status&&!g.aborted||500==g.status||416==g.status)&&++e.retry<=c.chunkUploadRetry){var i=g.status?0:b.chunkNetworkDownRetryTimeout;c.pause(e.file,c),b.log("X-Last-Known-Byte: "+a),a?e.end=a:(e.end=e.start-1,416==g.status&&(e.end=e.end-c.chunkSize)),setTimeout(function(){h._send(c,e)},i)}else h.end(g.status);else e.retry=0,e.end==e.size-1?h.end(g.status):(b.log("X-Last-Known-Byte: "+a),a&&(e.end=a),e.file.FileAPIReadPosition=e.end,setTimeout(function(){h._send(c,e)},0));g=null}},e.start=e.end+1,e.end=Math.max(Math.min(e.start+c.chunkSize,e.size)-1,e.start);var r=e.file,s=(r.slice||r.mozSlice||r.webkitSlice).call(r,e.start,e.end+1);e.size&&!s.size?setTimeout(function(){h.end(-1)}):(g.setRequestHeader("Content-Range","bytes "+e.start+"-"+e.end+"/"+e.size),g.setRequestHeader("Content-Disposition","attachment; filename="+encodeURIComponent(e.name)),g.setRequestHeader("Content-Type",e.type||"application/octet-stream"),g.send(s)),r=s=null}else if(g.upload&&g.upload.addEventListener("progress",b.throttle(function(a){c.progress(a,h,c)},100),!1),g.onreadystatechange=function(){if(h.status=g.status,h.statusText=g.statusText,h.readyState=g.readyState,4==g.readyState){for(var a in f)h["response"+a]=g["response"+a];if(g.onreadystatechange=null,!g.status||g.status>201)if(b.log("Error: "+g.status),(!g.status&&!g.aborted||500==g.status)&&(c.retry||0)=0?a+"px":a}function d(a){var b,c=f.createElement("canvas"),d=!1;try{b=c.getContext("2d"),b.drawImage(a,0,0,1,1),d=255!=b.getImageData(0,0,1,1).data[4]}catch(e){}return d}var e=a.URL||a.webkitURL,f=a.document,g=a.navigator,h=g.getUserMedia||g.webkitGetUserMedia||g.mozGetUserMedia||g.msGetUserMedia,i=!!h;b.support.media=i;var j=function(a){this.video=a};j.prototype={isActive:function(){return!!this._active},start:function(a){var b,c,f=this,i=f.video,j=function(d){f._active=!d,clearTimeout(c),clearTimeout(b),a&&a(d,f)};h.call(g,{video:!0},function(a){f.stream=a,i.src=e.createObjectURL(a),b=setInterval(function(){d(i)&&j(null)},1e3),c=setTimeout(function(){j("timeout")},5e3),i.play()},j)},stop:function(){try{this._active=!1,this.video.pause(),this.stream.stop()}catch(a){}},shot:function(){return new k(this.video)}},j.get=function(a){return new j(a.firstChild)},j.publish=function(d,e,g){"function"==typeof e&&(g=e,e={}),e=b.extend({},{width:"100%",height:"100%",start:!0},e),d.jquery&&(d=d[0]); var h=function(a){if(a)g(a);else{var b=j.get(d);e.start?b.start(g):g(null,b)}};if(d.style.width=c(e.width),d.style.height=c(e.height),b.html5&&i){var k=f.createElement("video");k.style.width=c(e.width),k.style.height=c(e.height),a.jQuery?jQuery(d).empty():d.innerHTML="",d.appendChild(k),h()}else j.fallback(d,e,h)},j.fallback=function(a,b,c){c("not_support_camera")};var k=function(a){var c=a.nodeName?b.Image.toCanvas(a):a,d=b.Image(c);return d.type="image/png",d.width=c.width,d.height=c.height,d.size=c.width*c.height*4,d};j.Shot=k,b.Camera=j}(window,FileAPI),function(a,b,c){"use strict";var d=a.document,e=a.location,f=a.navigator,g=c.each;c.support.flash=function(){var b=f.mimeTypes,d=!1;if(f.plugins&&"object"==typeof f.plugins["Shockwave Flash"])d=f.plugins["Shockwave Flash"].description&&!(b&&b["application/x-shockwave-flash"]&&!b["application/x-shockwave-flash"].enabledPlugin);else try{d=!(!a.ActiveXObject||!new ActiveXObject("ShockwaveFlash.ShockwaveFlash"))}catch(g){c.log("Flash -- does not supported.")}return d&&/^file:/i.test(e)&&c.log("[warn] Flash does not work on `file:` protocol."),d}(),c.support.flash&&(0||!c.html5||!c.support.html5||c.cors&&!c.support.cors||c.media&&!c.support.media)&&function(){function h(a){return('').replace(/#(\w+)#/gi,function(b,c){return a[c]})}function i(a,b){if(a&&a.style){var c,d;for(c in b){d=b[c],"number"==typeof d&&(d+="px");try{a.style[c]=d}catch(e){}}}}function j(a,b){g(b,function(b,c){var d=a[c];a[c]=function(){return this.parent=d,b.apply(this,arguments)}})}function k(a){return a&&!a.flashId}function l(a){var b=a.wid=c.uid();return v._fn[b]=a,"FileAPI.Flash._fn."+b}function m(a){try{v._fn[a.wid]=null,delete v._fn[a.wid]}catch(b){}}function n(a,b){if(!u.test(a)){if(/^\.\//.test(a)||"/"!=a.charAt(0)){var c=e.pathname;c=c.substr(0,c.lastIndexOf("/")),a=(c+"/"+a).replace("/./","/")}"//"!=a.substr(0,2)&&(a="//"+e.host+a),u.test(a)||(a=e.protocol+a)}return b&&(a+=(/\?/.test(a)?"&":"?")+b),a}function o(a,b,e){function f(){try{var a=v.get(j);a.setImage(b)}catch(d){c.log('[err] FlashAPI.Preview.setImage -- can not set "base64":',d)}}var g,j=c.uid(),k=d.createElement("div"),o=10;for(g in a)k.setAttribute(g,a[g]),k[g]=a[g];i(k,a),a.width="100%",a.height="100%",k.innerHTML=h(c.extend({id:j,src:n(c.flashImageUrl,"r="+c.uid()),wmode:"opaque",flashvars:"scale="+a.scale+"&callback="+l(function p(){return m(p),--o>0&&f(),!0})},a)),e(!1,k),k=null}function p(a){return{id:a.id,name:a.name,matrix:a.matrix,flashId:a.flashId}}function q(b){var c=b.getBoundingClientRect(),e=d.body,f=(b&&b.ownerDocument).documentElement;return{top:c.top+(a.pageYOffset||f.scrollTop)-(f.clientTop||e.clientTop||0),left:c.left+(a.pageXOffset||f.scrollLeft)-(f.clientLeft||e.clientLeft||0),width:c.right-c.left,height:c.bottom-c.top}}var r=c.uid(),s=0,t={},u=/^https?:/i,v={_fn:{},init:function(){var a=d.body&&d.body.firstChild;if(a)do if(1==a.nodeType){c.log("FlashAPI.state: awaiting");var b=d.createElement("div");return b.id="_"+r,i(b,{top:1,right:1,width:5,height:5,position:"absolute",zIndex:1e6+""}),a.parentNode.insertBefore(b,a),void v.publish(b,r)}while(a=a.nextSibling);10>s&&setTimeout(v.init,50*++s)},publish:function(a,b,d){d=d||{},a.innerHTML=h({id:b,src:n(c.flashUrl,"r="+c.version),wmode:d.camera?"":"transparent",flashvars:"callback="+(d.onEvent||"FileAPI.Flash.onEvent")+"&flashId="+b+"&storeKey="+f.userAgent.match(/\d/gi).join("")+"_"+c.version+(v.isReady||(c.pingUrl?"&ping="+c.pingUrl:""))+"&timeout="+c.flashAbortTimeout+(d.camera?"&useCamera="+n(c.flashWebcamUrl):"")+"&debug="+(c.debug?"1":"")},d)},ready:function(){c.log("FlashAPI.state: ready"),v.ready=c.F,v.isReady=!0,v.patch(),v.patchCamera&&v.patchCamera(),c.event.on(d,"mouseover",v.mouseover),c.event.on(d,"click",function(a){v.mouseover(a)&&(a.preventDefault?a.preventDefault():a.returnValue=!0)})},getEl:function(){return d.getElementById("_"+r)},getWrapper:function(a){do if(/js-fileapi-wrapper/.test(a.className))return a;while((a=a.parentNode)&&a!==d.body)},mouseover:function(a){var b=c.event.fix(a).target;if(/input/i.test(b.nodeName)&&"file"==b.type&&!b.disabled){var e=b.getAttribute(r),f=v.getWrapper(b);if(c.multiFlash){if("i"==e||"r"==e)return!1;if("p"!=e){b.setAttribute(r,"i");var g=d.createElement("div");if(!f)return void c.log("[err] FlashAPI.mouseover: js-fileapi-wrapper not found");i(g,{top:0,left:0,width:b.offsetWidth,height:b.offsetHeight,zIndex:1e6+"",position:"absolute"}),f.appendChild(g),v.publish(g,c.uid()),b.setAttribute(r,"p")}return!0}if(f){var h=q(f);i(v.getEl(),h),v.curInp=b}}else/object|embed/i.test(b.nodeName)||i(v.getEl(),{top:1,left:1,width:5,height:5})},onEvent:function(a){var b=a.type;if("ready"==b){try{v.getInput(a.flashId).setAttribute(r,"r")}catch(d){}return v.ready(),setTimeout(function(){v.mouseenter(a)},50),!0}"ping"===b?c.log("(flash -> js).ping:",[a.status,a.savedStatus],a.error):"log"===b?c.log("(flash -> js).log:",a.target):b in v&&setTimeout(function(){c.log("FlashAPI.event."+a.type+":",a),v[b](a)},1)},mouseenter:function(a){var b=v.getInput(a.flashId);if(b){v.cmd(a,"multiple",null!=b.getAttribute("multiple"));var d=[],e={};g((b.getAttribute("accept")||"").split(/,\s*/),function(a){c.accept[a]&&g(c.accept[a].split(" "),function(a){e[a]=1})}),g(e,function(a,b){d.push(b)}),v.cmd(a,"accept",d.length?d.join(",")+","+d.join(",").toUpperCase():"*")}},get:function(b){return d[b]||a[b]||d.embeds[b]},getInput:function(a){if(!c.multiFlash)return v.curInp;try{var b=v.getWrapper(v.get(a));if(b)return b.getElementsByTagName("input")[0]}catch(d){c.log('[err] Can not find "input" by flashId:',a,d)}},select:function(a){var e,f=v.getInput(a.flashId),h=c.uid(f),i=a.target.files;g(i,function(a){c.checkFileObj(a)}),t[h]=i,d.createEvent?(e=d.createEvent("Event"),e.files=i,e.initEvent("change",!0,!0),f.dispatchEvent(e)):b?b(f).trigger({type:"change",files:i}):(e=d.createEventObject(),e.files=i,f.fireEvent("onchange",e))},cmd:function(a,b,d,e){try{return c.log("(js -> flash)."+b+":",d),v.get(a.flashId||a).cmd(b,d)}catch(f){c.log("(js -> flash).onError:",f.toString()),e||setTimeout(function(){v.cmd(a,b,d,!0)},50)}},patch:function(){c.flashEngine=!0,j(c,{getFiles:function(a,b,d){if(d)return c.filterFiles(c.getFiles(a),b,d),null;var e=c.isArray(a)?a:t[c.uid(a.target||a.srcElement||a)];return e?(b&&(b=c.getFilesFilter(b),e=c.filter(e,function(a){return b.test(a.name)})),e):this.parent.apply(this,arguments)},getInfo:function(a,b){if(k(a))this.parent.apply(this,arguments);else if(a.isShot)b(null,a.info={width:a.width,height:a.height});else{if(!a.__info){var d=a.__info=c.defer();v.cmd(a,"getFileInfo",{id:a.id,callback:l(function e(b,c){m(e),d.resolve(b,a.info=c)})})}a.__info.then(b)}}}),c.support.transform=!0,c.Image&&j(c.Image.prototype,{get:function(a,b){return this.set({scaleMode:b||"noScale"}),this.parent(a)},_load:function(a,b){if(c.log("FlashAPI.Image._load:",a),k(a))this.parent.apply(this,arguments);else{var d=this;c.getInfo(a,function(c){b.call(d,c,a)})}},_apply:function(a,b){if(c.log("FlashAPI.Image._apply:",a),k(a))this.parent.apply(this,arguments);else{var d=this.getMatrix(a.info),e=b;v.cmd(a,"imageTransform",{id:a.id,matrix:d,callback:l(function f(g,h){c.log("FlashAPI.Image._apply.callback:",g),m(f),g?e(g):c.support.html5||c.support.dataURI&&!(h.length>3e4)?(d.filter&&(e=function(a,e){a?b(a):c.Image.applyFilter(e,d.filter,function(){b(a,this.canvas)})}),c.newImage("data:"+a.type+";base64,"+h,e)):o({width:d.deg%180?d.dh:d.dw,height:d.deg%180?d.dw:d.dh,scale:d.scaleMode},h,e)})})}},toData:function(a){var b=this.file,d=b.info,e=this.getMatrix(d);c.log("FlashAPI.Image.toData"),k(b)?this.parent.apply(this,arguments):("auto"==e.deg&&(e.deg=c.Image.exifOrientation[d&&d.exif&&d.exif.Orientation]||0),a.call(this,!b.info,{id:b.id,flashId:b.flashId,name:b.name,type:b.type,matrix:e}))}}),c.Image&&j(c.Image,{fromDataURL:function(a,b,d){!c.support.dataURI||a.length>3e4?o(c.extend({scale:"exactFit"},b),a.replace(/^data:[^,]+,/,""),function(a,b){d(b)}):this.parent(a,b,d)}}),j(c.Form.prototype,{toData:function(a){for(var b=this.items,d=b.length;d--;)if(b[d].file&&k(b[d].blob))return this.parent.apply(this,arguments);c.log("FlashAPI.Form.toData"),a(b)}}),j(c.XHR.prototype,{_send:function(a,b){if(b.nodeName||b.append&&c.support.html5||c.isArray(b)&&"string"==typeof b[0])return this.parent.apply(this,arguments);var d,e,f={},h={},i=this;if(g(b,function(a){a.file?(h[a.name]=a=p(a.blob),e=a.id,d=a.flashId):f[a.name]=a.blob}),e||(d=r),!d)return c.log("[err] FlashAPI._send: flashId -- undefined"),this.parent.apply(this,arguments);c.log("FlashAPI.XHR._send: "+d+" -> "+e),i.xhr={headers:{},abort:function(){v.cmd(d,"abort",{id:e})},getResponseHeader:function(a){return this.headers[a]},getAllResponseHeaders:function(){return this.headers}};var j=c.queue(function(){v.cmd(d,"upload",{url:n(a.url.replace(/([a-z]+)=(\?)&?/i,"")),data:f,files:e?h:null,headers:a.headers||{},callback:l(function b(d){var e=d.type,f=d.result;c.log("FlashAPI.upload."+e),"progress"==e?(d.loaded=Math.min(d.loaded,d.total),d.lengthComputable=!0,a.progress(d)):"complete"==e?(m(b),"string"==typeof f&&(i.responseText=f.replace(/%22/g,'"').replace(/%5c/g,"\\").replace(/%26/g,"&").replace(/%25/g,"%")),i.end(d.status||200)):("abort"==e||"error"==e)&&(i.end(d.status||0,d.message),m(b))})})});g(h,function(a){j.inc(),c.getInfo(a,j.next)}),j.check()}})}};c.Flash=v,c.newImage("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",function(a,b){c.support.dataURI=!(1!=b.width||1!=b.height),v.init()})}()}(window,window.jQuery,FileAPI),function(a,b,c){"use strict";var d=c.each,e=[];!c.support.flash||!c.media||c.support.media&&c.html5||!function(){function a(a){var b=a.wid=c.uid();return c.Flash._fn[b]=a,"FileAPI.Flash._fn."+b}function b(a){try{c.Flash._fn[a.wid]=null,delete c.Flash._fn[a.wid]}catch(b){}}var f=c.Flash;c.extend(c.Flash,{patchCamera:function(){c.Camera.fallback=function(d,e,g){var h=c.uid();c.log("FlashAPI.Camera.publish: "+h),f.publish(d,h,c.extend(e,{camera:!0,onEvent:a(function i(a){"camera"===a.type&&(b(i),a.error?(c.log("FlashAPI.Camera.publish.error: "+a.error),g(a.error)):(c.log("FlashAPI.Camera.publish.success: "+h),g(null)))})}))},d(e,function(a){c.Camera.fallback.apply(c.Camera,a)}),e=[],c.extend(c.Camera.prototype,{_id:function(){return this.video.id},start:function(d){var e=this;f.cmd(this._id(),"camera.on",{callback:a(function g(a){b(g),a.error?(c.log("FlashAPI.camera.on.error: "+a.error),d(a.error,e)):(c.log("FlashAPI.camera.on.success: "+e._id()),e._active=!0,d(null,e))})})},stop:function(){this._active=!1,f.cmd(this._id(),"camera.off")},shot:function(){c.log("FlashAPI.Camera.shot:",this._id());var a=c.Flash.cmd(this._id(),"shot",{});return a.type="image/png",a.flashId=this._id(),a.isShot=!0,new c.Camera.Shot(a)}})}}),c.Camera.fallback=function(){e.push(arguments)}}()}(window,window.jQuery,FileAPI),"function"==typeof define&&define.amd&&define("FileAPI",[],function(){return FileAPI});PK!Lff%abilian/web/resources/fileapi/LICENSECopyright (C) 2012 FileAPI AUTHORS: Konstantin Lebedev, Demidov Vladimir. /* * 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. * * THIS SOFTWARE IS PROVIDED BY MAILRU.RU GROUP ``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 * MAILRU.RU GROUP 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. */ PK!w#,,5abilian/web/resources/fileapi/plugins/FileAPI.exif.js(function (){ /**! * Binary Ajax 0.1.10 * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/ * Licensed under the MPL License [http://www.nihilogic.dk/licenses/mpl-license.txt] * * * Javascript EXIF Reader 0.1.4 * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com, http://blog.nihilogic.dk/ * Licensed under the MPL License [http://www.nihilogic.dk/licenses/mpl-license.txt] */ var BinaryFile=function(j,k,l){var h=j,i=k||0,b=0;this.getRawData=function(){return h};"string"==typeof j&&(b=l||h.length,this.getByteAt=function(a){return h.charCodeAt(a+i)&255},this.getBytesAt=function(a,b){for(var c=[],f=0;fc&&(c+=65536);return c};this.getSShortAt=function(a,b){var c=this.getShortAt(a,b);return 32767c&&(c+=4294967296);return c};this.getSLongAt=function(a,b){var c=this.getLongAt(a,b);return 2147483647 128*1024) { try { var size = Math.min(blob.size, 128 * 1024); blob = (blob.slice || blob.mozSlice || blob.webkitSlice).call(blob, 0, size); } catch (e) { FileAPI.log("exception "+ e); } } FileAPI.readAsBinaryString(blob, function (evt){ if( evt.type == 'load' ){ var binaryString = evt.result; var oFile = new BinaryFile(binaryString, 0, blob.size); var exif = EXIF.readFromBinaryFile(oFile); defer.resolve(false, { 'exif': exif || {} }); } else if( evt.type == 'error' ){ defer.resolve('read_as_binary_string_exif'); } }); } file.__exif.then(callback); }); })(); PK!!::4abilian/web/resources/fileapi/plugins/FileAPI.id3.js(function (){ /** * JavaScript ID3 Reader * https://github.com/aadsm/JavaScript-ID3-Reader * * Authors * Jacob Seidelin * António Afonso * Joshua Kifer */ var x=!0,y=null;function z(a,b,d){function e(c){c=parseInt(c.getResponseHeader("Content-Length"),10)||-1;b(new h(a,c))}function f(){var c=y;window.XMLHttpRequest?c=new XMLHttpRequest:window.ActiveXObject&&(c=new ActiveXObject("Microsoft.XMLHTTP"));return c}function h(c,a){var b,g;function e(c){var a=~~(c[0]/b)-g,c=~~(c[1]/b)+1+g;0>a&&(a=0);c>=blockTotal&&(c=blockTotal-1);return[a,c]}function h(e,g){function m(c){parseInt(c.getResponseHeader("Content-Length"),10)==a&&(e[0]=0,e[1]=blockTotal-1,i[0]=0,i[1]=a-1);for(var c= {data:c.U||c.responseText,offset:i[0]},b=e[0];b<=e[1];b++)A[b]=c;l+=i[1]-i[0]+1;g&&g()}for(;A[e[0]];)if(e[0]++,e[0]>e[1]){g&&g();return}for(;A[e[1]];)if(e[1]--,e[0]>e[1]){g&&g();return}var i=[e[0]*b,(e[1]+1)*b-1],w=c,r=d,L=q,I=!!g,n=f();n?("undefined"===typeof I&&(I=x),m&&("undefined"!=typeof n.onload?n.onload=function(){"200"==n.status||"206"==n.status?(n.fileSize=L||n.getResponseHeader("Content-Length"),m(n)):r&&r();n=y}:n.onreadystatechange=function(){4==n.readyState&&("200"==n.status||"206"== n.status?(n.fileSize=L||n.getResponseHeader("Content-Length"),m(n)):r&&r(),n=y)}),n.open("GET",w,I),n.overrideMimeType&&n.overrideMimeType("text/plain; charset=x-user-defined"),i&&n.setRequestHeader("Range","bytes="+i[0]+"-"+i[1]),n.setRequestHeader("If-Modified-Since","Sat, 1 Jan 1970 00:00:00 GMT"),n.send(y)):r&&r()}var q,l=0,w=new B("",0,a),A=[];b=b||2048;g="undefined"===typeof g?0:g;blockTotal=~~((a-1)/b)+1;for(var r in w)w.hasOwnProperty(r)&&"function"===typeof w[r]&&(this[r]=w[r]);this.a=function(c){var a; h(e([c,c]));a=A[~~(c/b)];if("string"==typeof a.data)return a.data.charCodeAt(c-a.offset)&255;if("unknown"==typeof a.data)return IEBinary_getByteAt(a.data,c-a.offset)};this.L=function(){return l};this.g=function(c,a){h(e(c),a)}}var c=f();c&&(e&&("undefined"!=typeof c.onload?c.onload=function(){"200"==c.status&&e(this);c=y}:c.onreadystatechange=function(){4==c.readyState&&("200"==c.status&&e(this),c=y)}),c.open("HEAD",a,x),c.send(y))} function B(a,b,d){var e=a,f=b||0,h=0;this.N=function(){return e};"string"==typeof a?(h=d||e.length,this.a=function(c){return e.charCodeAt(c+f)&255}):"unknown"==typeof a&&(h=d||IEBinary_getLength(e),this.a=function(c){return IEBinary_getByteAt(e,c+f)});this.m=function(c,a){for(var b=Array(a),d=0;db&&(b+=65536);return b};this.Q=function(c,a){var b=this.p(c,a);return 32767b&&(b+=4294967296);return b};this.P=function(c,a){var b=this.h(c,a);return 2147483647a&&(a+=16777216);return a};this.d=function(a,b){for(var d= [],e=a,g=0;eq||224<=q?b[h]=String.fromCharCode(l):(q=(a[g+f]<<8)+a[g+d],g+=2,b[h]=String.fromCharCode(l,q))}a= new String(b.join(""));a.f=g;break;case "utf-8":e=0;g=Math.min(g||a.length,a.length);239==a[0]&&(187==a[1]&&191==a[2])&&(e=3);f=[];for(d=0;eb?f[d]=String.fromCharCode(b):194<=b&&224>b?(h=a[e++],f[d]=String.fromCharCode(((b&31)<<6)+(h&63))):224<=b&&240>b?(h=a[e++],l=a[e++],f[d]=String.fromCharCode(((b&255)<<12)+((h&63)<<6)+(l&63))):240<=b&&245>b&&(h=a[e++],l=a[e++],q=a[e++],b=((b&7)<<18)+((h&63)<<12)+((l&63)<<6)+(q&63)-65536,f[d]=String.fromCharCode((b>>10)+55296,(b&1023)+ 56320));a=new String(f.join(""));a.f=e;break;default:g=[];f=f||a.length;for(e=0;e\r\nFunction IEBinary_getByteAt(strBinary, iOffset)\r\n\tIEBinary_getByteAt = AscB(MidB(strBinary,iOffset+1,1))\r\nEnd Function\r\nFunction IEBinary_getLength(strBinary)\r\n\tIEBinary_getLength = LenB(strBinary)\r\nEnd Function\r\n<\/script>\r\n");this.FileAPIReader=function(a){return function(b,d){var e=new FileReader;e.onload=function(a){d(new B(a.target.result))};e.readAsBinaryString(a)}};this.Base64=this.j={i:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",w:function(a){for(var b="",d,e,f,h,c,k,v=0;v>2,d=(d&3)<<4|e>>4,c=(e&15)<<2|f>>6,k=f&63,isNaN(e)?c=k=64:isNaN(f)&&(k=64),b=b+Base64.i.charAt(h)+Base64.i.charAt(d)+Base64.i.charAt(c)+Base64.i.charAt(k);return b}};this.j.encodeBytes=this.j.w;var C=this.s={},E={},F=[0,7];C.B=function(a,b,d){d=d||{};(d.dataReader||z)(a,function(e){e.g(F,function(){var f="ftypM4A"==e.d(4,7)?ID4:"ID3"==e.d(0,3)?ID3v2:ID3v1;f.q(e,function(){var h=d.tags,c=f.r(e,h),h=E[a]||{},k;for(k in c)c.hasOwnProperty(k)&&(h[k]=c[k]);E[a]=h;b&&b()})})})};C.z=function(a){if(!E[a])return y;var b={},d;for(d in E[a])E[a].hasOwnProperty(d)&&(b[d]=E[a][d]);return b};C.A=function(a,b){return!E[a]?y:E[a][b]};this.ID3=this.s;C.loadTags=C.B;C.getAllTags=C.z;C.getTag=C.A; C.BinaryFile=B;this.ID3v1=this.t={};function G(a,b){var d=b.a(a),e=b.a(a+1),f=b.a(a+2);return b.a(a+3)&127|(f&127)<<7|(e&127)<<14|(d&127)<<21}var H=this.D={};H.b={}; H.frames={BUF:"Recommended buffer size",CNT:"Play counter",COM:"Comments",CRA:"Audio encryption",CRM:"Encrypted meta frame",ETC:"Event timing codes",EQU:"Equalization",GEO:"General encapsulated object",IPL:"Involved people list",LNK:"Linked information",MCI:"Music CD Identifier",MLL:"MPEG location lookup table",PIC:"Attached picture",POP:"Popularimeter",REV:"Reverb",RVA:"Relative volume adjustment",SLT:"Synchronized lyric/text",STC:"Synced tempo codes",TAL:"Album/Movie/Show title",TBP:"BPM (Beats Per Minute)", TCM:"Composer",TCO:"Content type",TCR:"Copyright message",TDA:"Date",TDY:"Playlist delay",TEN:"Encoded by",TFT:"File type",TIM:"Time",TKE:"Initial key",TLA:"Language(s)",TLE:"Length",TMT:"Media type",TOA:"Original artist(s)/performer(s)",TOF:"Original filename",TOL:"Original Lyricist(s)/text writer(s)",TOR:"Original release year",TOT:"Original album/Movie/Show title",TP1:"Lead artist(s)/Lead performer(s)/Soloist(s)/Performing group",TP2:"Band/Orchestra/Accompaniment",TP3:"Conductor/Performer refinement", TP4:"Interpreted, remixed, or otherwise modified by",TPA:"Part of a set",TPB:"Publisher",TRC:"ISRC (International Standard Recording Code)",TRD:"Recording dates",TRK:"Track number/Position in set",TSI:"Size",TSS:"Software/hardware and settings used for encoding",TT1:"Content group description",TT2:"Title/Songname/Content description",TT3:"Subtitle/Description refinement",TXT:"Lyricist/text writer",TXX:"User defined text information frame",TYE:"Year",UFI:"Unique file identifier",ULT:"Unsychronized lyric/text transcription", WAF:"Official audio file webpage",WAR:"Official artist/performer webpage",WAS:"Official audio source webpage",WCM:"Commercial information",WCP:"Copyright/Legal information",WPB:"Publishers official webpage",WXX:"User defined URL link frame",AENC:"Audio encryption",APIC:"Attached picture",COMM:"Comments",COMR:"Commercial frame",ENCR:"Encryption method registration",EQUA:"Equalization",ETCO:"Event timing codes",GEOB:"General encapsulated object",GRID:"Group identification registration",IPLS:"Involved people list", LINK:"Linked information",MCDI:"Music CD identifier",MLLT:"MPEG location lookup table",OWNE:"Ownership frame",PRIV:"Private frame",PCNT:"Play counter",POPM:"Popularimeter",POSS:"Position synchronisation frame",RBUF:"Recommended buffer size",RVAD:"Relative volume adjustment",RVRB:"Reverb",SYLT:"Synchronized lyric/text",SYTC:"Synchronized tempo codes",TALB:"Album/Movie/Show title",TBPM:"BPM (beats per minute)",TCOM:"Composer",TCON:"Content type",TCOP:"Copyright message",TDAT:"Date",TDLY:"Playlist delay", TENC:"Encoded by",TEXT:"Lyricist/Text writer",TFLT:"File type",TIME:"Time",TIT1:"Content group description",TIT2:"Title/songname/content description",TIT3:"Subtitle/Description refinement",TKEY:"Initial key",TLAN:"Language(s)",TLEN:"Length",TMED:"Media type",TOAL:"Original album/movie/show title",TOFN:"Original filename",TOLY:"Original lyricist(s)/text writer(s)",TOPE:"Original artist(s)/performer(s)",TORY:"Original release year",TOWN:"File owner/licensee",TPE1:"Lead performer(s)/Soloist(s)",TPE2:"Band/orchestra/accompaniment", TPE3:"Conductor/performer refinement",TPE4:"Interpreted, remixed, or otherwise modified by",TPOS:"Part of a set",TPUB:"Publisher",TRCK:"Track number/Position in set",TRDA:"Recording dates",TRSN:"Internet radio station name",TRSO:"Internet radio station owner",TSIZ:"Size",TSRC:"ISRC (international standard recording code)",TSSE:"Software/Hardware and settings used for encoding",TYER:"Year",TXXX:"User defined text information frame",UFID:"Unique file identifier",USER:"Terms of use",USLT:"Unsychronized lyric/text transcription", WCOM:"Commercial information",WCOP:"Copyright/Legal information",WOAF:"Official audio file webpage",WOAR:"Official artist/performer webpage",WOAS:"Official audio source webpage",WORS:"Official internet radio station homepage",WPAY:"Payment",WPUB:"Publishers official webpage",WXXX:"User defined URL link frame"}; var J={title:["TIT2","TT2"],artist:["TPE1","TP1"],album:["TALB","TAL"],year:["TYER","TYE"],comment:["COMM","COM"],track:["TRCK","TRK"],genre:["TCON","TCO"],picture:["APIC","PIC"],lyrics:["USLT","ULT"]},K=["title","artist","album","track"];H.q=function(a,b){a.g([0,G(6,a)],b)}; H.r=function(a,b){var d=0,e=a.a(d+3);if(42.4"};var f=a.a(d+4),h=a.c(d+5,7),c=a.c(d+5,6),k=a.c(d+5,5),v=G(d+6,a),d=d+10;if(c)var p=a.h(d,x),d=d+(p+4);var e={version:"2."+e+"."+f,major:e,revision:f,flags:{unsynchronisation:h,extended_header:c,experimental_indicator:k},size:v},g;if(h)g={};else{for(var v=v-10,h=a,f=b,c={},k=e.major,p=[],m=0,i;i=(f||K)[m];m++)p=p.concat(J[i]||[i]);for(f=p;df.indexOf(g))&&(2255){return 255;} return val;};Util.copyAttributes=function(from,to,opts){var attr,_i,_len,_ref,_ref1,_results;if(opts==null){opts={};} _ref=from.attributes;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){attr=_ref[_i];if((opts.except!=null)&&(_ref1=attr.nodeName,__indexOf.call(opts.except,_ref1)>=0)){continue;} _results.push(to.setAttribute(attr.nodeName,attr.nodeValue));} return _results;};Util.dataArray=function(length){if(length==null){length=0;} if(Caman.NodeJS||(window.Uint8Array!=null)){return new Uint8Array(length);} return new Array(length);};return Util;})();if(typeof exports!=="undefined"&&exports!==null){Root=exports;Canvas=require('canvas');Image=Canvas.Image;Fiber=require('fibers');fs=require('fs');}else{Root=window;} Root.Caman=Caman=(function(){Caman.version={release:"4.1.1",date:"4/8/2013"};Caman.DEBUG=false;Caman.NodeJS=typeof exports!=="undefined"&&exports!==null;Caman.autoload=!Caman.NodeJS;Caman.allowRevert=true;Caman.crossOrigin="anonymous";Caman.toString=function(){return"Version "+Caman.version.release+", Released "+Caman.version.date;};Caman.remoteProxy="";Caman.proxyParam="camanProxyUrl";Caman.getAttrId=function(canvas){if(Caman.NodeJS){return true;} if(typeof canvas==="string"){canvas=$(canvas);} if(!((canvas!=null)&&(canvas.getAttribute!=null))){return null;} return canvas.getAttribute('data-caman-id');};function Caman(){var args,callback,id,_this=this;if(arguments.length===0){throw"Invalid arguments";} if(this instanceof Caman){this.finishInit=this.finishInit.bind(this);this.imageLoaded=this.imageLoaded.bind(this);args=arguments[0];if(!Caman.NodeJS){id=parseInt(Caman.getAttrId(args[0]),10);callback=typeof args[1]==="function"?args[1]:typeof args[2]==="function"?args[2]:function(){};if(!isNaN(id)&&Store.has(id)){return Store.execute(id,callback);}} this.id=Util.uniqid.get();this.initializedPixelData=this.originalPixelData=null;this.cropCoordinates={x:0,y:0};this.cropped=false;this.resized=false;this.pixelStack=[];this.layerStack=[];this.canvasQueue=[];this.currentLayer=null;this.scaled=false;this.analyze=new Analyze(this);this.renderer=new Renderer(this);this.domIsLoaded(function(){_this.parseArguments(args);return _this.setup();});return this;}else{return new Caman(arguments);}} Caman.prototype.domIsLoaded=function(cb){var listener,_this=this;if(Caman.NodeJS){return setTimeout(function(){return cb.call(_this);},0);}else{if(document.readyState==="complete"){Log.debug("DOM initialized");return setTimeout(function(){return cb.call(_this);},0);}else{listener=function(){if(document.readyState==="complete"){Log.debug("DOM initialized");return cb.call(_this);}};return document.addEventListener("readystatechange",listener,false);}}};Caman.prototype.parseArguments=function(args){var key,val,_ref,_results;if(args.length===0){throw"Invalid arguments given";} this.initObj=null;this.initType=null;this.imageUrl=null;this.callback=function(){};this.setInitObject(args[0]);if(args.length===1){return;} switch(typeof args[1]){case"string":this.imageUrl=args[1];break;case"function":this.callback=args[1];} if(args.length===2){return;} this.callback=args[2];if(args.length===4){_ref=args[4];_results=[];for(key in _ref){if(!__hasProp.call(_ref,key))continue;val=_ref[key];_results.push(this.options[key]=val);} return _results;}};Caman.prototype.setInitObject=function(obj){if(Caman.NodeJS){this.initObj=obj;this.initType='node';return;} if(typeof obj==="object"){this.initObj=obj;}else{this.initObj=$(obj);} if(this.initObj==null){throw"Could not find image or canvas for initialization.";} return this.initType=this.initObj.nodeName.toLowerCase();};Caman.prototype.setup=function(){switch(this.initType){case"node":return this.initNode();case"img":return this.initImage();case"canvas":return this.initCanvas();}};Caman.prototype.initNode=function(){var _this=this;Log.debug("Initializing for NodeJS");this.image=new Image();this.image.onload=function(){Log.debug("Image loaded. Width = "+(_this.imageWidth())+", Height = "+(_this.imageHeight()));_this.canvas=new Canvas(_this.imageWidth(),_this.imageHeight());return _this.finishInit();};this.image.onerror=function(err){throw err;};return this.image.src=this.initObj;};Caman.prototype.initImage=function(){this.image=this.initObj;this.canvas=document.createElement('canvas');this.context=this.canvas.getContext('2d');Util.copyAttributes(this.image,this.canvas,{except:['src']});this.image.parentNode.replaceChild(this.canvas,this.image);this.imageAdjustments();return this.waitForImageLoaded();};Caman.prototype.initCanvas=function(){this.canvas=this.initObj;this.context=this.canvas.getContext('2d');if(this.imageUrl!=null){this.image=document.createElement('img');this.image.src=this.imageUrl;this.imageAdjustments();return this.waitForImageLoaded();}else{return this.finishInit();}};Caman.prototype.imageAdjustments=function(){if(this.needsHiDPISwap()){Log.debug(this.image.src,"->",this.hiDPIReplacement());this.swapped=true;this.image.src=this.hiDPIReplacement();} if(IO.isRemote(this.image)){this.image.src=IO.proxyUrl(this.image.src);return Log.debug("Remote image detected, using URL = "+this.image.src);}};Caman.prototype.waitForImageLoaded=function(){if(this.isImageLoaded()){return this.imageLoaded();}else{return this.image.onload=this.imageLoaded;}};Caman.prototype.isImageLoaded=function(){if(!this.image.complete){return false;} if((this.image.naturalWidth!=null)&&this.image.naturalWidth===0){return false;} return true;};Caman.prototype.imageWidth=function(){return this.image.width||this.image.naturalWidth;};Caman.prototype.imageHeight=function(){return this.image.height||this.image.naturalHeight;};Caman.prototype.imageLoaded=function(){Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));if(this.swapped){this.canvas.width=this.imageWidth()/this.hiDPIRatio();this.canvas.height=this.imageHeight()/this.hiDPIRatio();}else{this.canvas.width=this.imageWidth();this.canvas.height=this.imageHeight();} return this.finishInit();};Caman.prototype.finishInit=function(){var i,pixel,_i,_len,_ref;if(this.context==null){this.context=this.canvas.getContext('2d');} this.originalWidth=this.preScaledWidth=this.width=this.canvas.width;this.originalHeight=this.preScaledHeight=this.height=this.canvas.height;this.hiDPIAdjustments();if(!this.hasId()){this.assignId();} if(this.image!=null){this.context.drawImage(this.image,0,0,this.imageWidth(),this.imageHeight(),0,0,this.preScaledWidth,this.preScaledHeight);} this.reloadCanvasData();if(Caman.allowRevert){this.initializedPixelData=Util.dataArray(this.pixelData.length);this.originalPixelData=Util.dataArray(this.pixelData.length);_ref=this.pixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];this.initializedPixelData[i]=pixel;this.originalPixelData[i]=pixel;}} this.dimensions={width:this.canvas.width,height:this.canvas.height};Store.put(this.id,this);this.callback.call(this,this);return this.callback=function(){};};Caman.prototype.reloadCanvasData=function(){this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);return this.pixelData=this.imageData.data;};Caman.prototype.resetOriginalPixelData=function(){var pixel,_i,_len,_ref,_results;if(!Caman.allowRevert){throw"Revert disabled";} this.originalPixelData=Util.dataArray(this.pixelData.length);_ref=this.pixelData;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){pixel=_ref[_i];_results.push(this.originalPixelData.push(pixel));} return _results;};Caman.prototype.hasId=function(){return Caman.getAttrId(this.canvas)!=null;};Caman.prototype.assignId=function(){if(Caman.NodeJS||this.canvas.getAttribute('data-caman-id')){return;} return this.canvas.setAttribute('data-caman-id',this.id);};Caman.prototype.hiDPIDisabled=function(){return this.canvas.getAttribute('data-caman-hidpi-disabled')!==null;};Caman.prototype.hiDPIAdjustments=function(){var ratio;if(Caman.NodeJS||this.hiDPIDisabled()){return;} ratio=this.hiDPIRatio();if(ratio!==1){Log.debug("HiDPI ratio = "+ratio);this.scaled=true;this.preScaledWidth=this.canvas.width;this.preScaledHeight=this.canvas.height;this.canvas.width=this.preScaledWidth*ratio;this.canvas.height=this.preScaledHeight*ratio;this.canvas.style.width=""+this.preScaledWidth+"px";this.canvas.style.height=""+this.preScaledHeight+"px";this.context.scale(ratio,ratio);this.width=this.originalWidth=this.canvas.width;return this.height=this.originalHeight=this.canvas.height;}};Caman.prototype.hiDPIRatio=function(){var backingStoreRatio,devicePixelRatio;devicePixelRatio=window.devicePixelRatio||1;backingStoreRatio=this.context.webkitBackingStorePixelRatio||this.context.mozBackingStorePixelRatio||this.context.msBackingStorePixelRatio||this.context.oBackingStorePixelRatio||this.context.backingStorePixelRatio||1;return devicePixelRatio/backingStoreRatio;};Caman.prototype.hiDPICapable=function(){return(window.devicePixelRatio!=null)&&window.devicePixelRatio!==1;};Caman.prototype.needsHiDPISwap=function(){if(this.hiDPIDisabled()||!this.hiDPICapable()){return false;} return this.hiDPIReplacement()!==null;};Caman.prototype.hiDPIReplacement=function(){if(this.image==null){return null;} return this.image.getAttribute('data-caman-hidpi');};Caman.prototype.replaceCanvas=function(newCanvas){var oldCanvas;oldCanvas=this.canvas;this.canvas=newCanvas;this.context=this.canvas.getContext('2d');oldCanvas.parentNode.replaceChild(this.canvas,oldCanvas);this.width=this.canvas.width;this.height=this.canvas.height;this.reloadCanvasData();return this.dimensions={width:this.canvas.width,height:this.canvas.height};};Caman.prototype.render=function(callback){var _this=this;if(callback==null){callback=function(){};} Event.trigger(this,"renderStart");return this.renderer.execute(function(){_this.context.putImageData(_this.imageData,0,0);return callback.call(_this);});};Caman.prototype.revert=function(){var i,pixel,_i,_len,_ref;if(!Caman.allowRevert){throw"Revert disabled";} _ref=this.originalVisiblePixels();for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];this.pixelData[i]=pixel;} return this.context.putImageData(this.imageData,0,0);};Caman.prototype.reset=function(){var canvas,ctx,i,imageData,pixel,pixelData,_i,_len,_ref;canvas=document.createElement('canvas');Util.copyAttributes(this.canvas,canvas);canvas.width=this.originalWidth;canvas.height=this.originalHeight;ctx=canvas.getContext('2d');imageData=ctx.getImageData(0,0,canvas.width,canvas.height);pixelData=imageData.data;_ref=this.initializedPixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];pixelData[i]=pixel;} ctx.putImageData(imageData,0,0);this.cropCoordinates={x:0,y:0};this.resized=false;return this.replaceCanvas(canvas);};Caman.prototype.originalVisiblePixels=function(){var canvas,coord,ctx,endX,endY,i,imageData,pixel,pixelData,pixels,scaledCanvas,startX,startY,width,_i,_j,_len,_ref,_ref1,_ref2,_ref3;if(!Caman.allowRevert){throw"Revert disabled";} pixels=[];startX=this.cropCoordinates.x;endX=startX+this.width;startY=this.cropCoordinates.y;endY=startY+this.height;if(this.resized){canvas=document.createElement('canvas');canvas.width=this.originalWidth;canvas.height=this.originalHeight;ctx=canvas.getContext('2d');imageData=ctx.getImageData(0,0,canvas.width,canvas.height);pixelData=imageData.data;_ref=this.originalPixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];pixelData[i]=pixel;} ctx.putImageData(imageData,0,0);scaledCanvas=document.createElement('canvas');scaledCanvas.width=this.width;scaledCanvas.height=this.height;ctx=scaledCanvas.getContext('2d');ctx.drawImage(canvas,0,0,this.originalWidth,this.originalHeight,0,0,this.width,this.height);pixelData=ctx.getImageData(0,0,this.width,this.height).data;width=this.width;}else{pixelData=this.originalPixelData;width=this.originalWidth;} for(i=_j=0,_ref1=pixelData.length;_j<_ref1;i=_j+=4){coord=PixelInfo.locationToCoordinates(i,width);if(((startX<=(_ref2=coord.x)&&_ref2_ref;i=0<=_ref?++_i:--_i){divisor+=adjust[i];}} this.renderer.add({type:Filter.Type.Kernel,name:name,adjust:adjust,divisor:divisor,bias:bias||0});return this;};Caman.prototype.processPlugin=function(plugin,args){this.renderer.add({type:Filter.Type.Plugin,plugin:plugin,args:args});return this;};Caman.prototype.newLayer=function(callback){var layer;layer=new Layer(this);this.canvasQueue.push(layer);this.renderer.add({type:Filter.Type.LayerDequeue});callback.call(layer);this.renderer.add({type:Filter.Type.LayerFinished});return this;};Caman.prototype.executeLayer=function(layer){return this.pushContext(layer);};Caman.prototype.pushContext=function(layer){this.layerStack.push(this.currentLayer);this.pixelStack.push(this.pixelData);this.currentLayer=layer;return this.pixelData=layer.pixelData;};Caman.prototype.popContext=function(){this.pixelData=this.pixelStack.pop();return this.currentLayer=this.layerStack.pop();};Caman.prototype.applyCurrentLayer=function(){return this.currentLayer.applyToParent();};return Caman;})();Analyze=(function(){function Analyze(c){this.c=c;} Analyze.prototype.calculateLevels=function(){var i,levels,numPixels,_i,_j,_k,_ref;levels={r:{},g:{},b:{}};for(i=_i=0;_i<=255;i=++_i){levels.r[i]=0;levels.g[i]=0;levels.b[i]=0;} for(i=_j=0,_ref=this.c.pixelData.length;_j<_ref;i=_j+=4){levels.r[this.c.pixelData[i]]++;levels.g[this.c.pixelData[i+1]]++;levels.b[this.c.pixelData[i+2]]++;} numPixels=this.c.pixelData.length/4;for(i=_k=0;_k<=255;i=++_k){levels.r[i]/=numPixels;levels.g[i]/=numPixels;levels.b[i]/=numPixels;} return levels;};return Analyze;})();Caman.DOMUpdated=function(){var img,imgs,parser,_i,_len,_results;imgs=document.querySelectorAll("img[data-caman]");if(!(imgs.length>0)){return;} _results=[];for(_i=0,_len=imgs.length;_i<_len;_i++){img=imgs[_i];_results.push(parser=new CamanParser(img,function(){this.parse();return this.execute();}));} return _results;};if(Caman.autoload){(function(){if(document.readyState==="complete"){return Caman.DOMUpdated();}else{return document.addEventListener("DOMContentLoaded",Caman.DOMUpdated,false);}})();} CamanParser=(function(){var INST_REGEX;INST_REGEX="(\\w+)\\((.*?)\\)";function CamanParser(ele,ready){this.dataStr=ele.getAttribute('data-caman');this.caman=Caman(ele,ready.bind(this));} CamanParser.prototype.parse=function(){var args,filter,func,inst,instFunc,m,r,unparsedInstructions,_i,_len,_ref,_results;this.ele=this.caman.canvas;r=new RegExp(INST_REGEX,'g');unparsedInstructions=this.dataStr.match(r);if(!(unparsedInstructions.length>0)){return;} r=new RegExp(INST_REGEX);_results=[];for(_i=0,_len=unparsedInstructions.length;_i<_len;_i++){inst=unparsedInstructions[_i];_ref=inst.match(r),m=_ref[0],filter=_ref[1],args=_ref[2];instFunc=new Function("return function() { this."+filter+"("+args+"); };");try{func=instFunc();_results.push(func.call(this.caman));}catch(e){_results.push(Log.debug(e));}} return _results;};CamanParser.prototype.execute=function(){var ele;ele=this.ele;return this.caman.render(function(){return ele.parentNode.replaceChild(this.toImage(),ele);});};return CamanParser;})();Caman.Blender=Blender=(function(){function Blender(){} Blender.blenders={};Blender.register=function(name,func){return this.blenders[name]=func;};Blender.execute=function(name,rgbaLayer,rgbaParent){return this.blenders[name](rgbaLayer,rgbaParent);};return Blender;})();Caman.Calculate=Calculate=(function(){function Calculate(){} Calculate.distance=function(x1,y1,x2,y2){return Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));};Calculate.randomRange=function(min,max,getFloat){var rand;if(getFloat==null){getFloat=false;} rand=min+(Math.random()*(max-min));if(getFloat){return rand.toFixed(getFloat);}else{return Math.round(rand);}};Calculate.luminance=function(rgba){return(0.299*rgba.r)+(0.587*rgba.g)+(0.114*rgba.b);};Calculate.bezier=function(start,ctrl1,ctrl2,end,lowBound,highBound){var Ax,Ay,Bx,By,Cx,Cy,bezier,curveX,curveY,i,j,leftCoord,rightCoord,t,x0,x1,x2,x3,y0,y1,y2,y3,_i,_j,_k,_ref,_ref1;x0=start[0];y0=start[1];x1=ctrl1[0];y1=ctrl1[1];x2=ctrl2[0];y2=ctrl2[1];x3=end[0];y3=end[1];bezier={};Cx=parseInt(3*(x1-x0),10);Bx=3*(x2-x1)-Cx;Ax=x3-x0-Cx-Bx;Cy=3*(y1-y0);By=3*(y2-y1)-Cy;Ay=y3-y0-Cy-By;for(i=_i=0;_i<1000;i=++_i){t=i/1000;curveX=Math.round((Ax*Math.pow(t,3))+(Bx*Math.pow(t,2))+(Cx*t)+x0);curveY=Math.round((Ay*Math.pow(t,3))+(By*Math.pow(t,2))+(Cy*t)+y0);if(lowBound&&curveYhighBound){curveY=highBound;} bezier[curveX]=curveY;} if(bezier.length=_ref;i=0<=_ref?++_j:--_j){if(bezier[i]==null){leftCoord=[i-1,bezier[i-1]];for(j=_k=i,_ref1=end[0];i<=_ref1?_k<=_ref1:_k>=_ref1;j=i<=_ref1?++_k:--_k){if(bezier[j]!=null){rightCoord=[j,bezier[j]];break;}} bezier[i]=leftCoord[1]+((rightCoord[1]-leftCoord[1])/(rightCoord[0]-leftCoord[0]))*(i-leftCoord[0]);}}} if(bezier[end[0]]==null){bezier[end[0]]=bezier[end[0]-1];} return bezier;};return Calculate;})();Convert=(function(){function Convert(){} Convert.hexToRGB=function(hex){var b,g,r;if(hex.charAt(0)==="#"){hex=hex.substr(1);} r=parseInt(hex.substr(0,2),16);g=parseInt(hex.substr(2,2),16);b=parseInt(hex.substr(4,2),16);return{r:r,g:g,b:b};};Convert.rgbToHSL=function(r,g,b){var d,h,l,max,min,s;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);l=(max+min)/2;if(max===min){h=s=0;}else{d=max-min;s=l>0.5?d/(2-max-min):d/(max+min);h=(function(){switch(max){case r:return(g-b)/d+(g1){t-=1;} if(t<1/6){return p+(q-p)*6*t;} if(t<1/2){return q;} if(t<2/3){return p+(q-p)*(2/3-t)*6;} return p;};Convert.rgbToHSV=function(r,g,b){var d,h,max,min,s,v;r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);v=max;d=max-min;s=max===0?0:d/max;if(max===min){h=0;}else{h=(function(){switch(max){case r:return(g-b)/d+(g0.04045){r=Math.pow((r+0.055)/1.055,2.4);}else{r/=12.92;} if(g>0.04045){g=Math.pow((g+0.055)/1.055,2.4);}else{g/=12.92;} if(b>0.04045){b=Math.pow((b+0.055)/1.055,2.4);}else{b/=12.92;} x=r*0.4124+g*0.3576+b*0.1805;y=r*0.2126+g*0.7152+b*0.0722;z=r*0.0193+g*0.1192+b*0.9505;return{x:x*100,y:y*100,z:z*100};};Convert.xyzToRGB=function(x,y,z){var b,g,r;x/=100;y/=100;z/=100;r=(3.2406*x)+(-1.5372*y)+(-0.4986*z);g=(-0.9689*x)+(1.8758*y)+(0.0415*z);b=(0.0557*x)+(-0.2040*y)+(1.0570*z);if(r>0.0031308){r=(1.055*Math.pow(r,0.4166666667))-0.055;}else{r*=12.92;} if(g>0.0031308){g=(1.055*Math.pow(g,0.4166666667))-0.055;}else{g*=12.92;} if(b>0.0031308){b=(1.055*Math.pow(b,0.4166666667))-0.055;}else{b*=12.92;} return{r:r*255,g:g*255,b:b*255};};Convert.xyzToLab=function(x,y,z){var a,b,l,whiteX,whiteY,whiteZ;if(typeof x==="object"){y=x.y;z=x.z;x=x.x;} whiteX=95.047;whiteY=100.0;whiteZ=108.883;x/=whiteX;y/=whiteY;z/=whiteZ;if(x>0.008856451679){x=Math.pow(x,0.3333333333);}else{x=(7.787037037*x)+0.1379310345;} if(y>0.008856451679){y=Math.pow(y,0.3333333333);}else{y=(7.787037037*y)+0.1379310345;} if(z>0.008856451679){z=Math.pow(z,0.3333333333);}else{z=(7.787037037*z)+0.1379310345;} l=116*y-16;a=500*(x-y);b=200*(y-z);return{l:l,a:a,b:b};};Convert.labToXYZ=function(l,a,b){var x,y,z;if(typeof l==="object"){a=l.a;b=l.b;l=l.l;} y=(l+16)/116;x=y+(a/500);z=y-(b/200);if(x>0.2068965517){x=x*x*x;}else{x=0.1284185493*(x-0.1379310345);} if(y>0.2068965517){y=y*y*y;}else{y=0.1284185493*(y-0.1379310345);} if(z>0.2068965517){z=z*z*z;}else{z=0.1284185493*(z-0.1379310345);} return{x:x*95.047,y:y*100.0,z:z*108.883};};Convert.rgbToLab=function(r,g,b){var xyz;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} xyz=this.rgbToXYZ(r,g,b);return this.xyzToLab(xyz);};Convert.labToRGB=function(l,a,b){};return Convert;})();Event=(function(){function Event(){} Event.events={};Event.types=["processStart","processComplete","renderStart","renderFinished","blockStarted","blockFinished"];Event.trigger=function(target,type,data){var event,_i,_len,_ref,_results;if(this.events[type]&&this.events[type].length){_ref=this.events[type];_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){event=_ref[_i];if(event.target===null||target.id===event.target.id){_results.push(event.fn.call(target,data));}else{_results.push(void 0);}} return _results;}};Event.listen=function(target,type,fn){var _fn,_type;if(typeof target==="string"){_type=target;_fn=type;target=null;type=_type;fn=_fn;} if(__indexOf.call(this.types,type)<0){return false;} if(!this.events[type]){this.events[type]=[];} this.events[type].push({target:target,fn:fn});return true;};return Event;})();Caman.Event=Event;Caman.Filter=Filter=(function(){function Filter(){} Filter.Type={Single:1,Kernel:2,LayerDequeue:3,LayerFinished:4,LoadOverlay:5,Plugin:6};Filter.register=function(name,filterFunc){return Caman.prototype[name]=filterFunc;};return Filter;})();Caman.IO=IO=(function(){function IO(){} IO.domainRegex=/(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/;IO.isRemote=function(img){if(img==null){return false;} if(this.corsEnabled(img)){return false;} return this.isURLRemote(img.src);};IO.corsEnabled=function(img){var _ref;return(img.crossOrigin!=null)&&((_ref=img.crossOrigin.toLowerCase())==='anonymous'||_ref==='use-credentials');};IO.isURLRemote=function(url){var matches;matches=url.match(this.domainRegex);if(matches){return matches[1]!==document.domain;}else{return false;}};IO.remoteCheck=function(src){if(this.isURLRemote(src)){if(!Caman.remoteProxy.length){Log.info("Attempting to load a remote image without a configured proxy. URL: "+src);}else{if(Caman.isURLRemote(Caman.remoteProxy)){Log.info("Cannot use a remote proxy for loading images.");return;} return""+Caman.remoteProxy+"?camanProxyUrl="+(encodeURIComponent(src));}}};IO.proxyUrl=function(src){return""+Caman.remoteProxy+"?"+Caman.proxyParam+"="+(encodeURIComponent(src));};IO.useProxy=function(lang){var langToExt;langToExt={ruby:'rb',python:'py',perl:'pl',javascript:'js'};lang=lang.toLowerCase();if(langToExt[lang]!=null){lang=langToExt[lang];} return"proxies/caman_proxy."+lang;};return IO;})();Caman.prototype.save=function(){if(typeof exports!=="undefined"&&exports!==null){return this.nodeSave.apply(this,arguments);}else{return this.browserSave.apply(this,arguments);}};Caman.prototype.browserSave=function(type){var image;if(type==null){type="png";} type=type.toLowerCase();image=this.toBase64(type).replace("image/"+type,"image/octet-stream");return document.location.href=image;};Caman.prototype.nodeSave=function(file,overwrite){var stats;if(overwrite==null){overwrite=true;} try{stats=fs.statSync(file);if(stats.isFile()&&!overwrite){return false;}}catch(e){Log.debug("Creating output file "+file);} return fs.writeFile(file,this.canvas.toBuffer(),function(){return Log.debug("Finished writing to "+file);});};Caman.prototype.toImage=function(type){var img;img=document.createElement('img');img.src=this.toBase64(type);img.width=this.dimensions.width;img.height=this.dimensions.height;if(window.devicePixelRatio){img.width/=window.devicePixelRatio;img.height/=window.devicePixelRatio;} return img;};Caman.prototype.toBase64=function(type){if(type==null){type="png";} type=type.toLowerCase();return this.canvas.toDataURL("image/"+type);};Layer=(function(){function Layer(c){this.c=c;this.filter=this.c;this.options={blendingMode:'normal',opacity:1.0};this.layerID=Util.uniqid.get();this.canvas=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');this.canvas.width=this.c.dimensions.width;this.canvas.height=this.c.dimensions.height;this.context=this.canvas.getContext('2d');this.context.createImageData(this.canvas.width,this.canvas.height);this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;} Layer.prototype.newLayer=function(cb){return this.c.newLayer.call(this.c,cb);};Layer.prototype.setBlendingMode=function(mode){this.options.blendingMode=mode;return this;};Layer.prototype.opacity=function(opacity){this.options.opacity=opacity/100;return this;};Layer.prototype.copyParent=function(){var i,parentData,_i,_ref;parentData=this.c.pixelData;for(i=_i=0,_ref=this.c.pixelData.length;_i<_ref;i=_i+=4){this.pixelData[i]=parentData[i];this.pixelData[i+1]=parentData[i+1];this.pixelData[i+2]=parentData[i+2];this.pixelData[i+3]=parentData[i+3];} return this;};Layer.prototype.fillColor=function(){return this.c.fillColor.apply(this.c,arguments);};Layer.prototype.overlayImage=function(image){if(typeof image==="object"){image=image.src;}else if(typeof image==="string"&&image[0]==="#"){image=$(image).src;} if(!image){return this;} this.c.renderer.renderQueue.push({type:Filter.Type.LoadOverlay,src:image,layer:this});return this;};Layer.prototype.applyToParent=function(){var i,layerData,parentData,result,rgbaLayer,rgbaParent,_i,_ref,_results;parentData=this.c.pixelStack[this.c.pixelStack.length-1];layerData=this.c.pixelData;_results=[];for(i=_i=0,_ref=layerData.length;_i<_ref;i=_i+=4){rgbaParent={r:parentData[i],g:parentData[i+1],b:parentData[i+2],a:parentData[i+3]};rgbaLayer={r:layerData[i],g:layerData[i+1],b:layerData[i+2],a:layerData[i+3]};result=Blender.execute(this.options.blendingMode,rgbaLayer,rgbaParent);result.r=Util.clampRGB(result.r);result.g=Util.clampRGB(result.g);result.b=Util.clampRGB(result.b);if(result.a==null){result.a=rgbaLayer.a;} parentData[i]=rgbaParent.r-((rgbaParent.r-result.r)*(this.options.opacity*(result.a/255)));parentData[i+1]=rgbaParent.g-((rgbaParent.g-result.g)*(this.options.opacity*(result.a/255)));_results.push(parentData[i+2]=rgbaParent.b-((rgbaParent.b-result.b)*(this.options.opacity*(result.a/255))));} return _results;};return Layer;})();Logger=(function(){function Logger(){var name,_i,_len,_ref;_ref=['log','info','warn','error'];for(_i=0,_len=_ref.length;_i<_len;_i++){name=_ref[_i];this[name]=(function(name){return function(){var args;args=1<=arguments.length?__slice.call(arguments,0):[];if(!Caman.DEBUG){return;} try{return console[name].apply(console,args);}catch(e){return console[name](args);}};})(name);} this.debug=this.log;} return Logger;})();Log=new Logger();PixelInfo=(function(){PixelInfo.coordinatesToLocation=function(x,y,width){return(y*width+x)*4;};PixelInfo.locationToCoordinates=function(loc,width){var x,y;y=Math.floor(loc/(width*4));x=(loc%(width*4))/4;return{x:x,y:y};};function PixelInfo(c){this.c=c;this.loc=0;} PixelInfo.prototype.locationXY=function(){var x,y;y=this.c.dimensions.height-Math.floor(this.loc/(this.c.dimensions.width*4));x=(this.loc%(this.c.dimensions.width*4))/4;return{x:x,y:y};};PixelInfo.prototype.getPixelRelative=function(horiz,vert){var newLoc;newLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return{r:0,g:0,b:0,a:0};} return{r:this.c.pixelData[newLoc],g:this.c.pixelData[newLoc+1],b:this.c.pixelData[newLoc+2],a:this.c.pixelData[newLoc+3]};};PixelInfo.prototype.putPixelRelative=function(horiz,vert,rgba){var nowLoc;nowLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return;} this.c.pixelData[newLoc]=rgba.r;this.c.pixelData[newLoc+1]=rgba.g;this.c.pixelData[newLoc+2]=rgba.b;this.c.pixelData[newLoc+3]=rgba.a;return true;};PixelInfo.prototype.getPixel=function(x,y){var loc;loc=this.coordinatesToLocation(x,y,this.width);return{r:this.c.pixelData[loc],g:this.c.pixelData[loc+1],b:this.c.pixelData[loc+2],a:this.c.pixelData[loc+3]};};PixelInfo.prototype.putPixel=function(x,y,rgba){var loc;loc=this.coordinatesToLocation(x,y,this.width);this.c.pixelData[loc]=rgba.r;this.c.pixelData[loc+1]=rgba.g;this.c.pixelData[loc+2]=rgba.b;return this.c.pixelData[loc+3]=rgba.a;};return PixelInfo;})();Plugin=(function(){function Plugin(){} Plugin.plugins={};Plugin.register=function(name,plugin){return this.plugins[name]=plugin;};Plugin.execute=function(context,name,args){return this.plugins[name].apply(context,args);};return Plugin;})();Caman.Plugin=Plugin;Caman.Renderer=Renderer=(function(){Renderer.Blocks=Caman.NodeJS?require('os').cpus().length:4;function Renderer(c){var _this=this;this.c=c;this.processNext=function(){return Renderer.prototype.processNext.apply(_this,arguments);};this.renderQueue=[];this.modPixelData=null;} Renderer.prototype.add=function(job){if(job==null){return;} return this.renderQueue.push(job);};Renderer.prototype.processNext=function(){var layer;if(this.renderQueue.length===0){Event.trigger(this,"renderFinished");if(this.finishedFn!=null){this.finishedFn.call(this.c);} return this;} this.currentJob=this.renderQueue.shift();switch(this.currentJob.type){case Filter.Type.LayerDequeue:layer=this.c.canvasQueue.shift();this.c.executeLayer(layer);return this.processNext();case Filter.Type.LayerFinished:this.c.applyCurrentLayer();this.c.popContext();return this.processNext();case Filter.Type.LoadOverlay:return this.loadOverlay(this.currentJob.layer,this.currentJob.src);case Filter.Type.Plugin:return this.executePlugin();default:return this.executeFilter();}};Renderer.prototype.execute=function(callback){this.finishedFn=callback;this.modPixelData=Util.dataArray(this.c.pixelData.length);return this.processNext();};Renderer.prototype.eachBlock=function(fn){var blockN,blockPixelLength,bnum,end,f,i,lastBlockN,n,start,_i,_ref,_results,_this=this;this.blocksDone=0;n=this.c.pixelData.length;blockPixelLength=Math.floor((n/4)/Renderer.Blocks);blockN=blockPixelLength*4;lastBlockN=blockN+((n/4)%Renderer.Blocks)*4;_results=[];for(i=_i=0,_ref=Renderer.Blocks;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){start=i*blockN;end=start+(i===Renderer.Blocks-1?lastBlockN:blockN);if(Caman.NodeJS){f=Fiber(function(){return fn.call(_this,i,start,end);});bnum=f.run();_results.push(this.blockFinished(bnum));}else{_results.push(setTimeout((function(i,start,end){return function(){return fn.call(_this,i,start,end);};})(i,start,end),0));}} return _results;};Renderer.prototype.executeFilter=function(){Event.trigger(this.c,"processStart",this.currentJob);if(this.currentJob.type===Filter.Type.Single){return this.eachBlock(this.renderBlock);}else{return this.eachBlock(this.renderKernel);}};Renderer.prototype.executePlugin=function(){Log.debug("Executing plugin "+this.currentJob.plugin);Plugin.execute(this.c,this.currentJob.plugin,this.currentJob.args);Log.debug("Plugin "+this.currentJob.plugin+" finished!");return this.processNext();};Renderer.prototype.renderBlock=function(bnum,start,end){var data,i,pixelInfo,res,_i;Log.debug("Block #"+bnum+" - Filter: "+this.currentJob.name+", Start: "+start+", End: "+end);Event.trigger(this.c,"blockStarted",{blockNum:bnum,totalBlocks:Renderer.Blocks,startPixel:start,endPixel:end});data={r:0,g:0,b:0,a:0};pixelInfo=new PixelInfo(this.c);for(i=_i=start;_i=builder;j=-builder<=builder?++_j:--_j){for(k=_k=builder;builder<=-builder?_k<=-builder:_k>=-builder;k=builder<=-builder?++_k:--_k){pixel=pixelInfo.getPixelRelative(j,k);kernel[builderIndex*3]=pixel.r;kernel[builderIndex*3+1]=pixel.g;kernel[builderIndex*3+2]=pixel.b;builderIndex++;}} res=this.processKernel(adjust,kernel,divisor,bias);this.modPixelData[i]=Util.clampRGB(res.r);this.modPixelData[i+1]=Util.clampRGB(res.g);this.modPixelData[i+2]=Util.clampRGB(res.b);this.modPixelData[i+3]=this.c.pixelData[i+3];} if(Caman.NodeJS){return Fiber["yield"](bnum);}else{return this.blockFinished(bnum);}};Renderer.prototype.blockFinished=function(bnum){var i,_i,_ref;if(bnum>=0){Log.debug("Block #"+bnum+" finished! Filter: "+this.currentJob.name);} this.blocksDone++;Event.trigger(this.c,"blockFinished",{blockNum:bnum,blocksFinished:this.blocksDone,totalBlocks:Renderer.Blocks});if(this.blocksDone===Renderer.Blocks){if(this.currentJob.type===Filter.Type.Kernel){for(i=_i=0,_ref=this.c.pixelData.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){this.c.pixelData[i]=this.modPixelData[i];}} if(bnum>=0){Log.debug("Filter "+this.currentJob.name+" finished!");} Event.trigger(this.c,"processComplete",this.currentJob);return this.processNext();}};Renderer.prototype.processKernel=function(adjust,kernel,divisor,bias){var i,val,_i,_ref;val={r:0,g:0,b:0};for(i=_i=0,_ref=adjust.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){val.r+=adjust[i]*kernel[i*3];val.g+=adjust[i]*kernel[i*3+1];val.b+=adjust[i]*kernel[i*3+2];} val.r=(val.r/divisor)+bias;val.g=(val.g/divisor)+bias;val.b=(val.b/divisor)+bias;return val;};Renderer.prototype.loadOverlay=function(layer,src){var img,proxyUrl,_this=this;img=document.createElement('img');img.onload=function(){layer.context.drawImage(img,0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.imageData=layer.context.getImageData(0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.pixelData=layer.imageData.data;_this.c.pixelData=layer.pixelData;return _this.processNext();};proxyUrl=IO.remoteCheck(src);return img.src=proxyUrl!=null?proxyUrl:src;};return Renderer;})();Caman.Store=Store=(function(){function Store(){} Store.items={};Store.has=function(search){return this.items[search]!=null;};Store.get=function(search){return this.items[search];};Store.put=function(name,obj){return this.items[name]=obj;};Store.execute=function(search,callback){var _this=this;setTimeout(function(){return callback.call(_this.get(search),_this.get(search));},0);return this.get(search);};Store.flush=function(name){if(name==null){name=false;} if(name){return delete this.items[name];}else{return this.items={};}};return Store;})();Blender.register("normal",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r,g:rgbaLayer.g,b:rgbaLayer.b};});Blender.register("multiply",function(rgbaLayer,rgbaParent){return{r:(rgbaLayer.r*rgbaParent.r)/255,g:(rgbaLayer.g*rgbaParent.g)/255,b:(rgbaLayer.b*rgbaParent.b)/255};});Blender.register("screen",function(rgbaLayer,rgbaParent){return{r:255-(((255-rgbaLayer.r)*(255-rgbaParent.r))/255),g:255-(((255-rgbaLayer.g)*(255-rgbaParent.g))/255),b:255-(((255-rgbaLayer.b)*(255-rgbaParent.b))/255)};});Blender.register("overlay",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-2*(255-rgbaLayer.r)*(255-rgbaParent.r)/255:(rgbaParent.r*rgbaLayer.r*2)/255;result.g=rgbaParent.g>128?255-2*(255-rgbaLayer.g)*(255-rgbaParent.g)/255:(rgbaParent.g*rgbaLayer.g*2)/255;result.b=rgbaParent.b>128?255-2*(255-rgbaLayer.b)*(255-rgbaParent.b)/255:(rgbaParent.b*rgbaLayer.b*2)/255;return result;});Blender.register("difference",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r-rgbaParent.r,g:rgbaLayer.g-rgbaParent.g,b:rgbaLayer.b-rgbaParent.b};});Blender.register("addition",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r+rgbaLayer.r,g:rgbaParent.g+rgbaLayer.g,b:rgbaParent.b+rgbaLayer.b};});Blender.register("exclusion",function(rgbaLayer,rgbaParent){return{r:128-2*(rgbaParent.r-128)*(rgbaLayer.r-128)/255,g:128-2*(rgbaParent.g-128)*(rgbaLayer.g-128)/255,b:128-2*(rgbaParent.b-128)*(rgbaLayer.b-128)/255};});Blender.register("softLight",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-((255-rgbaParent.r)*(255-(rgbaLayer.r-128)))/255:(rgbaParent.r*(rgbaLayer.r+128))/255;result.g=rgbaParent.g>128?255-((255-rgbaParent.g)*(255-(rgbaLayer.g-128)))/255:(rgbaParent.g*(rgbaLayer.g+128))/255;result.b=rgbaParent.b>128?255-((255-rgbaParent.b)*(255-(rgbaLayer.b-128)))/255:(rgbaParent.b*(rgbaLayer.b+128))/255;return result;});Blender.register("lighten",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaParent.r:rgbaLayer.r,g:rgbaParent.g>rgbaLayer.g?rgbaParent.g:rgbaLayer.g,b:rgbaParent.b>rgbaLayer.b?rgbaParent.b:rgbaLayer.b};});Blender.register("darken",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaLayer.r:rgbaParent.r,g:rgbaParent.g>rgbaLayer.g?rgbaLayer.g:rgbaParent.g,b:rgbaParent.b>rgbaLayer.b?rgbaLayer.b:rgbaParent.b};});Filter.register("fillColor",function(){var color;if(arguments.length===1){color=Convert.hexToRGB(arguments[0]);}else{color={r:arguments[0],g:arguments[1],b:arguments[2]};} return this.process("fillColor",function(rgba){rgba.r=color.r;rgba.g=color.g;rgba.b=color.b;rgba.a=255;return rgba;});});Filter.register("brightness",function(adjust){adjust=Math.floor(255*(adjust/100));return this.process("brightness",function(rgba){rgba.r+=adjust;rgba.g+=adjust;rgba.b+=adjust;return rgba;});});Filter.register("saturation",function(adjust){adjust*=-0.01;return this.process("saturation",function(rgba){var max;max=Math.max(rgba.r,rgba.g,rgba.b);if(rgba.r!==max){rgba.r+=(max-rgba.r)*adjust;} if(rgba.g!==max){rgba.g+=(max-rgba.g)*adjust;} if(rgba.b!==max){rgba.b+=(max-rgba.b)*adjust;} return rgba;});});Filter.register("vibrance",function(adjust){adjust*=-1;return this.process("vibrance",function(rgba){var amt,avg,max;max=Math.max(rgba.r,rgba.g,rgba.b);avg=(rgba.r+rgba.g+rgba.b)/3;amt=((Math.abs(max-avg)*2/255)*adjust)/100;if(rgba.r!==max){rgba.r+=(max-rgba.r)*amt;} if(rgba.g!==max){rgba.g+=(max-rgba.g)*amt;} if(rgba.b!==max){rgba.b+=(max-rgba.b)*amt;} return rgba;});});Filter.register("greyscale",function(adjust){return this.process("greyscale",function(rgba){var avg;avg=Calculate.luminance(rgba);rgba.r=avg;rgba.g=avg;rgba.b=avg;return rgba;});});Filter.register("contrast",function(adjust){adjust=Math.pow((adjust+100)/100,2);return this.process("contrast",function(rgba){rgba.r/=255;rgba.r-=0.5;rgba.r*=adjust;rgba.r+=0.5;rgba.r*=255;rgba.g/=255;rgba.g-=0.5;rgba.g*=adjust;rgba.g+=0.5;rgba.g*=255;rgba.b/=255;rgba.b-=0.5;rgba.b*=adjust;rgba.b+=0.5;rgba.b*=255;return rgba;});});Filter.register("hue",function(adjust){return this.process("hue",function(rgba){var h,hsv,rgb;hsv=Convert.rgbToHSV(rgba.r,rgba.g,rgba.b);h=hsv.h*100;h+=Math.abs(adjust);h=h%100;h/=100;hsv.h=h;rgb=Convert.hsvToRGB(hsv.h,hsv.s,hsv.v);rgb.a=rgba.a;return rgb;});});Filter.register("colorize",function(){var level,rgb;if(arguments.length===2){rgb=Convert.hexToRGB(arguments[0]);level=arguments[1];}else if(arguments.length===4){rgb={r:arguments[0],g:arguments[1],b:arguments[2]};level=arguments[3];} return this.process("colorize",function(rgba){rgba.r-=(rgba.r-rgb.r)*(level/100);rgba.g-=(rgba.g-rgb.g)*(level/100);rgba.b-=(rgba.b-rgb.b)*(level/100);return rgba;});});Filter.register("invert",function(){return this.process("invert",function(rgba){rgba.r=255-rgba.r;rgba.g=255-rgba.g;rgba.b=255-rgba.b;return rgba;});});Filter.register("sepia",function(adjust){if(adjust==null){adjust=100;} adjust/=100;return this.process("sepia",function(rgba){rgba.r=Math.min(255,(rgba.r*(1-(0.607*adjust)))+(rgba.g*(0.769*adjust))+(rgba.b*(0.189*adjust)));rgba.g=Math.min(255,(rgba.r*(0.349*adjust))+(rgba.g*(1-(0.314*adjust)))+(rgba.b*(0.168*adjust)));rgba.b=Math.min(255,(rgba.r*(0.272*adjust))+(rgba.g*(0.534*adjust))+(rgba.b*(1-(0.869*adjust))));return rgba;});});Filter.register("gamma",function(adjust){return this.process("gamma",function(rgba){rgba.r=Math.pow(rgba.r/255,adjust)*255;rgba.g=Math.pow(rgba.g/255,adjust)*255;rgba.b=Math.pow(rgba.b/255,adjust)*255;return rgba;});});Filter.register("noise",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("noise",function(rgba){var rand;rand=Calculate.randomRange(adjust*-1,adjust);rgba.r+=rand;rgba.g+=rand;rgba.b+=rand;return rgba;});});Filter.register("clip",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("clip",function(rgba){if(rgba.r>255-adjust){rgba.r=255;}else if(rgba.r255-adjust){rgba.g=255;}else if(rgba.g255-adjust){rgba.b=255;}else if(rgba.b0){rgba.r+=(255-rgba.r)*options.red;}else{rgba.r-=rgba.r*Math.abs(options.red);}} if(options.green!=null){if(options.green>0){rgba.g+=(255-rgba.g)*options.green;}else{rgba.g-=rgba.g*Math.abs(options.green);}} if(options.blue!=null){if(options.blue>0){rgba.b+=(255-rgba.b)*options.blue;}else{rgba.b-=rgba.b*Math.abs(options.blue);}} return rgba;});});Filter.register("curves",function(){var bezier,chans,cps,ctrl1,ctrl2,end,i,start,_i,_j,_ref,_ref1;chans=arguments[0],cps=2<=arguments.length?__slice.call(arguments,1):[];if(typeof chans==="string"){chans=chans.split("");} if(chans[0]==="v"){chans=['r','g','b'];} if(cps.length<3||cps.length>4){throw"Invalid number of arguments to curves filter";} start=cps[0];ctrl1=cps[1];ctrl2=cps.length===4?cps[2]:cps[1];end=cps[cps.length-1];bezier=Calculate.bezier(start,ctrl1,ctrl2,end,0,255);if(start[0]>0){for(i=_i=0,_ref=start[0];0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){bezier[i]=start[1];}} if(end[0]<255){for(i=_j=_ref1=end[0];_ref1<=255?_j<=255:_j>=255;i=_ref1<=255?++_j:--_j){bezier[i]=end[1];}} return this.process("curves",function(rgba){var _k,_ref2;for(i=_k=0,_ref2=chans.length;0<=_ref2?_k<_ref2:_k>_ref2;i=0<=_ref2?++_k:--_k){rgba[chans[i]]=bezier[rgba[chans[i]]];} return rgba;});});Filter.register("exposure",function(adjust){var ctrl1,ctrl2,p;p=Math.abs(adjust)/100;ctrl1=[0,255*p];ctrl2=[255-(255*p),255];if(adjust<0){ctrl1=ctrl1.reverse();ctrl2=ctrl2.reverse();} return this.curves('rgb',[0,0],ctrl1,ctrl2,[255,255]);});Caman.Plugin.register("crop",function(width,height,x,y){var canvas,ctx;if(x==null){x=0;} if(y==null){y=0;} if(typeof exports!=="undefined"&&exports!==null){canvas=new Canvas(width,height);}else{canvas=document.createElement('canvas');Util.copyAttributes(this.canvas,canvas);canvas.width=width;canvas.height=height;} ctx=canvas.getContext('2d');ctx.drawImage(this.canvas,x,y,width,height,0,0,width,height);this.cropCoordinates={x:x,y:y};this.cropped=true;return this.replaceCanvas(canvas);});Caman.Plugin.register("resize",function(newDims){var canvas,ctx;if(newDims==null){newDims=null;} if(newDims===null||((newDims.width==null)&&(newDims.height==null))){Log.error("Invalid or missing dimensions given for resize");return;} if(newDims.width==null){newDims.width=this.canvas.width*newDims.height/this.canvas.height;}else if(newDims.height==null){newDims.height=this.canvas.height*newDims.width/this.canvas.width;} if(typeof exports!=="undefined"&&exports!==null){canvas=new Canvas(newDims.width,newDims.height);}else{canvas=document.createElement('canvas');Util.copyAttributes(this.canvas,canvas);canvas.width=newDims.width;canvas.height=newDims.height;} ctx=canvas.getContext('2d');ctx.drawImage(this.canvas,0,0,this.canvas.width,this.canvas.height,0,0,newDims.width,newDims.height);this.resized=true;return this.replaceCanvas(canvas);});Caman.Filter.register("crop",function(){return this.processPlugin("crop",Array.prototype.slice.call(arguments,0));});Caman.Filter.register("resize",function(){return this.processPlugin("resize",Array.prototype.slice.call(arguments,0));});Caman.Filter.register("boxBlur",function(){return this.processKernel("Box Blur",[1,1,1,1,1,1,1,1,1]);});Caman.Filter.register("heavyRadialBlur",function(){return this.processKernel("Heavy Radial Blur",[0,0,1,0,0,0,1,1,1,0,1,1,1,1,1,0,1,1,1,0,0,0,1,0,0]);});Caman.Filter.register("gaussianBlur",function(){return this.processKernel("Gaussian Blur",[1,4,6,4,1,4,16,24,16,4,6,24,36,24,6,4,16,24,16,4,1,4,6,4,1]);});Caman.Filter.register("motionBlur",function(degrees){var kernel;if(degrees===0||degrees===180){kernel=[0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0];}else if((degrees>0&°rees<90)||(degrees>180&°rees<270)){kernel=[0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0];}else if(degrees===90||degrees===270){kernel=[0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0];}else{kernel=[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1];} return this.processKernel("Motion Blur",kernel);});Caman.Filter.register("sharpen",function(amt){if(amt==null){amt=100;} amt/=100;return this.processKernel("Sharpen",[0,-amt,0,-amt,4*amt+1,-amt,0,-amt,0]);});vignetteFilters={brightness:function(rgba,amt,opts){rgba.r=rgba.r-(rgba.r*amt*opts.strength);rgba.g=rgba.g-(rgba.g*amt*opts.strength);rgba.b=rgba.b-(rgba.b*amt*opts.strength);return rgba;},gamma:function(rgba,amt,opts){rgba.r=Math.pow(rgba.r/255,Math.max(10*amt*opts.strength,1))*255;rgba.g=Math.pow(rgba.g/255,Math.max(10*amt*opts.strength,1))*255;rgba.b=Math.pow(rgba.b/255,Math.max(10*amt*opts.strength,1))*255;return rgba;},colorize:function(rgba,amt,opts){rgba.r-=(rgba.r-opts.color.r)*amt;rgba.g-=(rgba.g-opts.color.g)*amt;rgba.b-=(rgba.b-opts.color.b)*amt;return rgba;}};Filter.register("vignette",function(size,strength){var bezier,center,end,start;if(strength==null){strength=60;} if(typeof size==="string"&&size.substr(-1)==="%"){if(this.dimensions.height>this.dimensions.width){size=this.dimensions.width*(parseInt(size.substr(0,size.length-1),10)/100);}else{size=this.dimensions.height*(parseInt(size.substr(0,size.length-1),10)/100);}} strength/=100;center=[this.dimensions.width/2,this.dimensions.height/2];start=Math.sqrt(Math.pow(center[0],2)+Math.pow(center[1],2));end=start-size;bezier=Calculate.bezier([0,1],[30,30],[70,60],[100,80]);return this.process("vignette",function(rgba){var dist,div,loc;loc=this.locationXY();dist=Calculate.distance(loc.x,loc.y,center[0],center[1]);if(dist>end){div=Math.max(1,(bezier[Math.round(((dist-end)/size)*100)]/10)*strength);rgba.r=Math.pow(rgba.r/255,div)*255;rgba.g=Math.pow(rgba.g/255,div)*255;rgba.b=Math.pow(rgba.b/255,div)*255;} return rgba;});});Filter.register("rectangularVignette",function(opts){var defaults,dim,percent,size,_i,_len,_ref;defaults={strength:50,cornerRadius:0,method:'brightness',color:{r:0,g:0,b:0}};opts=Util.extend(defaults,opts);if(!opts.size){return this;}else if(typeof opts.size==="string"){percent=parseInt(opts.size,10)/100;opts.size={width:this.dimensions.width*percent,height:this.dimensions.height*percent};}else if(typeof opts.size==="object"){_ref=["width","height"];for(_i=0,_len=_ref.length;_i<_len;_i++){dim=_ref[_i];if(typeof opts.size[dim]==="string"){opts.size[dim]=this.dimensions[dim]*(parseInt(opts.size[dim],10)/100);}}}else if(opts.size==="number"){size=opts.size;opts.size={width:size,height:size};} if(typeof opts.cornerRadius==="string"){opts.cornerRadius=(opts.size.width/2)*(parseInt(opts.cornerRadius,10)/100);} opts.strength/=100;opts.size.width=Math.floor(opts.size.width);opts.size.height=Math.floor(opts.size.height);opts.image={width:this.dimensions.width,height:this.dimensions.height};if(opts.method==="colorize"&&typeof opts.color==="string"){opts.color=Convert.hexToRGB(opts.color);} opts.coords={left:(this.dimensions.width-opts.size.width)/2,right:this.dimensions.width-opts.coords.left,bottom:(this.dimensions.height-opts.size.height)/2,top:this.dimensions.height-opts.coords.bottom};opts.corners=[{x:opts.coords.left+opts.cornerRadius,y:opts.coords.top-opts.cornerRadius},{x:opts.coords.right-opts.cornerRadius,y:opts.coords.top-opts.cornerRadius},{x:opts.coords.right-opts.cornerRadius,y:opts.coords.bottom+opts.cornerRadius},{x:opts.coords.left+opts.cornerRadius,y:opts.coords.bottom+opts.cornerRadius}];opts.maxDist=Calculate.distance(0,0,opts.corners[3].x,opts.corners[3].y)-opts.cornerRadius;return this.process("rectangularVignette",function(rgba){var amt,loc,radialDist;loc=this.locationXY();if((loc.x>opts.corners[0].x&&loc.xopts.coords.bottom&&loc.yopts.coords.left&&loc.xopts.corners[3].y&&loc.yopts.corners[0].x&&loc.xopts.coords.top){amt=(loc.y-opts.coords.top)/opts.maxDist;}else if(loc.y>opts.corners[2].y&&loc.yopts.coords.right){amt=(loc.x-opts.coords.right)/opts.maxDist;}else if(loc.x>opts.corners[0].x&&loc.xopts.corners[2].y&&loc.y=opts.corners[0].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[0].x,opts.corners[0].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;}else if(loc.x>=opts.corners[1].x&&loc.y>=opts.corners[1].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[1].x,opts.corners[1].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;}else if(loc.x>=opts.corners[2].x&&loc.y<=opts.corners[2].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[2].x,opts.corners[2].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;}else if(loc.x<=opts.corners[3].x&&loc.y<=opts.corners[3].y){radialDist=Caman.distance(loc.x,loc.y,opts.corners[3].x,opts.corners[3].y);amt=(radialDist-opts.cornerRadius)/opts.maxDist;} if(amt<0){return rgba;} return vignetteFilters[opts.method](rgba,amt,opts);});});(function(){var BlurStack,getLinearGradientMap,getRadialGradientMap,mul_table,shg_table;mul_table=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];shg_table=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];getLinearGradientMap=function(width,height,centerX,centerY,angle,length,mirrored){var cnv,context,gradient,x1,x2,y1,y2;cnv=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');cnv.width=width;cnv.height=height;x1=centerX+Math.cos(angle)*length*0.5;y1=centerY+Math.sin(angle)*length*0.5;x2=centerX-Math.cos(angle)*length*0.5;y2=centerY-Math.sin(angle)*length*0.5;context=cnv.getContext("2d");gradient=context.createLinearGradient(x1,y1,x2,y2);if(!mirrored){gradient.addColorStop(0,"white");gradient.addColorStop(1,"black");}else{gradient.addColorStop(0,"white");gradient.addColorStop(0.5,"black");gradient.addColorStop(1,"white");} context.fillStyle=gradient;context.fillRect(0,0,width,height);return context.getImageData(0,0,width,height);};getRadialGradientMap=function(width,height,centerX,centerY,radius1,radius2){var cnv,context,gradient;cnv=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');cnv.width=width;cnv.height=height;context=cnv.getContext("2d");gradient=context.createRadialGradient(centerX,centerY,radius1,centerX,centerY,radius2);gradient.addColorStop(1,"white");gradient.addColorStop(0,"black");context.fillStyle=gradient;context.fillRect(0,0,width,height);return context.getImageData(0,0,width,height);};BlurStack=function(){this.r=0;this.g=0;this.b=0;this.a=0;return this.next=null;};Caman.Plugin.register("compoundBlur",function(radiusData,radius,increaseFactor,blurLevels){var b_in_sum,b_out_sum,b_sum,blend,currentIndex,div,g_in_sum,g_out_sum,g_sum,height,heightMinus1,i,iblend,idx,imagePixels,index,iradius,lookupValue,mul_sum,p,pb,pg,pixels,pr,r_in_sum,r_out_sum,r_sum,radiusPixels,radiusPlus1,rbs,shg_sum,stack,stackEnd,stackIn,stackOut,stackStart,steps,sumFactor,w4,wh,wh4,width,widthMinus1,x,y,yi,yp,yw,_i,_j,_k,_l,_m,_n,_o,_p,_q,_r;width=this.dimensions.width;height=this.dimensions.height;imagePixels=this.pixelData;radiusPixels=radiusData.data;wh=width*height;wh4=wh<<2;pixels=[];for(i=_i=0;0<=wh4?_iwh4;i=0<=wh4?++_i:--_i){pixels[i]=imagePixels[i];} currentIndex=0;steps=blurLevels;blurLevels-=1;while(steps-->=0){iradius=(radius+0.5)|0;if(iradius===0){continue;} if(iradius>256){iradius=256;} div=iradius+iradius+1;w4=width<<2;widthMinus1=width-1;heightMinus1=height-1;radiusPlus1=iradius+1;sumFactor=radiusPlus1*(radiusPlus1+1)/2;stackStart=new BlurStack();stackEnd=void 0;stack=stackStart;for(i=_j=1;1<=div?_jdiv;i=1<=div?++_j:--_j){stack=stack.next=new BlurStack();if(i===radiusPlus1){stackEnd=stack;}} stack.next=stackStart;stackIn=null;stackOut=null;yw=yi=0;mul_sum=mul_table[iradius];shg_sum=shg_table[iradius];for(y=_k=0;0<=height?_kheight;y=0<=height?++_k:--_k){r_in_sum=g_in_sum=b_in_sum=r_sum=g_sum=b_sum=0;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_l=0;0<=radiusPlus1?_lradiusPlus1;i=0<=radiusPlus1?++_l:--_l){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} for(i=_m=1;1<=radiusPlus1?_mradiusPlus1;i=1<=radiusPlus1?++_m:--_m){p=yi+((widthMinus1width;x=0<=width?++_n:--_n){pixels[yi]=(r_sum*mul_sum)>>shg_sum;pixels[yi+1]=(g_sum*mul_sum)>>shg_sum;pixels[yi+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(yw+((p=x+radiusPlus1)width;x=0<=width?++_o:--_o){g_in_sum=b_in_sum=r_in_sum=g_sum=b_sum=r_sum=0;yi=x<<2;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_p=0;0<=radiusPlus1?_pradiusPlus1;i=0<=radiusPlus1?++_p:--_p){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} yp=width;for(i=_q=1;1<=radiusPlus1?_qradiusPlus1;i=1<=radiusPlus1?++_q:--_q){yi=(yp+x)<<2;r_sum+=(stack.r=(pr=pixels[yi]))*(rbs=radiusPlus1-i);g_sum+=(stack.g=(pg=pixels[yi+1]))*rbs;b_sum+=(stack.b=(pb=pixels[yi+2]))*rbs;r_in_sum+=pr;g_in_sum+=pg;b_in_sum+=pb;stack=stack.next;if(iheight;y=0<=height?++_r:--_r){p=yi<<2;pixels[p]=(r_sum*mul_sum)>>shg_sum;pixels[p+1]=(g_sum*mul_sum)>>shg_sum;pixels[p+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(x+(((p=y+radiusPlus1)-1){idx=i<<2;lookupValue=(radiusPixels[idx+2]&0xff)/255.0*blurLevels;index=lookupValue|0;if(index===currentIndex){blend=256.0*(lookupValue-(lookupValue|0));iblend=256-blend;imagePixels[idx]=(imagePixels[idx]*iblend+pixels[idx]*blend)>>8;imagePixels[idx+1]=(imagePixels[idx+1]*iblend+pixels[idx+1]*blend)>>8;imagePixels[idx+2]=(imagePixels[idx+2]*iblend+pixels[idx+2]*blend)>>8;}else if(index===currentIndex+1){imagePixels[idx]=pixels[idx];imagePixels[idx+1]=pixels[idx+1];imagePixels[idx+2]=pixels[idx+2];}} currentIndex++;} return this;});Caman.Filter.register("tiltShift",function(opts){var defaults,gradient;defaults={center:{x:this.dimensions.width/2,y:this.dimensions.height/2},angle:45,focusWidth:200,startRadius:3,radiusFactor:1.5,steps:3};opts=Util.extend(defaults,opts);opts.angle*=Math.PI/180;gradient=getLinearGradientMap(this.dimensions.width,this.dimensions.height,opts.center.x,opts.center.y,opts.angle,opts.focusWidth,true);return this.processPlugin("compoundBlur",[gradient,opts.startRadius,opts.radiusFactor,opts.steps]);});return Caman.Filter.register("radialBlur",function(opts){var defaults,gradient,radius1,radius2;defaults={size:50,center:{x:this.dimensions.width/2,y:this.dimensions.height/2},startRadius:3,radiusFactor:1.5,steps:3,radius:null};opts=Util.extend(defaults,opts);if(!opts.radius){opts.radius=this.dimensions.widthdiv;i=1<=div?++_i:--_i){stack=stack.next=new BlurStack();if(i===radiusPlus1){stackEnd=stack;}} stack.next=stackStart;stackIn=null;stackOut=null;yw=yi=0;mul_sum=mul_table[radius];shg_sum=shg_table[radius];for(y=_j=0;0<=height?_jheight;y=0<=height?++_j:--_j){r_in_sum=g_in_sum=b_in_sum=r_sum=g_sum=b_sum=0;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_k=0;0<=radiusPlus1?_kradiusPlus1;i=0<=radiusPlus1?++_k:--_k){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} for(i=_l=1;1<=radiusPlus1?_lradiusPlus1;i=1<=radiusPlus1?++_l:--_l){p=yi+((widthMinus1width;x=0<=width?++_m:--_m){pixels[yi]=(r_sum*mul_sum)>>shg_sum;pixels[yi+1]=(g_sum*mul_sum)>>shg_sum;pixels[yi+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(yw+((p=x+radius+1)width;x=0<=width?++_n:--_n){g_in_sum=b_in_sum=r_in_sum=g_sum=b_sum=r_sum=0;yi=x<<2;r_out_sum=radiusPlus1*(pr=pixels[yi]);g_out_sum=radiusPlus1*(pg=pixels[yi+1]);b_out_sum=radiusPlus1*(pb=pixels[yi+2]);r_sum+=sumFactor*pr;g_sum+=sumFactor*pg;b_sum+=sumFactor*pb;stack=stackStart;for(i=_o=0;0<=radiusPlus1?_oradiusPlus1;i=0<=radiusPlus1?++_o:--_o){stack.r=pr;stack.g=pg;stack.b=pb;stack=stack.next;} yp=width;for(i=_p=1;1<=radius?_p<=radius:_p>=radius;i=1<=radius?++_p:--_p){yi=(yp+x)<<2;r_sum+=(stack.r=(pr=pixels[yi]))*(rbs=radiusPlus1-i);g_sum+=(stack.g=(pg=pixels[yi+1]))*rbs;b_sum+=(stack.b=(pb=pixels[yi+2]))*rbs;r_in_sum+=pr;g_in_sum+=pg;b_in_sum+=pb;stack=stack.next;if(iheight;y=0<=height?++_q:--_q){p=yi<<2;pixels[p]=(r_sum*mul_sum)>>shg_sum;pixels[p+1]=(g_sum*mul_sum)>>shg_sum;pixels[p+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(x+(((p=y+radiusPlus1)255){return 255;} return val;};Util.copyAttributes=function(from,to,opts){var attr,_i,_len,_ref,_ref1,_results;if(opts==null){opts={};} _ref=from.attributes;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){attr=_ref[_i];if((opts.except!=null)&&(_ref1=attr.nodeName,__indexOf.call(opts.except,_ref1)>=0)){continue;} _results.push(to.setAttribute(attr.nodeName,attr.nodeValue));} return _results;};Util.dataArray=function(length){if(length==null){length=0;} if(Caman.NodeJS||(window.Uint8Array!=null)){return new Uint8Array(length);} return new Array(length);};return Util;})();if(typeof exports!=="undefined"&&exports!==null){Root=exports;Canvas=require('canvas');Image=Canvas.Image;Fiber=require('fibers');fs=require('fs');}else{Root=window;} Root.Caman=Caman=(function(){Caman.version={release:"4.1.1",date:"4/8/2013"};Caman.DEBUG=false;Caman.NodeJS=typeof exports!=="undefined"&&exports!==null;Caman.autoload=!Caman.NodeJS;Caman.allowRevert=true;Caman.crossOrigin="anonymous";Caman.toString=function(){return"Version "+Caman.version.release+", Released "+Caman.version.date;};Caman.remoteProxy="";Caman.proxyParam="camanProxyUrl";Caman.getAttrId=function(canvas){if(Caman.NodeJS){return true;} if(typeof canvas==="string"){canvas=$(canvas);} if(!((canvas!=null)&&(canvas.getAttribute!=null))){return null;} return canvas.getAttribute('data-caman-id');};function Caman(){var args,callback,id,_this=this;if(arguments.length===0){throw"Invalid arguments";} if(this instanceof Caman){this.finishInit=this.finishInit.bind(this);this.imageLoaded=this.imageLoaded.bind(this);args=arguments[0];if(!Caman.NodeJS){id=parseInt(Caman.getAttrId(args[0]),10);callback=typeof args[1]==="function"?args[1]:typeof args[2]==="function"?args[2]:function(){};if(!isNaN(id)&&Store.has(id)){return Store.execute(id,callback);}} this.id=Util.uniqid.get();this.initializedPixelData=this.originalPixelData=null;this.cropCoordinates={x:0,y:0};this.cropped=false;this.resized=false;this.pixelStack=[];this.layerStack=[];this.canvasQueue=[];this.currentLayer=null;this.scaled=false;this.analyze=new Analyze(this);this.renderer=new Renderer(this);this.domIsLoaded(function(){_this.parseArguments(args);return _this.setup();});return this;}else{return new Caman(arguments);}} Caman.prototype.domIsLoaded=function(cb){var listener,_this=this;if(Caman.NodeJS){return setTimeout(function(){return cb.call(_this);},0);}else{if(document.readyState==="complete"){Log.debug("DOM initialized");return setTimeout(function(){return cb.call(_this);},0);}else{listener=function(){if(document.readyState==="complete"){Log.debug("DOM initialized");return cb.call(_this);}};return document.addEventListener("readystatechange",listener,false);}}};Caman.prototype.parseArguments=function(args){var key,val,_ref,_results;if(args.length===0){throw"Invalid arguments given";} this.initObj=null;this.initType=null;this.imageUrl=null;this.callback=function(){};this.setInitObject(args[0]);if(args.length===1){return;} switch(typeof args[1]){case"string":this.imageUrl=args[1];break;case"function":this.callback=args[1];} if(args.length===2){return;} this.callback=args[2];if(args.length===4){_ref=args[4];_results=[];for(key in _ref){if(!__hasProp.call(_ref,key))continue;val=_ref[key];_results.push(this.options[key]=val);} return _results;}};Caman.prototype.setInitObject=function(obj){if(Caman.NodeJS){this.initObj=obj;this.initType='node';return;} if(typeof obj==="object"){this.initObj=obj;}else{this.initObj=$(obj);} if(this.initObj==null){throw"Could not find image or canvas for initialization.";} return this.initType=this.initObj.nodeName.toLowerCase();};Caman.prototype.setup=function(){switch(this.initType){case"node":return this.initNode();case"img":return this.initImage();case"canvas":return this.initCanvas();}};Caman.prototype.initNode=function(){var _this=this;Log.debug("Initializing for NodeJS");this.image=new Image();this.image.onload=function(){Log.debug("Image loaded. Width = "+(_this.imageWidth())+", Height = "+(_this.imageHeight()));_this.canvas=new Canvas(_this.imageWidth(),_this.imageHeight());return _this.finishInit();};this.image.onerror=function(err){throw err;};return this.image.src=this.initObj;};Caman.prototype.initImage=function(){this.image=this.initObj;this.canvas=document.createElement('canvas');this.context=this.canvas.getContext('2d');Util.copyAttributes(this.image,this.canvas,{except:['src']});this.image.parentNode.replaceChild(this.canvas,this.image);this.imageAdjustments();return this.waitForImageLoaded();};Caman.prototype.initCanvas=function(){this.canvas=this.initObj;this.context=this.canvas.getContext('2d');if(this.imageUrl!=null){this.image=document.createElement('img');this.image.src=this.imageUrl;this.imageAdjustments();return this.waitForImageLoaded();}else{return this.finishInit();}};Caman.prototype.imageAdjustments=function(){if(this.needsHiDPISwap()){Log.debug(this.image.src,"->",this.hiDPIReplacement());this.swapped=true;this.image.src=this.hiDPIReplacement();} if(IO.isRemote(this.image)){this.image.src=IO.proxyUrl(this.image.src);return Log.debug("Remote image detected, using URL = "+this.image.src);}};Caman.prototype.waitForImageLoaded=function(){if(this.isImageLoaded()){return this.imageLoaded();}else{return this.image.onload=this.imageLoaded;}};Caman.prototype.isImageLoaded=function(){if(!this.image.complete){return false;} if((this.image.naturalWidth!=null)&&this.image.naturalWidth===0){return false;} return true;};Caman.prototype.imageWidth=function(){return this.image.width||this.image.naturalWidth;};Caman.prototype.imageHeight=function(){return this.image.height||this.image.naturalHeight;};Caman.prototype.imageLoaded=function(){Log.debug("Image loaded. Width = "+(this.imageWidth())+", Height = "+(this.imageHeight()));if(this.swapped){this.canvas.width=this.imageWidth()/this.hiDPIRatio();this.canvas.height=this.imageHeight()/this.hiDPIRatio();}else{this.canvas.width=this.imageWidth();this.canvas.height=this.imageHeight();} return this.finishInit();};Caman.prototype.finishInit=function(){var i,pixel,_i,_len,_ref;if(this.context==null){this.context=this.canvas.getContext('2d');} this.originalWidth=this.preScaledWidth=this.width=this.canvas.width;this.originalHeight=this.preScaledHeight=this.height=this.canvas.height;this.hiDPIAdjustments();if(!this.hasId()){this.assignId();} if(this.image!=null){this.context.drawImage(this.image,0,0,this.imageWidth(),this.imageHeight(),0,0,this.preScaledWidth,this.preScaledHeight);} this.reloadCanvasData();if(Caman.allowRevert){this.initializedPixelData=Util.dataArray(this.pixelData.length);this.originalPixelData=Util.dataArray(this.pixelData.length);_ref=this.pixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];this.initializedPixelData[i]=pixel;this.originalPixelData[i]=pixel;}} this.dimensions={width:this.canvas.width,height:this.canvas.height};Store.put(this.id,this);this.callback.call(this,this);return this.callback=function(){};};Caman.prototype.reloadCanvasData=function(){this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);return this.pixelData=this.imageData.data;};Caman.prototype.resetOriginalPixelData=function(){var pixel,_i,_len,_ref,_results;if(!Caman.allowRevert){throw"Revert disabled";} this.originalPixelData=Util.dataArray(this.pixelData.length);_ref=this.pixelData;_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){pixel=_ref[_i];_results.push(this.originalPixelData.push(pixel));} return _results;};Caman.prototype.hasId=function(){return Caman.getAttrId(this.canvas)!=null;};Caman.prototype.assignId=function(){if(Caman.NodeJS||this.canvas.getAttribute('data-caman-id')){return;} return this.canvas.setAttribute('data-caman-id',this.id);};Caman.prototype.hiDPIDisabled=function(){return this.canvas.getAttribute('data-caman-hidpi-disabled')!==null;};Caman.prototype.hiDPIAdjustments=function(){var ratio;if(Caman.NodeJS||this.hiDPIDisabled()){return;} ratio=this.hiDPIRatio();if(ratio!==1){Log.debug("HiDPI ratio = "+ratio);this.scaled=true;this.preScaledWidth=this.canvas.width;this.preScaledHeight=this.canvas.height;this.canvas.width=this.preScaledWidth*ratio;this.canvas.height=this.preScaledHeight*ratio;this.canvas.style.width=""+this.preScaledWidth+"px";this.canvas.style.height=""+this.preScaledHeight+"px";this.context.scale(ratio,ratio);this.width=this.originalWidth=this.canvas.width;return this.height=this.originalHeight=this.canvas.height;}};Caman.prototype.hiDPIRatio=function(){var backingStoreRatio,devicePixelRatio;devicePixelRatio=window.devicePixelRatio||1;backingStoreRatio=this.context.webkitBackingStorePixelRatio||this.context.mozBackingStorePixelRatio||this.context.msBackingStorePixelRatio||this.context.oBackingStorePixelRatio||this.context.backingStorePixelRatio||1;return devicePixelRatio/backingStoreRatio;};Caman.prototype.hiDPICapable=function(){return(window.devicePixelRatio!=null)&&window.devicePixelRatio!==1;};Caman.prototype.needsHiDPISwap=function(){if(this.hiDPIDisabled()||!this.hiDPICapable()){return false;} return this.hiDPIReplacement()!==null;};Caman.prototype.hiDPIReplacement=function(){if(this.image==null){return null;} return this.image.getAttribute('data-caman-hidpi');};Caman.prototype.replaceCanvas=function(newCanvas){var oldCanvas;oldCanvas=this.canvas;this.canvas=newCanvas;this.context=this.canvas.getContext('2d');oldCanvas.parentNode.replaceChild(this.canvas,oldCanvas);this.width=this.canvas.width;this.height=this.canvas.height;this.reloadCanvasData();return this.dimensions={width:this.canvas.width,height:this.canvas.height};};Caman.prototype.render=function(callback){var _this=this;if(callback==null){callback=function(){};} Event.trigger(this,"renderStart");return this.renderer.execute(function(){_this.context.putImageData(_this.imageData,0,0);return callback.call(_this);});};Caman.prototype.revert=function(){var i,pixel,_i,_len,_ref;if(!Caman.allowRevert){throw"Revert disabled";} _ref=this.originalVisiblePixels();for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];this.pixelData[i]=pixel;} return this.context.putImageData(this.imageData,0,0);};Caman.prototype.reset=function(){var canvas,ctx,i,imageData,pixel,pixelData,_i,_len,_ref;canvas=document.createElement('canvas');Util.copyAttributes(this.canvas,canvas);canvas.width=this.originalWidth;canvas.height=this.originalHeight;ctx=canvas.getContext('2d');imageData=ctx.getImageData(0,0,canvas.width,canvas.height);pixelData=imageData.data;_ref=this.initializedPixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];pixelData[i]=pixel;} ctx.putImageData(imageData,0,0);this.cropCoordinates={x:0,y:0};this.resized=false;return this.replaceCanvas(canvas);};Caman.prototype.originalVisiblePixels=function(){var canvas,coord,ctx,endX,endY,i,imageData,pixel,pixelData,pixels,scaledCanvas,startX,startY,width,_i,_j,_len,_ref,_ref1,_ref2,_ref3;if(!Caman.allowRevert){throw"Revert disabled";} pixels=[];startX=this.cropCoordinates.x;endX=startX+this.width;startY=this.cropCoordinates.y;endY=startY+this.height;if(this.resized){canvas=document.createElement('canvas');canvas.width=this.originalWidth;canvas.height=this.originalHeight;ctx=canvas.getContext('2d');imageData=ctx.getImageData(0,0,canvas.width,canvas.height);pixelData=imageData.data;_ref=this.originalPixelData;for(i=_i=0,_len=_ref.length;_i<_len;i=++_i){pixel=_ref[i];pixelData[i]=pixel;} ctx.putImageData(imageData,0,0);scaledCanvas=document.createElement('canvas');scaledCanvas.width=this.width;scaledCanvas.height=this.height;ctx=scaledCanvas.getContext('2d');ctx.drawImage(canvas,0,0,this.originalWidth,this.originalHeight,0,0,this.width,this.height);pixelData=ctx.getImageData(0,0,this.width,this.height).data;width=this.width;}else{pixelData=this.originalPixelData;width=this.originalWidth;} for(i=_j=0,_ref1=pixelData.length;_j<_ref1;i=_j+=4){coord=PixelInfo.locationToCoordinates(i,width);if(((startX<=(_ref2=coord.x)&&_ref2_ref;i=0<=_ref?++_i:--_i){divisor+=adjust[i];}} this.renderer.add({type:Filter.Type.Kernel,name:name,adjust:adjust,divisor:divisor,bias:bias||0});return this;};Caman.prototype.processPlugin=function(plugin,args){this.renderer.add({type:Filter.Type.Plugin,plugin:plugin,args:args});return this;};Caman.prototype.newLayer=function(callback){var layer;layer=new Layer(this);this.canvasQueue.push(layer);this.renderer.add({type:Filter.Type.LayerDequeue});callback.call(layer);this.renderer.add({type:Filter.Type.LayerFinished});return this;};Caman.prototype.executeLayer=function(layer){return this.pushContext(layer);};Caman.prototype.pushContext=function(layer){this.layerStack.push(this.currentLayer);this.pixelStack.push(this.pixelData);this.currentLayer=layer;return this.pixelData=layer.pixelData;};Caman.prototype.popContext=function(){this.pixelData=this.pixelStack.pop();return this.currentLayer=this.layerStack.pop();};Caman.prototype.applyCurrentLayer=function(){return this.currentLayer.applyToParent();};return Caman;})();Analyze=(function(){function Analyze(c){this.c=c;} Analyze.prototype.calculateLevels=function(){var i,levels,numPixels,_i,_j,_k,_ref;levels={r:{},g:{},b:{}};for(i=_i=0;_i<=255;i=++_i){levels.r[i]=0;levels.g[i]=0;levels.b[i]=0;} for(i=_j=0,_ref=this.c.pixelData.length;_j<_ref;i=_j+=4){levels.r[this.c.pixelData[i]]++;levels.g[this.c.pixelData[i+1]]++;levels.b[this.c.pixelData[i+2]]++;} numPixels=this.c.pixelData.length/4;for(i=_k=0;_k<=255;i=++_k){levels.r[i]/=numPixels;levels.g[i]/=numPixels;levels.b[i]/=numPixels;} return levels;};return Analyze;})();Caman.DOMUpdated=function(){var img,imgs,parser,_i,_len,_results;imgs=document.querySelectorAll("img[data-caman]");if(!(imgs.length>0)){return;} _results=[];for(_i=0,_len=imgs.length;_i<_len;_i++){img=imgs[_i];_results.push(parser=new CamanParser(img,function(){this.parse();return this.execute();}));} return _results;};if(Caman.autoload){(function(){if(document.readyState==="complete"){return Caman.DOMUpdated();}else{return document.addEventListener("DOMContentLoaded",Caman.DOMUpdated,false);}})();} CamanParser=(function(){var INST_REGEX;INST_REGEX="(\\w+)\\((.*?)\\)";function CamanParser(ele,ready){this.dataStr=ele.getAttribute('data-caman');this.caman=Caman(ele,ready.bind(this));} CamanParser.prototype.parse=function(){var args,filter,func,inst,instFunc,m,r,unparsedInstructions,_i,_len,_ref,_results;this.ele=this.caman.canvas;r=new RegExp(INST_REGEX,'g');unparsedInstructions=this.dataStr.match(r);if(!(unparsedInstructions.length>0)){return;} r=new RegExp(INST_REGEX);_results=[];for(_i=0,_len=unparsedInstructions.length;_i<_len;_i++){inst=unparsedInstructions[_i];_ref=inst.match(r),m=_ref[0],filter=_ref[1],args=_ref[2];instFunc=new Function("return function() { this."+filter+"("+args+"); };");try{func=instFunc();_results.push(func.call(this.caman));}catch(e){_results.push(Log.debug(e));}} return _results;};CamanParser.prototype.execute=function(){var ele;ele=this.ele;return this.caman.render(function(){return ele.parentNode.replaceChild(this.toImage(),ele);});};return CamanParser;})();Caman.Blender=Blender=(function(){function Blender(){} Blender.blenders={};Blender.register=function(name,func){return this.blenders[name]=func;};Blender.execute=function(name,rgbaLayer,rgbaParent){return this.blenders[name](rgbaLayer,rgbaParent);};return Blender;})();Caman.Calculate=Calculate=(function(){function Calculate(){} Calculate.distance=function(x1,y1,x2,y2){return Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));};Calculate.randomRange=function(min,max,getFloat){var rand;if(getFloat==null){getFloat=false;} rand=min+(Math.random()*(max-min));if(getFloat){return rand.toFixed(getFloat);}else{return Math.round(rand);}};Calculate.luminance=function(rgba){return(0.299*rgba.r)+(0.587*rgba.g)+(0.114*rgba.b);};Calculate.bezier=function(start,ctrl1,ctrl2,end,lowBound,highBound){var Ax,Ay,Bx,By,Cx,Cy,bezier,curveX,curveY,i,j,leftCoord,rightCoord,t,x0,x1,x2,x3,y0,y1,y2,y3,_i,_j,_k,_ref,_ref1;x0=start[0];y0=start[1];x1=ctrl1[0];y1=ctrl1[1];x2=ctrl2[0];y2=ctrl2[1];x3=end[0];y3=end[1];bezier={};Cx=parseInt(3*(x1-x0),10);Bx=3*(x2-x1)-Cx;Ax=x3-x0-Cx-Bx;Cy=3*(y1-y0);By=3*(y2-y1)-Cy;Ay=y3-y0-Cy-By;for(i=_i=0;_i<1000;i=++_i){t=i/1000;curveX=Math.round((Ax*Math.pow(t,3))+(Bx*Math.pow(t,2))+(Cx*t)+x0);curveY=Math.round((Ay*Math.pow(t,3))+(By*Math.pow(t,2))+(Cy*t)+y0);if(lowBound&&curveYhighBound){curveY=highBound;} bezier[curveX]=curveY;} if(bezier.length=_ref;i=0<=_ref?++_j:--_j){if(bezier[i]==null){leftCoord=[i-1,bezier[i-1]];for(j=_k=i,_ref1=end[0];i<=_ref1?_k<=_ref1:_k>=_ref1;j=i<=_ref1?++_k:--_k){if(bezier[j]!=null){rightCoord=[j,bezier[j]];break;}} bezier[i]=leftCoord[1]+((rightCoord[1]-leftCoord[1])/(rightCoord[0]-leftCoord[0]))*(i-leftCoord[0]);}}} if(bezier[end[0]]==null){bezier[end[0]]=bezier[end[0]-1];} return bezier;};return Calculate;})();Convert=(function(){function Convert(){} Convert.hexToRGB=function(hex){var b,g,r;if(hex.charAt(0)==="#"){hex=hex.substr(1);} r=parseInt(hex.substr(0,2),16);g=parseInt(hex.substr(2,2),16);b=parseInt(hex.substr(4,2),16);return{r:r,g:g,b:b};};Convert.rgbToHSL=function(r,g,b){var d,h,l,max,min,s;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);l=(max+min)/2;if(max===min){h=s=0;}else{d=max-min;s=l>0.5?d/(2-max-min):d/(max+min);h=(function(){switch(max){case r:return(g-b)/d+(g1){t-=1;} if(t<1/6){return p+(q-p)*6*t;} if(t<1/2){return q;} if(t<2/3){return p+(q-p)*(2/3-t)*6;} return p;};Convert.rgbToHSV=function(r,g,b){var d,h,max,min,s,v;r/=255;g/=255;b/=255;max=Math.max(r,g,b);min=Math.min(r,g,b);v=max;d=max-min;s=max===0?0:d/max;if(max===min){h=0;}else{h=(function(){switch(max){case r:return(g-b)/d+(g0.04045){r=Math.pow((r+0.055)/1.055,2.4);}else{r/=12.92;} if(g>0.04045){g=Math.pow((g+0.055)/1.055,2.4);}else{g/=12.92;} if(b>0.04045){b=Math.pow((b+0.055)/1.055,2.4);}else{b/=12.92;} x=r*0.4124+g*0.3576+b*0.1805;y=r*0.2126+g*0.7152+b*0.0722;z=r*0.0193+g*0.1192+b*0.9505;return{x:x*100,y:y*100,z:z*100};};Convert.xyzToRGB=function(x,y,z){var b,g,r;x/=100;y/=100;z/=100;r=(3.2406*x)+(-1.5372*y)+(-0.4986*z);g=(-0.9689*x)+(1.8758*y)+(0.0415*z);b=(0.0557*x)+(-0.2040*y)+(1.0570*z);if(r>0.0031308){r=(1.055*Math.pow(r,0.4166666667))-0.055;}else{r*=12.92;} if(g>0.0031308){g=(1.055*Math.pow(g,0.4166666667))-0.055;}else{g*=12.92;} if(b>0.0031308){b=(1.055*Math.pow(b,0.4166666667))-0.055;}else{b*=12.92;} return{r:r*255,g:g*255,b:b*255};};Convert.xyzToLab=function(x,y,z){var a,b,l,whiteX,whiteY,whiteZ;if(typeof x==="object"){y=x.y;z=x.z;x=x.x;} whiteX=95.047;whiteY=100.0;whiteZ=108.883;x/=whiteX;y/=whiteY;z/=whiteZ;if(x>0.008856451679){x=Math.pow(x,0.3333333333);}else{x=(7.787037037*x)+0.1379310345;} if(y>0.008856451679){y=Math.pow(y,0.3333333333);}else{y=(7.787037037*y)+0.1379310345;} if(z>0.008856451679){z=Math.pow(z,0.3333333333);}else{z=(7.787037037*z)+0.1379310345;} l=116*y-16;a=500*(x-y);b=200*(y-z);return{l:l,a:a,b:b};};Convert.labToXYZ=function(l,a,b){var x,y,z;if(typeof l==="object"){a=l.a;b=l.b;l=l.l;} y=(l+16)/116;x=y+(a/500);z=y-(b/200);if(x>0.2068965517){x=x*x*x;}else{x=0.1284185493*(x-0.1379310345);} if(y>0.2068965517){y=y*y*y;}else{y=0.1284185493*(y-0.1379310345);} if(z>0.2068965517){z=z*z*z;}else{z=0.1284185493*(z-0.1379310345);} return{x:x*95.047,y:y*100.0,z:z*108.883};};Convert.rgbToLab=function(r,g,b){var xyz;if(typeof r==="object"){g=r.g;b=r.b;r=r.r;} xyz=this.rgbToXYZ(r,g,b);return this.xyzToLab(xyz);};Convert.labToRGB=function(l,a,b){};return Convert;})();Event=(function(){function Event(){} Event.events={};Event.types=["processStart","processComplete","renderStart","renderFinished","blockStarted","blockFinished"];Event.trigger=function(target,type,data){var event,_i,_len,_ref,_results;if(this.events[type]&&this.events[type].length){_ref=this.events[type];_results=[];for(_i=0,_len=_ref.length;_i<_len;_i++){event=_ref[_i];if(event.target===null||target.id===event.target.id){_results.push(event.fn.call(target,data));}else{_results.push(void 0);}} return _results;}};Event.listen=function(target,type,fn){var _fn,_type;if(typeof target==="string"){_type=target;_fn=type;target=null;type=_type;fn=_fn;} if(__indexOf.call(this.types,type)<0){return false;} if(!this.events[type]){this.events[type]=[];} this.events[type].push({target:target,fn:fn});return true;};return Event;})();Caman.Event=Event;Caman.Filter=Filter=(function(){function Filter(){} Filter.Type={Single:1,Kernel:2,LayerDequeue:3,LayerFinished:4,LoadOverlay:5,Plugin:6};Filter.register=function(name,filterFunc){return Caman.prototype[name]=filterFunc;};return Filter;})();Caman.IO=IO=(function(){function IO(){} IO.domainRegex=/(?:(?:http|https):\/\/)((?:\w+)\.(?:(?:\w|\.)+))/;IO.isRemote=function(img){if(img==null){return false;} if(this.corsEnabled(img)){return false;} return this.isURLRemote(img.src);};IO.corsEnabled=function(img){var _ref;return(img.crossOrigin!=null)&&((_ref=img.crossOrigin.toLowerCase())==='anonymous'||_ref==='use-credentials');};IO.isURLRemote=function(url){var matches;matches=url.match(this.domainRegex);if(matches){return matches[1]!==document.domain;}else{return false;}};IO.remoteCheck=function(src){if(this.isURLRemote(src)){if(!Caman.remoteProxy.length){Log.info("Attempting to load a remote image without a configured proxy. URL: "+src);}else{if(Caman.isURLRemote(Caman.remoteProxy)){Log.info("Cannot use a remote proxy for loading images.");return;} return""+Caman.remoteProxy+"?camanProxyUrl="+(encodeURIComponent(src));}}};IO.proxyUrl=function(src){return""+Caman.remoteProxy+"?"+Caman.proxyParam+"="+(encodeURIComponent(src));};IO.useProxy=function(lang){var langToExt;langToExt={ruby:'rb',python:'py',perl:'pl',javascript:'js'};lang=lang.toLowerCase();if(langToExt[lang]!=null){lang=langToExt[lang];} return"proxies/caman_proxy."+lang;};return IO;})();Caman.prototype.save=function(){if(typeof exports!=="undefined"&&exports!==null){return this.nodeSave.apply(this,arguments);}else{return this.browserSave.apply(this,arguments);}};Caman.prototype.browserSave=function(type){var image;if(type==null){type="png";} type=type.toLowerCase();image=this.toBase64(type).replace("image/"+type,"image/octet-stream");return document.location.href=image;};Caman.prototype.nodeSave=function(file,overwrite){var stats;if(overwrite==null){overwrite=true;} try{stats=fs.statSync(file);if(stats.isFile()&&!overwrite){return false;}}catch(e){Log.debug("Creating output file "+file);} return fs.writeFile(file,this.canvas.toBuffer(),function(){return Log.debug("Finished writing to "+file);});};Caman.prototype.toImage=function(type){var img;img=document.createElement('img');img.src=this.toBase64(type);img.width=this.dimensions.width;img.height=this.dimensions.height;if(window.devicePixelRatio){img.width/=window.devicePixelRatio;img.height/=window.devicePixelRatio;} return img;};Caman.prototype.toBase64=function(type){if(type==null){type="png";} type=type.toLowerCase();return this.canvas.toDataURL("image/"+type);};Layer=(function(){function Layer(c){this.c=c;this.filter=this.c;this.options={blendingMode:'normal',opacity:1.0};this.layerID=Util.uniqid.get();this.canvas=typeof exports!=="undefined"&&exports!==null?new Canvas():document.createElement('canvas');this.canvas.width=this.c.dimensions.width;this.canvas.height=this.c.dimensions.height;this.context=this.canvas.getContext('2d');this.context.createImageData(this.canvas.width,this.canvas.height);this.imageData=this.context.getImageData(0,0,this.canvas.width,this.canvas.height);this.pixelData=this.imageData.data;} Layer.prototype.newLayer=function(cb){return this.c.newLayer.call(this.c,cb);};Layer.prototype.setBlendingMode=function(mode){this.options.blendingMode=mode;return this;};Layer.prototype.opacity=function(opacity){this.options.opacity=opacity/100;return this;};Layer.prototype.copyParent=function(){var i,parentData,_i,_ref;parentData=this.c.pixelData;for(i=_i=0,_ref=this.c.pixelData.length;_i<_ref;i=_i+=4){this.pixelData[i]=parentData[i];this.pixelData[i+1]=parentData[i+1];this.pixelData[i+2]=parentData[i+2];this.pixelData[i+3]=parentData[i+3];} return this;};Layer.prototype.fillColor=function(){return this.c.fillColor.apply(this.c,arguments);};Layer.prototype.overlayImage=function(image){if(typeof image==="object"){image=image.src;}else if(typeof image==="string"&&image[0]==="#"){image=$(image).src;} if(!image){return this;} this.c.renderer.renderQueue.push({type:Filter.Type.LoadOverlay,src:image,layer:this});return this;};Layer.prototype.applyToParent=function(){var i,layerData,parentData,result,rgbaLayer,rgbaParent,_i,_ref,_results;parentData=this.c.pixelStack[this.c.pixelStack.length-1];layerData=this.c.pixelData;_results=[];for(i=_i=0,_ref=layerData.length;_i<_ref;i=_i+=4){rgbaParent={r:parentData[i],g:parentData[i+1],b:parentData[i+2],a:parentData[i+3]};rgbaLayer={r:layerData[i],g:layerData[i+1],b:layerData[i+2],a:layerData[i+3]};result=Blender.execute(this.options.blendingMode,rgbaLayer,rgbaParent);result.r=Util.clampRGB(result.r);result.g=Util.clampRGB(result.g);result.b=Util.clampRGB(result.b);if(result.a==null){result.a=rgbaLayer.a;} parentData[i]=rgbaParent.r-((rgbaParent.r-result.r)*(this.options.opacity*(result.a/255)));parentData[i+1]=rgbaParent.g-((rgbaParent.g-result.g)*(this.options.opacity*(result.a/255)));_results.push(parentData[i+2]=rgbaParent.b-((rgbaParent.b-result.b)*(this.options.opacity*(result.a/255))));} return _results;};return Layer;})();Logger=(function(){function Logger(){var name,_i,_len,_ref;_ref=['log','info','warn','error'];for(_i=0,_len=_ref.length;_i<_len;_i++){name=_ref[_i];this[name]=(function(name){return function(){var args;args=1<=arguments.length?__slice.call(arguments,0):[];if(!Caman.DEBUG){return;} try{return console[name].apply(console,args);}catch(e){return console[name](args);}};})(name);} this.debug=this.log;} return Logger;})();Log=new Logger();PixelInfo=(function(){PixelInfo.coordinatesToLocation=function(x,y,width){return(y*width+x)*4;};PixelInfo.locationToCoordinates=function(loc,width){var x,y;y=Math.floor(loc/(width*4));x=(loc%(width*4))/4;return{x:x,y:y};};function PixelInfo(c){this.c=c;this.loc=0;} PixelInfo.prototype.locationXY=function(){var x,y;y=this.c.dimensions.height-Math.floor(this.loc/(this.c.dimensions.width*4));x=(this.loc%(this.c.dimensions.width*4))/4;return{x:x,y:y};};PixelInfo.prototype.getPixelRelative=function(horiz,vert){var newLoc;newLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return{r:0,g:0,b:0,a:0};} return{r:this.c.pixelData[newLoc],g:this.c.pixelData[newLoc+1],b:this.c.pixelData[newLoc+2],a:this.c.pixelData[newLoc+3]};};PixelInfo.prototype.putPixelRelative=function(horiz,vert,rgba){var nowLoc;nowLoc=this.loc+(this.c.dimensions.width*4*(vert*-1))+(4*horiz);if(newLoc>this.c.pixelData.length||newLoc<0){return;} this.c.pixelData[newLoc]=rgba.r;this.c.pixelData[newLoc+1]=rgba.g;this.c.pixelData[newLoc+2]=rgba.b;this.c.pixelData[newLoc+3]=rgba.a;return true;};PixelInfo.prototype.getPixel=function(x,y){var loc;loc=this.coordinatesToLocation(x,y,this.width);return{r:this.c.pixelData[loc],g:this.c.pixelData[loc+1],b:this.c.pixelData[loc+2],a:this.c.pixelData[loc+3]};};PixelInfo.prototype.putPixel=function(x,y,rgba){var loc;loc=this.coordinatesToLocation(x,y,this.width);this.c.pixelData[loc]=rgba.r;this.c.pixelData[loc+1]=rgba.g;this.c.pixelData[loc+2]=rgba.b;return this.c.pixelData[loc+3]=rgba.a;};return PixelInfo;})();Plugin=(function(){function Plugin(){} Plugin.plugins={};Plugin.register=function(name,plugin){return this.plugins[name]=plugin;};Plugin.execute=function(context,name,args){return this.plugins[name].apply(context,args);};return Plugin;})();Caman.Plugin=Plugin;Caman.Renderer=Renderer=(function(){Renderer.Blocks=Caman.NodeJS?require('os').cpus().length:4;function Renderer(c){var _this=this;this.c=c;this.processNext=function(){return Renderer.prototype.processNext.apply(_this,arguments);};this.renderQueue=[];this.modPixelData=null;} Renderer.prototype.add=function(job){if(job==null){return;} return this.renderQueue.push(job);};Renderer.prototype.processNext=function(){var layer;if(this.renderQueue.length===0){Event.trigger(this,"renderFinished");if(this.finishedFn!=null){this.finishedFn.call(this.c);} return this;} this.currentJob=this.renderQueue.shift();switch(this.currentJob.type){case Filter.Type.LayerDequeue:layer=this.c.canvasQueue.shift();this.c.executeLayer(layer);return this.processNext();case Filter.Type.LayerFinished:this.c.applyCurrentLayer();this.c.popContext();return this.processNext();case Filter.Type.LoadOverlay:return this.loadOverlay(this.currentJob.layer,this.currentJob.src);case Filter.Type.Plugin:return this.executePlugin();default:return this.executeFilter();}};Renderer.prototype.execute=function(callback){this.finishedFn=callback;this.modPixelData=Util.dataArray(this.c.pixelData.length);return this.processNext();};Renderer.prototype.eachBlock=function(fn){var blockN,blockPixelLength,bnum,end,f,i,lastBlockN,n,start,_i,_ref,_results,_this=this;this.blocksDone=0;n=this.c.pixelData.length;blockPixelLength=Math.floor((n/4)/Renderer.Blocks);blockN=blockPixelLength*4;lastBlockN=blockN+((n/4)%Renderer.Blocks)*4;_results=[];for(i=_i=0,_ref=Renderer.Blocks;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){start=i*blockN;end=start+(i===Renderer.Blocks-1?lastBlockN:blockN);if(Caman.NodeJS){f=Fiber(function(){return fn.call(_this,i,start,end);});bnum=f.run();_results.push(this.blockFinished(bnum));}else{_results.push(setTimeout((function(i,start,end){return function(){return fn.call(_this,i,start,end);};})(i,start,end),0));}} return _results;};Renderer.prototype.executeFilter=function(){Event.trigger(this.c,"processStart",this.currentJob);if(this.currentJob.type===Filter.Type.Single){return this.eachBlock(this.renderBlock);}else{return this.eachBlock(this.renderKernel);}};Renderer.prototype.executePlugin=function(){Log.debug("Executing plugin "+this.currentJob.plugin);Plugin.execute(this.c,this.currentJob.plugin,this.currentJob.args);Log.debug("Plugin "+this.currentJob.plugin+" finished!");return this.processNext();};Renderer.prototype.renderBlock=function(bnum,start,end){var data,i,pixelInfo,res,_i;Log.debug("Block #"+bnum+" - Filter: "+this.currentJob.name+", Start: "+start+", End: "+end);Event.trigger(this.c,"blockStarted",{blockNum:bnum,totalBlocks:Renderer.Blocks,startPixel:start,endPixel:end});data={r:0,g:0,b:0,a:0};pixelInfo=new PixelInfo(this.c);for(i=_i=start;_i=builder;j=-builder<=builder?++_j:--_j){for(k=_k=builder;builder<=-builder?_k<=-builder:_k>=-builder;k=builder<=-builder?++_k:--_k){pixel=pixelInfo.getPixelRelative(j,k);kernel[builderIndex*3]=pixel.r;kernel[builderIndex*3+1]=pixel.g;kernel[builderIndex*3+2]=pixel.b;builderIndex++;}} res=this.processKernel(adjust,kernel,divisor,bias);this.modPixelData[i]=Util.clampRGB(res.r);this.modPixelData[i+1]=Util.clampRGB(res.g);this.modPixelData[i+2]=Util.clampRGB(res.b);this.modPixelData[i+3]=this.c.pixelData[i+3];} if(Caman.NodeJS){return Fiber["yield"](bnum);}else{return this.blockFinished(bnum);}};Renderer.prototype.blockFinished=function(bnum){var i,_i,_ref;if(bnum>=0){Log.debug("Block #"+bnum+" finished! Filter: "+this.currentJob.name);} this.blocksDone++;Event.trigger(this.c,"blockFinished",{blockNum:bnum,blocksFinished:this.blocksDone,totalBlocks:Renderer.Blocks});if(this.blocksDone===Renderer.Blocks){if(this.currentJob.type===Filter.Type.Kernel){for(i=_i=0,_ref=this.c.pixelData.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){this.c.pixelData[i]=this.modPixelData[i];}} if(bnum>=0){Log.debug("Filter "+this.currentJob.name+" finished!");} Event.trigger(this.c,"processComplete",this.currentJob);return this.processNext();}};Renderer.prototype.processKernel=function(adjust,kernel,divisor,bias){var i,val,_i,_ref;val={r:0,g:0,b:0};for(i=_i=0,_ref=adjust.length;0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){val.r+=adjust[i]*kernel[i*3];val.g+=adjust[i]*kernel[i*3+1];val.b+=adjust[i]*kernel[i*3+2];} val.r=(val.r/divisor)+bias;val.g=(val.g/divisor)+bias;val.b=(val.b/divisor)+bias;return val;};Renderer.prototype.loadOverlay=function(layer,src){var img,proxyUrl,_this=this;img=document.createElement('img');img.onload=function(){layer.context.drawImage(img,0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.imageData=layer.context.getImageData(0,0,_this.c.dimensions.width,_this.c.dimensions.height);layer.pixelData=layer.imageData.data;_this.c.pixelData=layer.pixelData;return _this.processNext();};proxyUrl=IO.remoteCheck(src);return img.src=proxyUrl!=null?proxyUrl:src;};return Renderer;})();Caman.Store=Store=(function(){function Store(){} Store.items={};Store.has=function(search){return this.items[search]!=null;};Store.get=function(search){return this.items[search];};Store.put=function(name,obj){return this.items[name]=obj;};Store.execute=function(search,callback){var _this=this;setTimeout(function(){return callback.call(_this.get(search),_this.get(search));},0);return this.get(search);};Store.flush=function(name){if(name==null){name=false;} if(name){return delete this.items[name];}else{return this.items={};}};return Store;})();Blender.register("normal",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r,g:rgbaLayer.g,b:rgbaLayer.b};});Blender.register("multiply",function(rgbaLayer,rgbaParent){return{r:(rgbaLayer.r*rgbaParent.r)/255,g:(rgbaLayer.g*rgbaParent.g)/255,b:(rgbaLayer.b*rgbaParent.b)/255};});Blender.register("screen",function(rgbaLayer,rgbaParent){return{r:255-(((255-rgbaLayer.r)*(255-rgbaParent.r))/255),g:255-(((255-rgbaLayer.g)*(255-rgbaParent.g))/255),b:255-(((255-rgbaLayer.b)*(255-rgbaParent.b))/255)};});Blender.register("overlay",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-2*(255-rgbaLayer.r)*(255-rgbaParent.r)/255:(rgbaParent.r*rgbaLayer.r*2)/255;result.g=rgbaParent.g>128?255-2*(255-rgbaLayer.g)*(255-rgbaParent.g)/255:(rgbaParent.g*rgbaLayer.g*2)/255;result.b=rgbaParent.b>128?255-2*(255-rgbaLayer.b)*(255-rgbaParent.b)/255:(rgbaParent.b*rgbaLayer.b*2)/255;return result;});Blender.register("difference",function(rgbaLayer,rgbaParent){return{r:rgbaLayer.r-rgbaParent.r,g:rgbaLayer.g-rgbaParent.g,b:rgbaLayer.b-rgbaParent.b};});Blender.register("addition",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r+rgbaLayer.r,g:rgbaParent.g+rgbaLayer.g,b:rgbaParent.b+rgbaLayer.b};});Blender.register("exclusion",function(rgbaLayer,rgbaParent){return{r:128-2*(rgbaParent.r-128)*(rgbaLayer.r-128)/255,g:128-2*(rgbaParent.g-128)*(rgbaLayer.g-128)/255,b:128-2*(rgbaParent.b-128)*(rgbaLayer.b-128)/255};});Blender.register("softLight",function(rgbaLayer,rgbaParent){var result;result={};result.r=rgbaParent.r>128?255-((255-rgbaParent.r)*(255-(rgbaLayer.r-128)))/255:(rgbaParent.r*(rgbaLayer.r+128))/255;result.g=rgbaParent.g>128?255-((255-rgbaParent.g)*(255-(rgbaLayer.g-128)))/255:(rgbaParent.g*(rgbaLayer.g+128))/255;result.b=rgbaParent.b>128?255-((255-rgbaParent.b)*(255-(rgbaLayer.b-128)))/255:(rgbaParent.b*(rgbaLayer.b+128))/255;return result;});Blender.register("lighten",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaParent.r:rgbaLayer.r,g:rgbaParent.g>rgbaLayer.g?rgbaParent.g:rgbaLayer.g,b:rgbaParent.b>rgbaLayer.b?rgbaParent.b:rgbaLayer.b};});Blender.register("darken",function(rgbaLayer,rgbaParent){return{r:rgbaParent.r>rgbaLayer.r?rgbaLayer.r:rgbaParent.r,g:rgbaParent.g>rgbaLayer.g?rgbaLayer.g:rgbaParent.g,b:rgbaParent.b>rgbaLayer.b?rgbaLayer.b:rgbaParent.b};});Filter.register("fillColor",function(){var color;if(arguments.length===1){color=Convert.hexToRGB(arguments[0]);}else{color={r:arguments[0],g:arguments[1],b:arguments[2]};} return this.process("fillColor",function(rgba){rgba.r=color.r;rgba.g=color.g;rgba.b=color.b;rgba.a=255;return rgba;});});Filter.register("brightness",function(adjust){adjust=Math.floor(255*(adjust/100));return this.process("brightness",function(rgba){rgba.r+=adjust;rgba.g+=adjust;rgba.b+=adjust;return rgba;});});Filter.register("saturation",function(adjust){adjust*=-0.01;return this.process("saturation",function(rgba){var max;max=Math.max(rgba.r,rgba.g,rgba.b);if(rgba.r!==max){rgba.r+=(max-rgba.r)*adjust;} if(rgba.g!==max){rgba.g+=(max-rgba.g)*adjust;} if(rgba.b!==max){rgba.b+=(max-rgba.b)*adjust;} return rgba;});});Filter.register("vibrance",function(adjust){adjust*=-1;return this.process("vibrance",function(rgba){var amt,avg,max;max=Math.max(rgba.r,rgba.g,rgba.b);avg=(rgba.r+rgba.g+rgba.b)/3;amt=((Math.abs(max-avg)*2/255)*adjust)/100;if(rgba.r!==max){rgba.r+=(max-rgba.r)*amt;} if(rgba.g!==max){rgba.g+=(max-rgba.g)*amt;} if(rgba.b!==max){rgba.b+=(max-rgba.b)*amt;} return rgba;});});Filter.register("greyscale",function(adjust){return this.process("greyscale",function(rgba){var avg;avg=Calculate.luminance(rgba);rgba.r=avg;rgba.g=avg;rgba.b=avg;return rgba;});});Filter.register("contrast",function(adjust){adjust=Math.pow((adjust+100)/100,2);return this.process("contrast",function(rgba){rgba.r/=255;rgba.r-=0.5;rgba.r*=adjust;rgba.r+=0.5;rgba.r*=255;rgba.g/=255;rgba.g-=0.5;rgba.g*=adjust;rgba.g+=0.5;rgba.g*=255;rgba.b/=255;rgba.b-=0.5;rgba.b*=adjust;rgba.b+=0.5;rgba.b*=255;return rgba;});});Filter.register("hue",function(adjust){return this.process("hue",function(rgba){var h,hsv,rgb;hsv=Convert.rgbToHSV(rgba.r,rgba.g,rgba.b);h=hsv.h*100;h+=Math.abs(adjust);h=h%100;h/=100;hsv.h=h;rgb=Convert.hsvToRGB(hsv.h,hsv.s,hsv.v);rgb.a=rgba.a;return rgb;});});Filter.register("colorize",function(){var level,rgb;if(arguments.length===2){rgb=Convert.hexToRGB(arguments[0]);level=arguments[1];}else if(arguments.length===4){rgb={r:arguments[0],g:arguments[1],b:arguments[2]};level=arguments[3];} return this.process("colorize",function(rgba){rgba.r-=(rgba.r-rgb.r)*(level/100);rgba.g-=(rgba.g-rgb.g)*(level/100);rgba.b-=(rgba.b-rgb.b)*(level/100);return rgba;});});Filter.register("invert",function(){return this.process("invert",function(rgba){rgba.r=255-rgba.r;rgba.g=255-rgba.g;rgba.b=255-rgba.b;return rgba;});});Filter.register("sepia",function(adjust){if(adjust==null){adjust=100;} adjust/=100;return this.process("sepia",function(rgba){rgba.r=Math.min(255,(rgba.r*(1-(0.607*adjust)))+(rgba.g*(0.769*adjust))+(rgba.b*(0.189*adjust)));rgba.g=Math.min(255,(rgba.r*(0.349*adjust))+(rgba.g*(1-(0.314*adjust)))+(rgba.b*(0.168*adjust)));rgba.b=Math.min(255,(rgba.r*(0.272*adjust))+(rgba.g*(0.534*adjust))+(rgba.b*(1-(0.869*adjust))));return rgba;});});Filter.register("gamma",function(adjust){return this.process("gamma",function(rgba){rgba.r=Math.pow(rgba.r/255,adjust)*255;rgba.g=Math.pow(rgba.g/255,adjust)*255;rgba.b=Math.pow(rgba.b/255,adjust)*255;return rgba;});});Filter.register("noise",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("noise",function(rgba){var rand;rand=Calculate.randomRange(adjust*-1,adjust);rgba.r+=rand;rgba.g+=rand;rgba.b+=rand;return rgba;});});Filter.register("clip",function(adjust){adjust=Math.abs(adjust)*2.55;return this.process("clip",function(rgba){if(rgba.r>255-adjust){rgba.r=255;}else if(rgba.r255-adjust){rgba.g=255;}else if(rgba.g255-adjust){rgba.b=255;}else if(rgba.b0){rgba.r+=(255-rgba.r)*options.red;}else{rgba.r-=rgba.r*Math.abs(options.red);}} if(options.green!=null){if(options.green>0){rgba.g+=(255-rgba.g)*options.green;}else{rgba.g-=rgba.g*Math.abs(options.green);}} if(options.blue!=null){if(options.blue>0){rgba.b+=(255-rgba.b)*options.blue;}else{rgba.b-=rgba.b*Math.abs(options.blue);}} return rgba;});});Filter.register("curves",function(){var bezier,chans,cps,ctrl1,ctrl2,end,i,start,_i,_j,_ref,_ref1;chans=arguments[0],cps=2<=arguments.length?__slice.call(arguments,1):[];if(typeof chans==="string"){chans=chans.split("");} if(chans[0]==="v"){chans=['r','g','b'];} if(cps.length<3||cps.length>4){throw"Invalid number of arguments to curves filter";} start=cps[0];ctrl1=cps[1];ctrl2=cps.length===4?cps[2]:cps[1];end=cps[cps.length-1];bezier=Calculate.bezier(start,ctrl1,ctrl2,end,0,255);if(start[0]>0){for(i=_i=0,_ref=start[0];0<=_ref?_i<_ref:_i>_ref;i=0<=_ref?++_i:--_i){bezier[i]=start[1];}} if(end[0]<255){for(i=_j=_ref1=end[0];_ref1<=255?_j<=255:_j>=255;i=_ref1<=255?++_j:--_j){bezier[i]=end[1];}} return this.process("curves",function(rgba){var _k,_ref2;for(i=_k=0,_ref2=chans.length;0<=_ref2?_k<_ref2:_k>_ref2;i=0<=_ref2?++_k:--_k){rgba[chans[i]]=bezier[rgba[chans[i]]];} return rgba;});});Filter.register("exposure",function(adjust){var ctrl1,ctrl2,p;p=Math.abs(adjust)/100;ctrl1=[0,255*p];ctrl2=[255-(255*p),255];if(adjust<0){ctrl1=ctrl1.reverse();ctrl2=ctrl2.reverse();} return this.curves('rgb',[0,0],ctrl1,ctrl2,[255,255]);});Caman.Plugin.register("crop",function(width,height,x,y){var canvas,ctx;if(x==null){x=0;} if(y==null){y=0;} if(typeof exports!=="undefined"&&exports!==null){canvas=new Canvas(width,height);}else{canvas=document.createElement('canvas');Util.copyAttributes(this.canvas,canvas);canvas.width=width;canvas.height=height;} ctx=canvas.getContext('2d');ctx.drawImage(this.canvas,x,y,width,height,0,0,width,height);this.cropCoordinates={x:x,y:y};this.cropped=true;return this.replaceCanvas(canvas);});Caman.Plugin.register("resize",function(newDims){var canvas,ctx;if(newDims==null){newDims=null;} if(newDims===null||((newDims.width==null)&&(newDims.height==null))){Log.error("Invalid or missing dimensions given for resize");return;} if(newDims.width==null){newDims.width=this.canvas.width*newDims.height/this.canvas.height;}else if(newDims.height==null){newDims.height=this.canvas.height*newDims.width/this.canvas.width;} if(typeof exports!=="undefined"&&exports!==null){canvas=new Canvas(newDims.width,newDims.height);}else{canvas=document.createElement('canvas');Util.copyAttributes(this.canvas,canvas);canvas.width=newDims.width;canvas.height=newDims.height;} ctx=canvas.getContext('2d');ctx.drawImage(this.canvas,0,0,this.canvas.width,this.canvas.height,0,0,newDims.width,newDims.height);this.resized=true;return this.replaceCanvas(canvas);});Caman.Filter.register("crop",function(){return this.processPlugin("crop",Array.prototype.slice.call(arguments,0));});Caman.Filter.register("resize",function(){return this.processPlugin("resize",Array.prototype.slice.call(arguments,0));});}).call(this);PK!xY>~>~7abilian/web/resources/font-awesome/css/font-awesome.css/*! * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('../fonts/fontawesome-webfont.eot?v=4.4.0'); src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.4.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; } /* makes the font 33% larger relative to the icon container */ .fa-lg { font-size: 1.33333333em; line-height: 0.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: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: .2em .25em .15em; border: solid 0.08em #eeeeee; 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; } /* Deprecated as of 4.4.0 */ .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 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .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: #ffffff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .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: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-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-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"; } PK!IdWhWh;abilian/web/resources/font-awesome/css/font-awesome.min.css/*! * Font Awesome 4.4.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.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.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{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .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: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-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-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"} PK!_֦8abilian/web/resources/font-awesome/fonts/FontAwesome.otfOTTO CFF LOS/22zR`cmap!wOheadHI6hhea Z$hmtxl maxpgPname&x`post g(_<QK  ZPg\33spyrs@  / /: /Q /Qc    ^ [ q . [ $ [  s  * <Copyright Dave Gandy 2015. All rights reserved.FontAwesomepyrs: FontAwesome: 2012Version 4.4.0 2015Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/Copyright Dave Gandy 2015. All rights reserved.FontAwesomeRegularpyrs: FontAwesome: 2012Version 4.4.0 2015Please refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/"" l@, !"""`>N^fin~'(.>N^n~>N^n~ !"""`!@P`gjp ()0@P`p!@P`p\QA0ޕR     jR  pv_]yn2@zZ@55 ZZ@,_@f@ @(@@@- MM- MM@@@ -b   5-8@D@,*@  mo)@@   'D9>dU*q    R     @ e ! %R FontAwesomeCuvv   U6U6 +T+|u\ ",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~%0glassmusicsearchenvelopeheartstarstar_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_614Copyright Dave Gandy 2015. All rights reserved.FontAwesome $(=  $*.48<DHL{!'+9>`g "&.26;?DKjs isw$7=FNUzRW^ejquy~ 4<DNY^ny P[`eisv{   % < @ G S l t {      ! ' M q v     - L U u ~  ( : K \ e j q y    # < U Y b m p w }  $).DZkx}  (,?RZclqv|#3AIOVZ`djrz$2@N\dmrz (-3>JRZ`fkpv{,! T <<BKH K\i " R t% l /@EXXE+y}}yKX= +EXXE ' 3 `T~~ 4gT@ 4 f  1 TR @D=  ' * << 2 2 T >  :T F  ya H T\ = 2 @@u 66% y}}yKy}}yTJ @ K1 @ c; D N  ' T& F  ]]H}t ""  hh  + X y} N   |zKz||zKz|K   ff T TT|zeU# & | w R + hnnh *  }yTy}}yT  V` * # `V EQ |z ` F ~ k 9 9 0 hn DRRD ~  1 TR 5 -   T tzuxu[Brlmyz~5qsU a RD` hnnhhnnh   y}}yKy}8 TT TT{ [ ;(=ZXWG/9;/_Mknmn9:YIƑP`q~d_i iii  h@@hh@@hh@@h 0: l . F/B[NPuc]T  }yvKyx}zy zr^``^?_  }D}} k K&  ^hnnhL  ) ; h@@hh@@hh@@h @ T1  + yy s p F  88'}  }t.+ݭG 4 1  ! _    - .   n\n 3/{V= @;~ ~~w~ fz\J$9:lA T}yT5T mm))mm) ~w]]w~ 05 H EYM @h !( !  S ZZ A 3 3C ~  z{ U f  ,, , ,  - .  hnnh \xcikvss]tRatyxx {Vv7+4 %MY tk 6~w~~  p    05 xyots{ tp OK+ yyrrrry +t 1(  )  = @ 3<  | T* 5 quuqqu;;uq QDnty t H t  >   r !5 $  arwwvyr/ w__c p] 44 x ]]9  h  &&{   F B i D$$D yy ; 6T u |z  <<<< `=db97 TT_Ld k nh ˻WL ETO > }|A E##EE##E ~w] ɽ s o"7l z &6 \   g O  +   << y}|z  f z{ 1 3 DR  $$ - 0 /  EQj b ~ ++P,   ,     z} XtxmihbW_) :z{  < T;   z t* E##E   tB h@  s%$ TɽYM qt{tsoy *10 ],y B ' !! V }jii `V '  ]   ] 6 wkz|| s} g +  h T   z 4X  \$"WT SZ rsyy'&  %t~ * i   ]]      }Yg,01 xeqZ  c ; B P j^ai4a8d Tk8b9[d&\PT P !F!""t"""#o$$%%&'G'()e)**O*+=++,9,{,,-q--.0 0112K2_233{34/4j566d7e8 8?8i899: :=:;W;<`<=>?@AB2BBC GzGH!H\HI/I1I3I5IK KgKMvNNOZObOvOPQSSyTTU8UVWXX X'XJXiXXXXYKYYZ[_[}[\W\]m]^__b_`ZaaGaabFb~c'cd_deEeeef&f9fGfUfrfffggcggghhhhi0ij;jjjk&kpkllm@nnnno}op,pqqr>rrs1t tStu1u9uvovvw&wawwx5yy4yyyz*z{&{<{q{|+|b|}*}}~~Q~q>BU3u4ih7` bN4vhok/wB*k%tAYqVOLlBXĀĹ)ƿCǪɓʥ4ͫlq9) Xִ,:ةq܃gL޵(K -7Z<c=R`  j     }p <}abT|lF7D) c    ! ![!"#$$v%&#&o''F'{''(*)3)+`,B-./019122p4+456%78e9 9: :;;<=>>*>x>>?(?@H@@A/ABB>CCCCC C CCCCCCCCCTt TT4d 4 z..ȮhKhh3c # ^uiƭRl  @. ? FMffMZnnw     d  `Vc~ofa[ Y  T?  @ suw#$L>$#69JX"!!`V+/EE+V1RFS _r@3CC3U f 5 p]  ksu[ztfU& q9 [[9:QQ:Mqksu[ztfU&l vVlXXlVv6*336q ) Ki l  i4Y@ zzzzf Q T0 Q `VV``VTV`ԛ  T0 f Q T0 TV``VT Q TV``VT TVTV``VT  ^y $% " hhjyy " "  ttBKH ttH K\tti tt ?  H K\i ? a tW&S:aR`S:a))6 z6)õ`a;R`W&tA ;;QEEQQEEQQ T T  @ h k zK}zaEV" nmloL{yry}{{OJNll~n|i&js^^[{m~mkNo|y|rz{Kpijki\f_i]QM[!|Lz~rǑ̒Ȫ'fgiM   ([po pHH4g l nnt- v .s~oJ,W`aGahc~v~AHH < 4t4tttZ 64$){|||| N g|5pp Ty~}y:y~T ppur5|gccn_Tz} y}}zT  Tdgf[wXX[fe ? tqTTTTTTv T~~/7 v ('T T7 h ,T,ThXhYm}}chhcqj}}iVgvL wxrwwvttv$d t !SY;;A ylD&)'C3 Y4T[ t} |}zcesd,.9/F-0T5 T"Q>W"SX5z|[,9FZ3{ T[ i #""T    @ ԪG@3CC3U TTT T+ kT^^^^Tkth]bt\i K^_=1lno1"-SKq~n}s{x}zsz6 ;3n L T T/WW/!(ZMj: kA TK+k+8V=_GxɁHKxMG_8+  MddN-hnog? ?go dN-hnog? ?go_QP ox}yCQ(Csyrp}t{xo_PQ_K n{}|zx8 S``*S8 qxozo||{}s}|{n6  K vvvu 'j  ʪʪꪫʪ骫kihvvvijiʌ oz 1z q w z z z 1{g1{{{{Q klloʀ oijivvviijn )n / _^X*DtcX_^sjii}jttjjhs! g|vtywxog`vf/TFw.qra\zzzaM{tswxyzzVc,sj|wut{tv\h2p]yx}xzuxWi:mY{pvzs~{sww}e_^#:/r8 s 4S4K4"Kme,,eBV4 K"44"4\t4T? 4t "T33333333T4tXr=EE=UIrXtv l O T, ie%/,xxx(((#Ɏ wR'VbgfVpoqqq{\/j}}Yh^?DFG@EatV@ha%-n<scsŔO5*VJM(0x[[_}~ %;AHW{'Qbgfg FIGf=R!Gv^]^z8'n\PuH#hPMqJK{-ЊxġMMN[ĐơϦԖУ!!!x$ǁΓmr;ni~GhftnOlFKwz6 ;p6p_ph6hpo;_}oh6h6}_yǏ\|}Cy ^^^LuZ q4I eptcCDC  yǐ]|zb||}3mrS 667W, "4I ~yv}u ] y]h vp|zwwzv {y{  |p hy : . : d . : [ y : .r : [ y0: .0: d .0: [ yE E E t  @  f tX>l TX f T1 H ke tX {tz{~'&9* TT& T| :''~)T>4444Tl  |z@ Y  4ka@@  j D~~UT44/ ~sjiij}st:944::!k CNLT_p’tR!u @MϠHGwwsr@umXXj:bkkcv`~:jX;Y;l-&@yyE i S+,,||~KK$ fccL+4444400f,,fMff// gl }{|y~wj$ |z) "L {zt{tqT4 7\3ulz* p4Tqtv l KK$ fccL{kkYkkkYkkkkYkBBk  {   + u  0vgs < UZ< Z SUZ< ZZ ZZrZ hlvlr|h@h|h d @^ F ^ [ h d @ Z;ZZ ZZrwhZd Z;Z@;}rrwS rZZ}   u . ::} zz zzr:: ' zz} ::  :: zzC bu  [nh !C hnn !h }2zz11z IIII{zzz1IIII IIII1zzz{IIII{zv! zz{z vv,+ 1zz6h 4y}}yTcTN T4,#Q?`\pnZtҫȧPKgjzx}wy\O~#7@TKT!h 4@ T1 4R +1 4R ;D44{44!`$$`$`$l $$v$`$: } #Zk==k##kZ==Zk#: #k==kZ#v#k==k#[ ]&&&&&&  &&kK$g %} ''} %%  ::!8$ %56&{SjjQh[=<<=>a>a ^CT}s@skiij}sst: jt x }sTӸ~ssjiik}ss@@stjtTC^OG GOTs: js@t  K/ sjiij~sts: ks@sTC^ǸTs KT/ @sjiij}ttTTtjiij}tsA@s: jt t !j_ t,Qa! KtkvqCth tԃh <<p+>|Ri/8Crb{Zja_qV Pi44T) V``V| N tY d  T f `d d  TT' noqqon' !5((5!Tft//tq:v++n+*mm*+n33" äyppv-)k ERQDEQQEERQDEQQE9},~ q 2srqt-}}N}}~ZTYprr~n pwefc~rrq/s~|~M}~,soppndmfnen s -}N1kmo/C C f l yQ n6$7dI.3Tfo1\s\k<^  U/Sk ?Ÿj-@  +6 7 Dɝ·lZ'#ik}ts')2OKebh`i_mdG1dq`d m]a"# e G.3GNOH 6  t@K̬-*osr^ ?<k篞 Y xxytR]ssvkc\k}\vs򺊧1fzk~rvdOJ.eY$n:mo`d q1d_`cJl2)t}ǏymD f @KM>M>KR4)<5Mnɿ<5)4RP p]5 dr3CT~ϧXԙT& ~ϧ4 {{{J{J IYU:=YϿڼWG j8Ke`bz|vw{ ̋{&,(i"z 4t4| TwN T480QEEQQEEQ086 (y{wA[ il $ T/TL^ADD EM DDsl  ,^GofC3T~ ^Go ^!Y1/)Yb1+ pԶ V``V Rzf|Xm}[YKKkK+++K+K&6+++k˙̚zfR_L<L aNi`ʆ ŕXP,! t\ r[t  ˷?ApDU88Dp? ? \` TTz{{z~TTTlTc!8ZZ.n82Y\uZHm{(r^-Ʒ֫Ϧ [ {wx^^]Up[c\ˀtbdee  $fb%aa>"ipuleǞëѯtC3$ 4,g3& t&;*226;*s qXsIm[FHNMo;otpлͩ&oxtt_Jdwry0Ayu{&Ay  (TQrLyJγʣMfEpB}P7.G$%Frrs3Xo[{TO(QVY`1(mpnnvww ."4X+prq/#>VK?ʹķSp.v/nQ1h% p%\ 8rwsp TTT]]S T4V+T - [ )  \@@ @GttZ Y   T>zi.],++,]i{{}zyjpnjry''{{~{y#joicciq#44J J 4 @ ԪG2t1v~z1vF4YtHAAHZEtYrtpԊ d 4TttgTEuFF6!1=۴ n_F( RD\\T$4 .G^SSG^J(@twT3fM V``V}~d3fTw@t(EQT]Th `wrPNxyprNV[Pwrqqyxyprrwwr[PNrpyxxyprNP[rwwrrpyxyprrwP[VNrpyxNPrw}PNVVNPxi4.TNl FPPFs\k >\V?Ckk++JL7 =3`?.Qm\ibgbjnG5[`d fuel# =  i.Gc4`C>[B atĹixFP+֫ঽtttuV]]B1f [GngimQ`?34=_`b    =acf}|}KKYS#L  KV?Ck1B]]Vvuut+PFxiԹta ?MQYKK}|}fca=    b`_=43?`QmigجnG[h ʰl ZB xxyatRt]ssvikcx\j_qFPPFGOLJ++kkC>[+ hnF Ԯnhkfuff `[5Gjnbgbi\m.Q?`3<    =؉ˠSL@ C QQ{z@e00- 0 {zz{QQM! 00LQQk QQ 0{z%  00{ QQbQQL {z  00k QQc QQ {zE݂v <<>Gww|&xjUt=N,BQ?F ;  {tqzu ~z t 44 44tU t ah w$$Tj Tqt{stoy$$$$tqT5 T6 $$jj$$T.T $$"Wn|`_]#v:[vVi\\iVv6*446Y Tq u܎v#6]_`uuu0n1W@^;Y  TT`4S2S@zyrrrrybcyjdK  djyddysqSUmtvwjoXV``VXojvwtnrry@dd5 ybcyrrUnTddUA??BnUU'&UVlA?>CTddUmի3STk@< ?BUbcTmԨ'&"J,>[KQtd_O>Kj}|},D!/G  #  # @*!! @i##flA\3T3T K"~xF͇F6)-1?pWSRWn?=%(EUmþBB_XS-(mU6EF(%=?VXp򎬇F˞y\&sqb]NENewdG&NS6}dNDwO0]bqNñџsSe&GF\}w~vt:4+q4CKtېE,- 4dYztdV4VAlff,,fflAV4ST? Vi?fflAV4K 444K 4|+fLdUS55TTd..Ġ ..||eWT6LL6UVe[o!"m\à B)%h;=h&)CMe0 04Vԙ 4 4S? 4{}~bx4 T ԪTGkmeeBV4@? h d h d Trrrf >l 4B 4F>l 4B 4FT 4F h $@7_H,`djXg]SˈScfzhebpR3^v"Om(;.?GdFjPyi7voMyyy4 @(!?:::  (l T@bTz|@>f @4 /{pkgGR[".__ušȟmNgG&߅ȂAP_ATeAa6226^%OLJnpsosxZWS]{`lcmcbnXzyY\a\^cbhnnpszf%_whY+W~ cv͉ΒИhv9!݉}t{D$p_Civ9U:j\ik==T6N#-j^AT36dC@,*ݶ8Q_39*w:8XkEK[=. =)Ҹưչtz}|}(JC9_4K4'KT,T" T(  N;Nh[NE"sxt .6-f.8CW8 orkOb.QE-]]d Md*SkC t& ŧH(PSb_ghPsY6gWb7E9@7M(m"mhhooi)^ u{r|sv>(T+J~ff~JJ~ff~Jv  O ^5 - [ o  mTT{zTTs_ TT TT c 4  g@@ To m To  mmjingr;<7 M7#?#77 <:fimU B4@ V7)0[/1/^//10#sEAA*,?m6"mF=(G`$.ƣ 0 a ;;YS<! / sjiel{ppmoy,,yrrUg[giyxtq]um~~~~mu]qtyxgi[gUrry,," omu pp{leijtt! vL TTL @u^9v:p%"M$%MڑhiL L TTL T&&&&@;$yz%:@ %% iT DddDWXYV_lw}v~v*AdDQ yo6$7n ^~ )?cwrvy~x]͈}|*YvvTF +TT? VԹ TT+V``VS? V+TT+ ? V+TT+ ?   XvvuuvvHNNHHN> +   1j j/V qV qeU>k.) $4S4 T ˪TGK4ime,,~V4T? #x:4tT.H pFF4KqHaZxuuvwtD6O'xODwuxaq\_ II_ \DD$2?? nzykjstz{ztsjmy}z{JlQeűťž̛{yn׭|zT|WT` t4`Tz| " tFTGtDts" 4z}|yt T ty}s tT4T> F N[cG=B^60 QEEQQE ]uI7#e  #7upjj_pB:' !5ܾئ_Wc[7+447q  5!' 7Ep> m;4U> ua[w RҢ&> & RD[apdu茆+ U;4mph]@ @h֦tFt  K=t B K $4 (@twT3fM V``V}~d3fTw@t(EQT]T)T' K5! O h@@h5 t{ T  .4\ 44\ 4:Bpmצ^ \tEQ < 44K&T/T+ttT4 T/T4 T/ t#"KT|zKz||zKz|GT|zKz||zKz||zKz||zKz|3 F,d @^5 - [ ?t#"3 ">,kST?  K + K ԪG+*G^UVT ^- [ )j L WWl2L 4  T05 4hZwrrlZZrrwZh4 !"""T[ 4^ 4̗ 4  Tt k=t4 4B k )tK +4Kk44Tt+kkTkTs TskkTkTt44Kk4 Ftˋ |g>DRTT˫kTTktkKh@@hTTi  Tbbc c 4  C b [M Z4 }]  }] ZxxD tI I D 4IIt] }YYY D I D I) Y |zY3C4KGfF .K )4ԏ TgTkFGT Ԃ `t4+V`@Ӷ+7_ 4 Ԃ TG TC3t d_gg_ d4 TGTT7EQ7 ԕ   Tu NT@"RDEQRDEQb@TT@QE`EQXx ~ 3C @T5!' 1(b '&G h !*j4a,t{ztC8qbbb{y{x{K  t44t) ) 4\<-7ʗ7-tD&c+zi0&H. 0,-##s& &2iGz@@RQT+c& &t  ^ d tV``V V`T* TTTB 4 & )^ |~aiEjVulѬo70 XDQ* 47mGGT4! & naxjigxi j(C(jgjixhi5'=='5G7 n5Y'=='5YihC ix7 T^ .T7)TT@ TTp TTCR TT< ;TTD KL M Cyy p< ZE )j ?p G  t+t  G 4  +  G  HG  G G G `++t $g f `d g pjM Pdioo '.X@Qh  @P  s]OT4 T)&Yffff zM{yz zyz  %tJjZ!! !"и$yf+/YkzX,Hn|}1d Z\IێĬ TTTpK =b$tO) 36mUzxwyysqggKgywxzpTmӨ'&h~zUB>>CnUU'&TUmC>>CTz~p5 y 7O) 36$+= } K6 Khnnh T- [ Pt- tohhonhhn S3@ 8< ;|#&%6Nkj3hW@x}pU3@ @8< Y;|$&%6Nli3hWy|p"9Iv]Yfh{osjeV]]nw uKJQT*FhltnݖݘƎqDA5%!*QTFhulstnl_a99:P~݀*Pk9okթ.  ]]  DjD D$$DB ?CI9..9~`n  S AENB^  T% 7;L9\XpqTT^5 9 $9 j # 4@_ T+}~| ~ knr]J'V{ke{ohc-# /&|~T+ `t{yS;RQPIODwt{K6Ktqn;<-y y =vvkhF@8h !!0 ZZ ZZ0%  !!h a!0 %  0ZZ !!0 0 % ZZ0ZZ !!0 ZZ 00% X!?6IY(uC XVYx\b66 PeSGQGz5:5'DN5(TKKT( T_ 4O~~'1 A3ZpT2 T7׷[v ,9_7XT5  / TZA1 ~P' ~e Q1  Q1.] TTt / F ]]9 kV Y CyyE 66% U TU TU U TU TU sL -w|a99az~zzw|33z}zz99S h <<$0K_|h)!LNMMNwK=KQx<rCu)k,##,)CrrutturӠ,#ˬ&~'+'}~~}} 4 4W+W 4 tl4}*UJ*d&?K&>G5#p)q M)? ==BRippiip!~b^^jcjc~9?>99>?9elleBel9Ble9Bd2222v< <e   h &]&8t#4#4-_G_G!r 9*Hb=gh`̀, ް5-"MM/8(x,(90KDzіɕOTOm̀ցQ\Y5Yy{))+)jxYhmG{IUsV7=o{vu! z'f@o&d1caaPEb4"f|aunO鿦ɯ˱nno5.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<Nh pti"d-"`#69VѺDMV"TAK$ ~tW  t~~))~t  ttO t~򕃘t ~~t =t~qqPV]]tסжihhMD;ZQuItI[nt]FEQZ-[+@@*e-8;@@4uvǹߤ p7ZYCYCq5( >>>-r>->j7)1auabtavzyvvzyu:uzyvvzyvLR]]SBR]ĸB]Sx*.NZwR]ĹwwR]ĹwǼ|CNGCCG|pNC!C,313, q|]RS]^RBR]Ĺw$䔻kiᦿůI7Y=+kt}n~x?z}}}b;u{{~YP KS{TSm{qiTAsFGKiwzwo_ewkjZ˒lshztu|Цyu"5@'\ϊ؊sqٱ.&7e}|_g͗5|qD|unlaK]~diqqquzw|wʎó^=~Şv}M,7QupzTS(pzKYNGJ b/ѓcctup4K6gp1zyyr7Y}{w\@wxFis}txyoGqt sp^)X)iz=JFdf|oL{1$+#~[G0`SQRne*wXjsIx[Ͽ^d7,vX9 ZY deҦt.tE##E)o}}4u{zu\ O#nWvZh,lt:$4Zsj{rglb1XldvG'bQ^{yqa|x|{jjs}.Ӣѡ?IY–Kk.#4)sV 1| XRf 7n]Mw]^}ǟxwVo] ytyywyB A'!3EMM!#] ([B4WtImnxWxWtIWȇ$rzӎlQ3J>Rq_(%vv==)G/H{uAR6=zkwlkkwllaelj{RI7 A5ifsgffsh./gge0lF h miE#=[Z\Z#=EOiNQ@QyQ@QzE&}9ً܉{H[1N[GCJۋz"q*g2EKa"81&*a/rwxrrwT(v]*I0330H4Tz| 4$T|W2 T 4$ T> ~~TzwwvxT24JY 7 dp~ F47zw8,lr7RZ(x[ts[{+;f DK^Fxukrlqv}K ?(&PX+)#JU ^mmm jgenyiYW»ëP7iSպԤÎ˒rSppoG.B%r tTtTO4) Zdz{ IT4+. ^ tO*K+Z q ^ C3,L)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 D k.L.k?+llH\\HlZ釧鏼0K K kcthjz{{z7LvvK7isùĨwлQahaahhaai?Ul[Ĺ]SZ +)**MOvrqvvq 25 3 + qv6!Mr342oqv* !)```NW{WM}|XLyR]^SS]TTVQ~ùù]SS]^SS]WQURTTl 4''tTTttTTtT a`aa`aMk`|8aMakap`a9M<97Ba|8M97Ba|gg[o+@+CG%:`dhbgbۏ֯Ȱ:%G?G%;adhbgbN;%GH 7@ Q Yr3FZXaXxwx_blkx B) K%Lo3BJwu~kuxuk?Oz!xyxvzAY Ϲ[Djmhl|{{̡ԡԈ֊ j8ч5T&9E Z$j@b<r(B{]<6TY uZ|iJC^E,g_zsyubՖӪu^@q-1ݛzJ1jI1jgTiԻ EY}MF{M`@]~tvtz,~@Y=U/0Aqtתdz}PPxvtnos~}mzVz-cObPru[N S=)id<&li@XsŒՍ0ZZ6:3W4U_U266WBN@ h[aj6GUv@cLj^HI,+T(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+,jJѲ"^ z}i{ѧ錐zss^myzSvnnU{uuwz~˜ڦLvewe :rnwt]R{ϝȹ̯\jtazm|}l~~nh~uN?MamJ}fg^%llI%uXBlznxj|Z6{&1~\NULܿI4'6kZ6nNwauT t  `77lf,,fAV4 O W?tqB B B 44z @t 5 - .j <K T DK T<K T<K y}}yKy}}yT8:8y}}yKy}}yT8ttpfeOefxxxxeOeffeOe8  *`7Q `6w% Y4W%*% X4j%1g6` Q7*` D4 Y%*&4 X%WT#EE#\[^hnT^\z.}TNNNiYT}||||}TYyi[U\`uTT + @ 8TjMQMQMQWm[FN$l\TT{zzzz{TT\vl]X$FN\vl]X4[^vTtR TtR Vo8>A , '>&&2uQeGWn!eq=s)b?ɽX/c o E`(yk2@ /POlAAe  e1j*.Nz+8a{z{aY%#y=<==<=<<*```^+LPzlX1Az/-6D&@I`_B   4 4!3}|~jk/k;j:/d;jkjL`,Th uY54Y\55\Z56\~  q@-& T| kD>m2W._Z8nE 5<hLhLQRSu'/>0Agz8(ҒӑP0KC'ZL{o_uOn ɋ#xW{D ߥpBdȋeE)3 +57wp 44tT~  ~ 4'V . ; . :44 VT K. K. :' taXt Xta_ &'y&'Y  { Y&'{ y&'{ bKHJjp̃Έb[ aouwr~'89{={mx<*e>okjqpi{AR*7}xE|}jp]VY0-|xpaime{}ld""p*}|blv\&A}xfa)! po"_m3m"3s¿8~~}~hs׌ $zctc^_Pvv~w~yf{h{ Z~}}}}}||{|Z} z}{10df}itj\KMuTuzy~00h x x x <  !a!<Ǒml D4CPWhЌnjʕ|vw||ryIs7h3^1c:gJlXJU>]wD&_nr6Hgdalor@/K&``m}",y }z~|{@Ë)ҧ̞ȭBO`)y)o3hm^Zx:< 4i 1J{z~v$${z~J1 E8)3y{||y38)E1  4gVQG ?33A HWT! 5|x$5!~  4t/|h7S.1l~gd`;!Ъwgvph   4'TTT(5!' 1     PfAV S@? i lfPzz $d '44rn99l>SO~~zz K 4EQj1]  < 44v{v}JJ}X}w}vw}Xe}w}JJ}wevaʁӎyLzzyӈzzyuYaaff6&̶Q HyA~`Dޟ(#PgQ+<3%!!!S|BDMhߺ ђ.-.-.lHs-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=A t D jRVVVTPQSyVVV:RjVVyVTPQSVxVVyÁ•VVRjh@@hh@@hh@@hxmŁyVVjR W FPp6pFM W%%%%v|y*|8 G}AIrw-u\? 5'p$ PY84I5K G3#T1!I%>HGUB&- -%bbd&-JRprvQiu,t~՗Ӣ9RMgĬx{}ާEvhrjplJ- ?&n@5dbbI,ueui`M6 fXPljiijlPXlf`M6`ZiRuL};pommop|;LRZM6`m[[ƗM6Ġ|}+vjS&zzgMRjhed9oICAA~CtIo}d{fxgj ;v+Iz5&o? mjhĬ7;jjjjjjjj D \O+:xOa_UTS˄@gftXRweWWk :{z{zzy"J<%wly}jhw|m'!+\! ոϡnMbx7tttpopyjef{m~ Ǻ iii yzyWuf^ V]g`[[f_\ `Ujf#b'^jTm4=yBF$3P:kS43g߫ޯG@pFAw@UMMM%O&iWtLXU_ogBF bWR?d/yH(#-:=;ra``^_^rrukedA~ R?‰“wnmm(?+RVB=jȕwS<;QE>?F X`X4! 55 pqsa_^U^HKʲJpwm7ųu~`//:q~iykkkkkkgfhopypoon0 +(\fmjő¡CB{gtzldg{S)ik-z/Rɮ٫ސq,Þ2=5qnYVL9+3zZ$;;#}MwzVqzvy^oyzzUggTUT¯¯gT{fggTgg¯ggUggUTUgTffgUgggg!Mm#[8ICnyy|죢Ԟ[TI&%7w ~~Tvtsrv61psYM w wpv~Tv~tsrvlUXqsk %]ra ;;YS<! tZ  t66I bXkC_}g555333g}cm6ﳽmv%f~~O~~~a}g767/./h~bn1lp.[Rh5kuZi/4oe ^Wf7h7jvWi'2nfz#zCpisL2r@;pEVP<Q;Odlwm #>m i ƭ4tt ttTtth 7>jVRH %HVjRHR>7E##EجHE##ER  ++ +  heXuS + þuh  + ++ SXe  %  +  9/ː/4Gj{fj}^11^rt|qj|$$P|jBGrbrrKK& j Sˤr(Ge~1~w~~w~1zz0v~ 0KO+) 3ET= @ +3< +~w~10  ddD mcFr@:}77:@ڳm-T0>2tM2V33V2Y&Lt>T0-KKKKKKKKTtQTQTQ@2 gn~QTQTQ$2  H~HfW T gnT<}~} 2TT~}</  O4tOf Y:YY%$~~$%YY:YZ$%**44ool8II8oo44**%$Zu*  +  uHd8lhTwwvym\_u5^/7hVfJC22C=+JVhX[<*N?Y3: ]#"S:Y3N%I%%%%F%"F%F%"mmm%@5z"mmmmFFVmyjjgwrPE]}~Su8ӗ)xm6 |uw}un]~')kp{u~ y nkuptogo>4y}Ϧ)Q4  gyr=7TRyytvz3*WJttx~8tA&ysjmm}՗  v\ T 5d 0fg ( eepZp %$ B((BP! (''$$ GG(GGs$$zhl?9%$ _{_{W 2$ L L L L L L EQQEEQQEL  b ~$ EQl  lT^_|_j-Z7BG:?)_s:y8CXccs{~syyyyzyoto֎~@,="H(`dine|Anq˗NJܨ,+@מaI Ɓ8%m^9^9&^5 LZ_mOMrqs7bh%7fUiU>!Vvj1 zA@LF){B90kMKpo}q4^i4c2!b˱̩,|l-ƒs|eW"}fڋ\GQ+L~bGDCd5.26J:#:t|mcUJmopmvn]TB4B@Dd$rvJL88˿}~=.|Նs=xzo<BY$lŖ›/¸le3k{ut~irgk{ut(ӥ`xnqx}p[!T77:_\\]k]: rZwxo_(|MfmWisu͐0|u~Lvkcpy}~uz{y\ƊosTuwurl{~CBm]SbVBMjʞwywkws~~zqXIHI}Ons@WJ-E`Ǜx|}jxĨ@6'r[vyo_|MgmWisu͐!t~~yqWIHI}!?|zvYaOD Vhx/Ym1V:FMFVmY%0DF/bbF9@O)nH4(nO9 Y"Ω̵i&L̔+`~tvqazpubw& SJZu\ek pkfY ,F):J\^GZgmn|@~~rNvƯri_z{wow{vy}psV1}nso(>}>ptlN[XKH[ͨ>"?4'::''::',Ah"ttLR AS1 Sc1J@ֶgLXpjZ  =PBBPOA AOD=̹|ͻMV˹$QG̟^ͫw_BG.O`IΤwϓRϺT}c 3" @"7<`ߊmQ1ryt 8spvu:@rfqvu:@r_F />L6L!+Ohhhh[Nc92;1 y,((, mm<}nik<ytgn(Bnlmv2gW@TPQ~wezuEu@ :PBBPNBG=_"Z*y@u!_M"_HDJiQwrSrNG2JDt( w\Dx]nrTrN:BNcTX.]^ggTW-|cQf@+((+ll>vII<5 YaqT;Qvy{QŷbZ Y`qT;Rwz{Q9RIPP(*/inW|ϊL/b\04]O__@@e,l,} v)@eiyz ) v?n ?r4 or^{g=Zip *>薚=v*0n 9 r3 os^{f=Z@ip E(J-I4i^xz xY~**)(!= xetpq@tJ͉yiiylHXzdipsl_~UGJhsxyW9Yӿwyk]]s}zw~{mh7k>Yi{ ztdYgrn|oM򹓝gptx*kSk*kl1wGb_]aTfvst+*r\zheN;h_hg__hh_ilu~~$rfP|KEUfav,ɼuaaP@YT@A  ~@7뀙v~6y uT4*<씒>?DB(DD(BzD)ANZȼxȼXN=h :jTRR;;PPQ2<;5 ,$()MU]()++\TMqqz΂34ypm1 .oQke^ 'uv& ^ekex#B9o=9B]:#/ݠ"\&"iRex hB RXD@ _* pX@RchE:dM+A * [ $qf]]]U9pttp.ptqtoq  AA lL6HpAOYKI++srs I0"/rIHqqIHrﷰg(7]F$ gVd p'7)28]8 j @ j j j @o]" -]" -]" .\#<]i|i|i|j|6 6}66 Fٯ 6Vg <( gwddddd;A A@ !A@!!@A! @9ŵwvmQuLflD^A94wHMZXaǂݏ,|) *) )* )* ** )* *) *) )[OCPZ[P55ZPCO[[PP[(ǻ@:M`edeSO[/:~~|yw{ >g7.iczdfptð+&4R l^vQBR{xxgd~y</Rc4jc'^dcvYXwrlO[MOO[Olr}twXPYv@c>kPS/k_`bjpN1kI7+447 c uU)4S'-{:d@Gl &zzEwvlmulchr]t bFs^[XVvN;mЋD1 %/O,jF?j}yykDjDB'wsxx l DjD l _>hjthhjbgSgT.  T譁bjh>n_KD;Df `- l2+ f suS&yprxo)nrR/Eoqwn썍c@ ";;dxpXBB}tq۽<Tdmlsur|jtZ ttq tt/t H ]] )\<A 4j , {uNvQ*33Q~Fu{uv+NR-XvT  vXRX, *6xllsvr}jP i )[=)R~[~w~5-!/5 A "~v_V=)[P -uqu f!D! }qquur|jtZ ttq ttA tt/tì|r PZ<:~ `Zvg $gJAv<ֽYi}=af44 )5Mk4444i ; ; TT; Tl T qT TH 4Ti T tTsR@6{@),\,)əEQT qs IIs~xxx{?+)])+8s~T@d Tj k F T@hh d t TTTTT//TTTlTT!5(5!' 4a4a4`Dqfe2sq4eessfjoFee2o2e d ״( ¯#wmݿbt@r|kj>Slst=Sls_tiqnv„Ņ3I`QnN^DyagTQ3I`nȜn;((5;!!6ryPqhn}.d9=k%)}|||{zvvuyyvvx}̖ҹ֐acrppxswzn}{wvvDӍ⟳͂pTlZxeyR{o|WbeVHquOz|n*)j4_SnNe]_\]“†gwkrmn nny{ʼnZlvTdp@JI4X@^xԉjwvw@~ny yorpmue{`nYnpr@^rss~~xvvyv}yuwz{{|z|{}{x}~yz~~} ; `ˉˬ7y88Siˎ; Lp` d|jK='t<[=: Yvk2 OTV0OUƀF ԫafob~hF Swk9&&  gY8>%˻XM,ɾYMr}QQ|Q'%`em_Jppuiuzzwɺ˿gYv*ʹ%q-u*+?q8$@q+ )5x}2#xww;Q" 7=YjyJAkttTtTg[ MCΫ MC1NNgZ´[VmJJ{K/oqwnb= ѵvj+^ v d^]  Kb[Քm)xyx^HCii}l\NJp" #kkgk ot c7/{{{ v zf+!v lln%0 ǓEt^+jffllɽYM{{}.}PHT/7qͻ]H{4cycq_MYɛǦsjZ\ !}Zcdznp% 0DRɹXNMTYNdkdEXÿ!0WV~Y6R}XcP^Zt|z+ za   }z!~q{yzp~"{}~{=UP? Q={~4Z]41YW36ЧubQEd]"+T&6/V,' t D 44'%YT84 9|2'8 (%XU74 9|3'9 4D tt++UUttttC<<4444vTT UUttttC++<<44f aJZZZZ44cTSc++TS33ZZ D DORKPKaXWaaXWaaWWabWWa 45! 54! 5 4!-..-......-..-..Xcccccccc0ɂь8`a@aNdC9sbccc@ccbcX9XE-JF,bH5@Y&nË49HbFs̷N{R{ `_`_`_`_9''''pqD-A&aa-D`qX_1`AMtCC%&*)GGbbIc~c͋%)Gc͋cBս_h 3PD33DD33DjKgl:VF_-zMWSRn\nnnn\nZECSSnn\nnӾN+F:g˝VC&&ӋlgZG%%GG%%GG%%GG%%GP8 X@ 6DD6srpsG4Tmmv)t~̩vVJk}ltu(vumm $O?$d`zw~y8Mva\tiN߶܎`4s~nkA["gwdLaG$lΥэv~{ҊꅮK-5%L .U |肙i54_:vxH|Q̋yPBCĻ*O8Qz }y2!v/>>>H>8*`F"]E4ѡ+E(7S\t"6% Ws& lhf%H;F Bdx;s6S: 6Sq%u?K La)an  Y T |z TYTt4 /t  KWWKKW#1bnZyOL/õB+ h'X=-k7yS[rWmK|CO]ew,i@RF˿WK7]o(Hq(H\^q(H(H_]Hf++AP[sHr8{3QB%W  0%$;K0Qfui{3iHw^Fyl}l 66xtm|cw&LL+dtjiJ4qq˚|O)xOpYpZ,,pWwT,JyIE7wt4vQ^6_ d tpK K Wl j T )  T )  @l TtTKtZ ttq tt/4O4 6t# +PPPP]w~PPPPQPQPSPQPQ[ k# ]w~PPppiP# f Tt 5 - .QQj 4tT_`b#v#b`_yyE Ct33| V22VN ' !!yrr0K+ -  !!e+vTTTrryy!!!!" @  yuw{{{s{sqvwl zz zm m`mmf t H @> 222%%WBS qg@\LP{|@)҅%i@@@%%  \h<;v-;ݯ].Sg9GFXVi_d:ftl\mM>U:\!-B o-Bvˌ{bє~8wp@  W]k .26:X\gnu"&*/?J~%)-1>BF  $K5:>*.QXr{  # ' 7 E K P T   * 3 ? X k v z      ' < Q Y ] b r {  & F P l z  $ . 9 C H [ c l o u 17<BHLSZ_jp~*@LQX_dy /BU^cir{(-3;K[kqw $38<AO]fty (4@LX]dltzfAV S@? i lfPzz d 4 T" 33T& l ttpK K Wl M  !33 )  33 y}}y 33 hnnh ]]]]9/ TS 6  V. ? C <  KTGTKBKH K\ b A _   RI < p R ; 5 - hnnhhnc }y nh K )  | y}}yy}}y] w ʆiimdod $@~ Kz&w{yyw}| |}xz{wa&zK $|'˒a %%%%%% 0: . ++ z||z ff} lTlTl Z $  }y ! T  [=r T , 0 w  +Z +q /+ VT. T? @h`h ^OG `E}n\>lF  ,*T+ |z@z||zTz||zz||zTz|Ժ @4F v ] b .j]^hYE֊ׅB ?Gߩмqٴ̟'(͔͂z'w!q=wVF7HJ?xs]C$ YPffEffM } 3CC N W} ' K& [  T%    tkOE;wOVVOcZwE;ɦL1H:  > 0 v !   1 TTL / _^X*D44D*Y_`t! ^ATT TT @ 1 | A j  lnl||}_zob^^bzM!a>9U G @M V``V}~d3fTw@t(suwN5~w}+}PV o {zF ( rcrr 3CC3 jih  '''G  *K+A zz 3')x~D&l&y;; Ky} _Ib \;COLD|yz|ru{A0% !h ! hn  r ] EQQE  1m M ff} 'T6 + 6 C3 5!tV`l K Tf( _ T+ - T  GCC8=<<8CGC V``V  :nh O: Q Q ! &&   H  z| LfeNzyz# u"=1?u՗  8 9 \buA Kxxtw~   BTH K\Ti   1 T MY;/a3 g 5} +   h & /]]1a nh e  ZZr g+ vvo @ ttttCTR tt S u4u {zu  -<<<< t  ; [8h 2j %% ~w~~w~    ;`L< xra 5 - OT   d zz   44  *<씒   yT +   ɷ ,$P++ 5 !4 e    }y  T f   zz{    ofZedZd H6*Ö )Wbit &m/ nh  Z   @  PK!xY  @abilian/web/resources/font-awesome/fonts/fontawesome-webfont.eot % LP^ >FontAwesomeRegular$Version 4.4.0 2015&FontAwesome RegularBSGP  !YD MFx>ޝƏ)Y ڤhDpjóK”*0~71^{+rAPu;.3ռKğ?]:yf`o&d:ٌeDgKR%qH :фsdW *0#QTݘ:b#@Ym̉{Dt!Zd΅S Qv'xUL8996, BerR+5ˊXWNJ_;J %$-npr tǹpLVĪ{@L"7 B|ڰ7Jdzc*e Kd=x|4!d؋(A`_os[0H^Lpa)1P 8SAs6LDɢoÜKŪ$SDRIUW, u@:5WʬNFGgi<YFP`1%RIb >sµg1{LB#}aD0`C*Տؼ'/a9H}d#"4z@c15n@r67& ZX06Ma]b*ß6.Ql| ]x<ED0f'Bή_ 'h A3w7@o|/J[seދ/"RBmBk>&l@r,4lg踱:eQǿ Z<#(t蒨8 PaL,nr'np8 `:*C(H2VfS9jK;ה'"zJzY=5@涷 adPAiC'%Sd}!ơr3 w! 4qZ,.m#UޤL# RC$rj72t} PP0f \KT,n\ĕ,D:1 7ZA5EYL\WXhY8 `LcNBbMfŚaP֗rIo&DuE:u wzt?3E Yzʞeʙ E"戧IHse-E k~bdB"=8 /PN,,cp]!E˛A_]YkHFTme俿56;6~Jz/cY P=Pk,t֮Phxz$N0:k[NZ8҅s ~7d^+q[цEopHG| ?>=>MJzW=C~4 ϑ2"XAQTWv)pHwã0D&Dܥz݉j{YRNYd\̽;eYM>ܰ(d:hU]T+Ց+Gi US 9pmáp&, TH{b`H'I,mN\+0cjDߖךt8*ݲ` gi3:^ƶS׸?t^.Iʇ6J)A’MwD@CciDړEԯW,;\>YmJmP\Gp %^z'&ggĊ1B^"i_] _+.s>:Ȯԅ)TFD<wVQ⧌LhKc( ht]`#9PP"5Eq+3|{}":L+ W'~ p8i!gFNYX'2F7 3'qy|JV`[i 6o$whOk0gz[6jG8Iۀ}YL)]#z)|\{񖃭>ogNВf/`zC^!keRFBDtPbUZZf2"bflRyIyGY@ 1f1/TM Wn`~@ 'Ѿ:I-+rE`a |󗍌h 3%'"p9mi<[ٝI@z u}!Dގj0"kRؔ <像v7|?9D 7G`aacB5PAza\J;k0fKc58X@/Nؗ@8y`>wo(j^0}G``JU k[@nXg :؉pH_ v"-* Ry%κ1r0H&ʤC2+E|q/Mc/ njA&rMɡ?]5[9qNe}ᙐcp qF)u.u`n)d`Z04 ;[A ֫ WF2!,}jQDt9fA2 ݬާ[5+(!DN/ 23`;1cB\zAqMVwWmmČ)<ݳ.9wHlv*%i;PSBQ^DׂLO_d_P"X{#q w۸D F^Pf>)2˜]8 ;j\ͻh>+QSbJ3AnI`i{9Bc`8mam?)ԁ)QͽiC9e}6!BƿUzelvZ*t>jBlc|8Ca 369NM!jw5Zķoh5!뚲SrَG ߺ:.DfFFpEKҍ%k͉?յ;=2Ʌ܅( P B1Py8 n (*D bڣDHK(jczl |K@2khidj0I1:\Ayo8DHҕ\#(jwiR2eCR#t$H\܃ݹ [H9Q1$-Ps\wO%3(vׅh\xskؓnhҚ׵Aq:Y+ѡ߈@rc F#<ή0z߅(}CA,s5ӌសkUOClml>#S~p=Mxr7y'Cuޏn 9KA$zhQ"mτ>B8%0{lmp{(3pTfT'hbC:Iɉ2o3.glORʫ[}X0t7ߍdjs1:E}nv5p1'/ V['5Uv@}$bhPtjWV&i p/J>s*+.} wdG.f ML.w&E06l~A;9}Tgk뽡x:jm{z``-BU^9PZ`iH4Dђ #C`# MR楡UwgP3Y>C.d+!pU?bZ(=GbBpN--*s, 2(1I lp] E#|c\dJ4n\rіO&nBc{h7 |M=hcYr#y7fа`sS0}1ćHLZ(8d$oo D\b7Qs!^$b\ ƓYB~;XX= 'm G7 f]mC48.zm"D-HKǦO{,4ڦ{HٮF*"0px4'JUxIo!*LTee1.L.֓S`MO+am|VYR'_Ie*8@v۶R8JcK[-"}e*:h"ĬANz_h[Sax*f *D4#]U yA.pdsêђZ*Gڀ%C%W2UU?~N5r )گ ڀⶦkkvjmB^6psc8 BW'JM\h 2dU~!;D+$"&kuHr;1 ?L84P#3)j07-+LKA[z'."fG.܏ d lKO$ޚ1PWlzT7,xr m.8 ,8 on[a\]םxi,RF~035/\ֆxL]2Wpvclxfd!Y3QSCWdPEEo]p7BvBb[vCyX8\ӧ:u"^?t:vo"5f4! (,8dZzrM׌rXï(v?!@l SƆivDNɸB67n*  ˼S]@3pCMJ@<Ks'FA2.$'ǎOLbDó;@eGqw2fc*,fFהCmvƝز+P:VBdKwB?H"C cclq0'ʢF_2d̰z<E u R=o Bc=hqXeE` o6뚀B <aNKplCdR,YlH+O,B-N&jBlLN670iL9D1,3^)܇.CV?1@5d>$SMB|,ݷ F۶4K}y%T=zjc!9fԶľa9:!A8^}Nx0ʕ07qUN:`t%N{#m"3 0 >ͭ9lL(ٽ'H?FOEu6Ȣn/eh- KۅE 1\a6D%Зu#r(a(C)(["zZb7$g 7Ggv 5A4 Rl OW@}an.%9NX\9-y5`%zQ E1ո>,BZdTܸ:cF0+>L)eF򑮮{hR@!j)h1(!D_XX eI<7xrN'o0R[NЗسM 8CYyu]ŚhzN x42x^O- (b@"a@ԴG)cH$'HJC&,~+Rb[Ztp Q6B2C|SBD4 ~D%V\3NR/JrB@_k9*Y oͯsŧ.`,v[ W @šQ^ -BX:y<6&նS;dbt\2KTpA Z+1@P'Bi|j@uu_MGۻhy!NXhF@_09Rq=7Vu!XpA2,JkŬX B^ǶXTRTPb<C ,:[RSMXL / tu|5 8V%?D sȏG͠ap;g 8 O5l Į'_)/ &^/D"*(9C~s5C俟"2Ac]ac­2{ "C$4rix 噇l$#QXzH5C+X;d9ҏnL1:S  g,t%,[ƢʛT3v>:oʻlc'}{_]IaFV8V_WqUrF-{ ^ I0Z7zIh|T"{"׊4y.1Mx)=]PZEߏبQ9-!'JU[8V)y4WaʈW,D1 MѺIyZ'[I)>N,8.<յ'0DÚ}Sp~WHYVVFO(Hvo77`Sv dSqRZYkyKS+:&+8&EgYx ;!B"0/SE/sA)MXSIpD;L]C4HՇeVv]9AFrv0x< rؕ^DEt jBC[c;BR~3|5,d wҢr&=@܆2f% "mbk9 "h׊ Z{4+>'kOz0 Ħl P\V)6@i>XOCf e zCTwgY^0@ y=¦ =(J0x ǩA lD8qOag.`qa`zoZ#̀oZf%lww B/Srb~"ugh]l)ga[+&vc~a"|DT8Wg[>b}=eZr Y=ƪ<9h";wOMRi UMM,y([yt RDl!?7!í_ZDA\o~dZ9xeȦ@U ҕ`djJ] Cw- U"1R -/_>Qgɲhh$MNe} ㅵiSu /|ONmWyG4*e‚ZQOD G>iWA(~YTZ[ G45]Ҽ|#ȟ> 5EYA) }QO08vJ%!/d#FHa|*c.]+@8 .,*<O*jjj#,40IWp+˪Ia+E>nryz sn,zfE^D׉&w>X5U)͡3A)5( zȅC,,n@>9[uE" * 9 q@LTnUk8 I$™+/KxVܡK9k9+SXDς^ 3e2),<lJWt|43섀TӠC ϡ\m r}3i)d6[-GuASY\d[78)nfݝiRс _~-bt84ܗWzpUHIeRR Wޣ^d~}7/%ďKrgéMe_Cq~asli\7$KD[5G)p|a9_4 DDIS`2+^CA704(!"Ŝ6"qwHm!5P>noұi,[!F`tl]KM {5ȳckZaN:{G. t$vG9x(f>,6r(ȭjnr¿\5^yaG J 6ꜞdԼxEXbPx U"eZoƙd0t -df6u͢^GX1LHv&h[]0%bESAL3):f]ġխt:rK0;?:չ!tV1YJ%0RecZn@7hNQqxf0Nt2t!yMQjE\igdsn]?5 Jϖ T$[O ;W3;hu 57np+Pq%(pP79BD0hR>֞g͍LH6Ns|HdhѤ6Ӊ5],]6לJT.![a "3ƼCgMWq`i0W s^kҽC< /8)H| |'ŒSdlKk42{fYۊ%hv2T5ӎճ$)8\\zG;-I^d4#](ײNCh f4,M=@a O,ȠMhN&Yh}<2c7Fq_ہsǠv|pZܦ`=P2ZFޛq#Ո,i摶PruY3Lbo qj/m V@DVʨ"tL1 AMه,k=ّt^^dYQ`HݢpW#u""@P@i()l]<3y倿$)NzO@q=|/H@m?p\0PѸ"a4XZon?n?? eʐF?Q RƷ%IEj(FhOpJ,Xn/밙*WBL5J97Z}zvܬ<HC% #3$IH4YЅ"^& 3i$mV|Crc֑)a6˩0&en BLa=DrU?GK K[ʚ ?rD)ŎpYtRIԓ~uRM0(~^7A,dOJaM l}H+P[a|ȬL3~H @e ܛ_T^RO:s(Ohlջp/siK0Ul?AcS 03~D^Ӧ ^&ǰμBxˎynמc(#ih)q4g'ph­xY;#ߊ@K.of#Mx{o ?%eR1YEdqRzPtv?kŎzhD@xP/0"Ł|n9%)#"RC~2#fhZN̬T!];BsPB-D x+pr|2=~siq*G;HO^=B*KFG'XQUmNַLUK%zcЭ:oA(:|iev_Fr8Q'+VCUE)I =t¼S4XR̼CU*ENϮQӮcW/RfvqRF̎eOWJqT* 5cXXJF-Q*+<?q jVG0|i!?݌vk3}&R;BAiEP\-g|ӈL28i@5A8Yܾt .Eiug(h> " t3bpV&Bx6hE|;O9&qp-׃B,*O4%R\:bu+c&[y?)qm!A !#Ȉ " 6Н i!`YbΧ XoϙF/W9w|*e|UL酁yRI^3}Vvu쟳]DXh0-πԈ%8 _g w{/"NM7- >N@S!ᜪm1GicDAZ2d3Ĥ<|$9xH YEi]gDl :%v/%/EHN>Q/̪`*[(7?Y6 #S!N fk_gm_v bw *3 ;cb.t*-%f' 8d#"kɻ4JVZve:2pː{t`\Os}W8t:4;Caw/Jqi{@5lC߇b`}'F~1Rkcr{C薣@Q0; L!՜%R < i<l :12,D2n'2"v3yC0 Y`Z7<_}~E&neh ej#XV5<C|++ݘadD#0=PG:tm(J`_5X 7)s*J(ya+!\@ >oQ(L i4!D\$?b ! 掀a#i W׌q4lG;Oe3 Ad<=#hE{.-4yw$sm^=TD 0hgJN:;4J0/(YiKpG1{ ȗ r 3.vXк/ '7igkLsKho.2# Q ]~S,4n㻚ˬe *%Tm %FRd`F:̀CS3?,aC`S볯J>:΢ 11o6"K.Q2lr\(`\5}TSf2 Zz ͩVNfvi5KNSi|o,S c,h0@y ׬p4<>x 2{:A{fȈ..(9+ i_V0]p fdqbEjYh6eKiȂ/f\o~r›`Ӈv7U@ĘBc!f$ۺ[7Jht 4[fo1islNb?ԔG8!8K?Dm*`i@SOSpnt9\ Cy ?"-"He7= @)J!,[2v'֔RH;ͧdh.cĀaxFY9eBi eb9-lQ9/+,lQ{22ی3HbGZoE|Z?@+hvd$S¤BY+0Hu>1Ҋ^<{do@؜pf_Jo??da=S[d|L7cd{3Fyw˪/n_HgiQ*s{ x%,Owyg^F9,F{>]2< ˃5\Y 1 6B-5/1eU(u Ŗy`f ٧=9-N_nx<&=eJa#MfB{gJ3;kgW{;`#X U|ŧbB3&.s{U_lHN k):LΆإ)шTA8B uLra?Q2ꪚ`ULb0DBZu'{jܨr- =˃eVnpB|Y@N UܨTkF[Q Nx xÀGi@dpA&nr]2%^֬x/E"sZ\]H[gVl#hY+F$Rk'RFdXVlڽ.075;dĸIn0Ӛs4R)i }1/\-ظƊ4Z>H- ߑ[N` S:˜Y2@Hqp4Ȁ;\4V܀vE3嶖}nyEq`B%a?~(q䢨GH1k ^R%f-euK8[lߺMZ?\['ZsQe/Ra~@:!X_14͔un%P5 bu9C!zΦrt,8 kܭM,Ŧ%ժ4Ft4\+#!/xmd*z݈EuÎwsq؀rj"YNOy$h|BhQp{"(yR +!On=:9?H_JyB}k*[P74h)TerW$ 'smO<J8 $=SR*gк@9P)x<3_X/kr_}>cޗ˜1v3NuO PIDx ݭtE"IS GuT! ezvf K%Rv+ZZst:jac! u{\9g[0IZ[\T+ƕ SRs\0s]]UQxL<IX]E\b ;+qBH)OI1J`vF*=ws{ 1NײaCA8 ^ba+0 D/+\;=bcE7fŴQlohHSO"^_)X#=ԂaAP c=$S4<τmomy:޿i?J @&!(V z"IEgx$4ETBXP ;}b4,#Je`RDXA{3lΤ /|pf蓍>/_@豇 "=pAE@\dqJ&B"ߕdOM\h"гsy.5An-(3Xy!PGn>; GxJBp=dOmOLRE*ʪ1Vۑ _VҊX3!Pל&YF%_SD"(楈:f_C[(H>).$@ŋ,yLF}ӪfۢA8Ȧ] ]_]::K㋂a쮨:!5b-91qqZMJD4ψ5SIz %\A/aEE`>;Y8't%bk=f\o<|!dT{C\+20)O9 3ݗPb/a 9ͯqyEkNl(qJVTe@@~P j9!;/NRfTjcʁ!3W&# `R.J3iRMHMAJd?X8-A VzcB)J7c C $:rZЊ8@&OI߂pXB g+a4pJ *dR8>9^i09^ېIGceMl B<'оs> O1[6]woSqi/O/j-=v[,УeQ&, 52M5 J O,jk.Rə6ˬVq^!V&kW@qaP <^b ?;<7Ԧ =ʌrN)Y.,-a8Q%,\ l H aZFEedB}l]@i&(CʄLJ;{e8;( *@*q wK8+`CO}tH\4&2ξ$z.0@NGo bXu#lc2$|ӕ'$L{PmL$:KG)Z`r#- 6%>Q BBDMlQBw[eJћK S9O4f ų  KAvQz UHJw\ w\ll~ݒHd)JJ(=4 srN,% Ā( b%Y:=oLpGF ^^׫{}%O%5`Q{ (ʮ=רKz7I7kCA!~BMNQxuKŇAlp+w~W,NʖEd-LUD6ϋ,E+OO|(e ۓj4ixehiU9G[O2y]˸ OSŀ6P7j?Z19_̖;S64&P e$u6Nm ƈٞ_I^1V L#S$T.WN 7앯po,p rXT[1{"AЖE$tY竣UL3 1Q$G>@b4{@6a8~GdVfu4Oa,.bn/# >i1舞(̶!^"G0[ YW)t" ZI\E}Aks0ѤR(qϓPldyU!%P f?a6%Fn7JHX7_xcScM~Pr1Qju}fuނ~® 'TeqI^dP95;`x %:E4ؤ\D>^ SjIq|eT.2D9!LoHD"gd\h";Y;\Bn>` h .s=epN5ђwӄd7r P5#axMɀ3coLDT g|pW[l!5zAP _N= b8mߜ!d)B˔F9•Lpẗd 0+A$Erӄ=1s=tLǴFՒe7AgO8rdM,G`j|N.h͐av2E͋IåàCDP|b B2y63Ѓ$-ã1~R3*C xkk=TO1c&z!ŀIwotb$nwo @fc nirfJ\ƐXK%v wN^p?8,kP_xyIt; i;hI7oH7r(_-?oNfZD>O[_tDш<(5оBf߇9Hb'fmhjp{pc !|Qy&"Č{9v+02$hb8Tb%X' S\NGm(0*Y[xd[4MYvj.EA=l.S4xExn(b4X̀'Db D.$ 6H"1-5 PW";}Yr">U' oGtard2ב3'ax .bش*k}s_zIgJspc?SB&DR#9yQBwyFc.(8fH0M-H6DwIl.D=<HX5_K&BAr];13'%p(uĿƸu?nv.Jd`#+'.`i\lEMK62ݤpU OM3aZ *+>-iIM{d=hNlt}0 3aK1z%bfB&RgE *+?(:D%uڈ4MOx04 [,1} pAޞ Ø)47j77N`eKz 1䥶aA=X B+JCjAbp |/R=֢2;_T 5JyBԁ94ҭsp3鷁#&fs\Oj+Vw!ejK@)9"0&q\K-3@FyO:街`]HC0[bL:( 5-ܘBVo2^&;XCKZ2_B$ a'Kr!V埴F8 MXE6pl0hQF 2_`91pm ԂUW7 (;iqV2`_7)ǃ.(T'ږNi P(4fo@?"l;y(uItV/ohם0{27[ Q#vnNa'(#~@m޹\(ׁ?3{4"[@L)bYH ;XյՃUG? I㏽)a0+[ZS4ө%"iUD'\sx }n1a d&pa/G%@?pNFq[uZ Q';|nў6&_3a72&c5lZ5'!i3,KIBɒ40#ƈ@X(U4;kCCGƪJcCrk ( 킼%ʦBGp λ}N!"uRD(@JH*㾻 \֛v$ȬK61W ]00yO(r"Snz7 Pf%EK=yG]6L>h(H$_+h tfK q5Lvhz pi8UI꣤\#+h X':ÌJ3E4u<^nyy7ݑg˱3o~+$[Xh|ӑg3h!N]m.*!z3Rk04ld66q?k?~d`pIɜYܦu1 NU!Rr=BPI>O7?b4u&i5 }{n yx <A1 PKaEj$6h 1.Lli#Yu2Q>$Q")zEly@6 QV řbBA*Zv[,3:{bȥ4Hؓ9b_,U|"&d߂[1a~䔂atNhmDIQd?_^c[-؂_/X|S8VR1[8D^XJڦ .: Һ*80zs%InmM1~{7¬(Q*lb$BY4`@oaG!Lga;k ~9W7 1*FNYi7,вBDeOP1*ҵx!</yAg+^T$@fN8ߓ⅀0J ]GY偒Ttz qew4 +r+=o(T o..&Uz-@LՋUJ4UJR$t캵n8>LɄd%yľXL.簐}X[ڞک+\wՍKs?Y"c3vGxL/8:M#q?A=.|M 9n{,S`N*o-ⲽ|6Zrr"ɉc7Hopb7IY H as'va,@N̤e]=TD9rq'zz2 fOۯeS ?)l3[tg#5DƇ~zQ1,xȂca:!bѱ,(z/ Bj ЧYSC:# e>͗(ޕ\n)!,"[ T),~I'n[L#b0MO3G"//β\¿0ln& f,Bnh=4p+5R)ھN!x*379œ{THHº UzIPi3ZMwRSbu͹TDC*з =%BQ}[`QfG9cj]eVMv RG^d}`3$Q{rE<+$n-rΐ_z+NC ~1:PSogf84H vBaؘz\  doX8jz[IЦy_mZ(y_Ա|vFaJaY84KԻ {}"dA@ J P^_$]w& 礂|y;6p6ԝDrLJs_ sVGˠ5>;5~NUZ)`o%DYjP8 D4rI|&w@!o.nrE^^b'R`Em\O%\$`3K"?.94hlfbZؘkըb+I|ZEhBP0PR,5#w;orˆ;8Θ,6؉@x(P'$ Fsߎ, Jp=7q|,IJ/<{;rZ(5Ƅ;B]u5p1Hf,E,/fI3)f_fVNXZ݋(C&-4:7¥I#8P*HsI\y4864(H Ob (dUm/ Y&98 עm)Ilin_U4Sj,>[ƪ /%K䢎sH1~rI۔($EHa +es9F0/7'iJ ~dĖP>3)h"IF]bX NO!9 ХP飏 ` NE%qG1˝:/,Xr#Z+wʺEǻNRX͊^e5A& f0 nlKQ[Wq]3ӑ435MNQsN/[Ye0Xb+6I4F$70=˦N CtGؼ+vޡQPƈcaU13lx?⎗te ZF[=Os'hlCrSVLۜexdxxs?iE7G uB.d:؋E/m  -E8<;f뎈?WIHjڪ?L .g9bt4`é1ɑ@! I,Fُx'0;b`A}hKe /*Cj+ȝPXq )-6~]ld2-OL>qN<3w{q r9q5 W!No(Bfj=j/ P+>8cqHSq&tI’|^vSF DNkLE_ R֍2#ݙ fg=k('B9Ĭ\C Va)>D^( [Ƹ8!gSpg׽"q S(R00 EؓXHgPTvit}vV38&bQ  #h4Dnw 埍IO^(.X8iQkANR245R.Jw ɜM5tz@^Z۪m[m[i_:*6K맡H|zBЬ,A1fS`$ <.Hii}nqGmhH`1p;ŜY~q ɠxVTd^ԶWy 0c7""S#zfРhC}dشnMw=DDKP)_ñAOJ .-oՄI`<A펝֑(XQ vݡ^a={]XR&%9Ä)ʼn4=ۛ4WE|`8tlowC*Y3 xp % m=;v(0:` fc Qq 0熤eH7 +OJLj`Ưj\i4zj$-U ?_7Ah1kC !{5ЋXZ[mI^:8Fwk8 G?huvPpH6bY^ 0VVH50έ+q2#T` ㄵ@πJLƃ4vnh>+dWu[KɘPz>Ra:rJ#+v`F|^+`z4TßaggL]rl&62]9@t&dYl&$'a3sZ~J#& JvYC^Ox!2QI>Ke&&IrWwtsp@C`7+=ܺnhm^ށ:m34%i;4zz32 K He5,1ÆGÌaxc(a.2Ѝw98D!SY,#<=V -C ՀT{4VrT|DSc:;YQKAX:UfT.$XT8\<#7[@|meBͨuV۴e3B[8ViXi#,5œAh謳Wj, 3Z  Q],«0lCVDڒ$Q7\a~8TYtߎԒi=5LS}=ADczv>ArJ!,%R~xM pQm5@d  f1|Ũ&쀕qi4x=R!¨2ow)8C"`#; "hgsP=hW[gӿ0=^뢬1,. ]vpq VMf߉BN`<`^'t.̴W Y7wd='#YÇf޶K CN,@kEԐR4H =)D`Z=,r: I5'T7kܞ(TLffW+lZ;-<b] yAdXZ ,"Q9ƌ:Iz XmiG2} +8ikƇ+_3hp4EhxNf\Wz\Aʩ(J}y€6'|p ׭XxWψT"4("0=.=5͹em 6 tjٍlӢU>H&,rϋ9G P߂M:e8˗Gj~y5-~PIN'b^:i|eBPU.{$ 6{\@*t  ,Lv֙;B;F @ztjE┉5K(r!fiĶI|H(,ҁV}q3n؆ِġ(SkPuN=a”qR`g )@T̃펖90atW85crtיev]y?0*uJF Y܎4ląZpv䥸C_' -0/5Y5RĊRaVB4KL~$@iK+>3w4u?._2MK@E9\G8^3# ڐ\ Hq NRW9+.-4$O;8si8voLyU lo Ó҉fs#4j1+klћ%"t̗b&oIRj}F(W_Sm& b}rx]ZBFEsuWi}BygC MuZIB&TbX09 ==.ɱ9T%.hȯ 3v ԢJRrM1gmS*-4@#\^O:(; _oῇXE`pk7i=D 7RhLQ> ֥nÇ@7l#o֌w a8Ł"8&aZ(/*) TzáC+PPWc@H:.SrВw*SګX: %[%Vz^H?E08OD݉j|oT H>~UX:PJc-xi2`1 ڗ-B7Bzc0J?;\'{ArѸ`U>E&~&~"4S9us2a?AYUbJp@}B=,Ns$/hwy/^WWUמDfPHYoZ9 MB[H1]5G"R4hC@/tKx2=e fd.\C{-ugWH6$32L*\f8aT% 7s`VYI$e_-Uj( Ҭ|RJ(#S{d&$?5H3X]k*E8)1 %)HN8ˌ'h?/(;B:abxܔuH`ear HL ${Ckײ1a(&m7@^;"&-OZ@Hh@:%*PAܥ$+ ѡya+e˝ UIL , UsoԆ.O\Yʲ3/# 8aOdM ;1RpquPʤB2S 48RDNUu#9˫D,Zu7ԖB퓨AT-VIHRa-zmgaO+ёV?LM X*/)`UU;wsyh~T,b}EB}  Cr/,ɻp,o^v@=]0{vo[4 ~0LMej0p*I"i0]o2I""" \؟`M@Phbi^֙r3 x(ŁfR>m`k=Pne*S<\.И_Uŗ*1kOjb6=C*@kQBcyDePBCBKfv^8h[Lx=Xǵ$"Zndi# 1da+{{Z<=;ohO=$AV㒝E4Ar͖m kn&5cve-8 M -(77\>c@/ސ]^.,^(W`:Aϭ֚&9WxP2ږ24P;j=*]#f^LE-0{"Mh+ob,&MI1it%ˏJ cXɊd0v$=9\s4Qs<)3ez^ ^OնopzJH[ٌfDjI8r%ZSq@{bRǴ'2M#$,ax_6+檘3)H AgԢ b< {02:?;RՌT0C"磐eUOd njɍ9Qa{nQqyoK4T3Sw數ʬ~cJW&`x|rX>v4` k,KWJ;L''FZX-恭W8w*$0&2(61YJ7œy| " k) T:ܽx0ng+ <`Ծrs٧RQE칑~+>|U-iL{Ū Ŋ+Z 3DՙQ^BW]Pr5.YUE'$k51Y0mq;G&9X[~Fb̏= ئa2 B/ H ;Wt+NwFg1u )ˬ:@ZBgf &[\Dgg) jަa .)H'pߤkNAw5&K^h11=O5lL±'l/$+(izzAhTL.ۂŋ@C8c ƛ^eC v"a s2bXF";b6/Ë,mT~][L=2R$@+Y@pW ymf~CX:~T 5 JPB,6wָ˯FHM9Axa%4|559||r-ppO 0Nfgz+1(= !Fvo3 OqFтc)#踥½PmW>;٩]Y SC"YG@TF~6^Fx^?ʎ1l 3l/Qņ֦B$>hTA@ }`3 Ӣ kx&\A^+>aM^u" @[ dC]81 O籰7! m-->\LFDDĈCշN bK7E@nlb'*ɕ R[T&*)c KF /`E#w ۯ޴@R<;,(~qaRMpE&9' ĄC;LUU0g7^XS {et)"o@"qfa /.#b>CxI sɓrsGT:a#h+ F!N@)ȝFnIwuc3qIixk{Єc{mcFK5/f:n` V<Ȗu8k[jBԴNPr+:1jQEe gF.6{&F(䰂ʶs״hAYFMM3 $ =f lN+h$^2ܾ\ +Zi-@Wj/kk-H=0gUni%k1`>HK\3*K|1N@67tN&[MEhd@:owIce?Zs ]9^MT`KxYX doXPu%һt`>Fîl/- 2*`:R>cE> gbl|bw4h0mT8]-)$d'%>o(1*^EaG֖YtFj`>\<:W ^'fb ,erʏ!\}5qGr͎XfțlMgM=ZT?_c J:=rH$*5t򳐷8'(<& 0= 3r^I.TύaR7KZbc?ڛA< oP ,(9Oe1Q,ZXLN1|p C/ 2sy(,DDN$cM`OuBp1/*{/:Wdג rVxW*3~S)ˆQ;;'5ZxDn 2pc Wf)y+\NXöNJ5zl^ X'IK]`Xe>ܱ?^;JKw/gZhOώvGbmIh'kDObHWض؅e.kp%'I BnN"n$_P_AuH+-@=?vu&{ޔ`?N)K"Hp| B"E3q)+Ґ;YvzD>'2ƈe>>:uY;Hmh`Sˍ`|C<jse&y5'bgV%."YVqVu9K Z]<#a} ck6Wjއ,,dN !M>muV* "U43OrG%x+`xJlہmhS0A$0+ G/mx*2+(mmn.4>ޢ8<Τ1sVd<5S7WIHP@g!RCx ق`Ywޘ ێKꮕbxB~ # Mr/ EK A8TL|ks\vl2A9w ]HtKk՛pw!Iq1;gbtQV*'瓮^[]_6-mעρȲj !oi.cMMoDD*|96(+?¥l%"zɑ#C(>xck i QV 6+-KfϽZ82;8PuPbM TaZ6}਑NXDUf?V[2c(*0J 㝙1)LvU<j )^Y "95)T!@DE *BCya<Co\P1Uls좾MYD &=62[dD7QInl,wkP"GHJaegf!M䣱fpu֫9Q,0dTSFni)1`͹w-% RXB.5̒=2[big!m3T?<<5lnω, lg,>΄P-V\)-G]yDY犬CZqA8 1.;5I=r㌉8AYh]/J{2F@.Z&r9dqyaHeQϑVר(ҩn(ˈ뎋<<"olqU+?$i ݷ͞K@(Jvm #~ ɡ a 77xWLV-bjT7/1bJ%ky/6fj"xW9UNV'!z3(U0aYb`TOt)(tWIi`,wh(@yoDȚʉ¡NGRSrpR ɣ3Vg6I M{@BH nܽț,O\JrJ嬙M2IGdXUӥEOQu>lUnJQhRa;b*lWHmVIJBjgNEqt-^͏}'آ䢦Z0@*B,^%s (ɑ<z 4T8[X/] D@rMm~驡_Px], 츻(dW-ycI Aދ3WC9g@0jҁ @mA;\+~3s`  QA@2IQg kK ,dC@u~ӪL2Uuqg $BN#DE{C&5k㯵;R_֒[1uĪS/ e:nQƋ q;p1ker;. SCxA/G vد2cX-P`F(ᛦU~܃k$@%F2B<,t|b$ ٓbE@ lWVYT@c]%TO0tl@b3R=b1C"S+js~A`dcAnR 1/@+5@8k 1"%&!l{&˜[TDQ1itire)X Ѵ1@kFh`@9G k(CM IPp3 BxgD-zc.y)ȽxCжз['X.d50AL4GL|_E4|h W2Ħ\CnLQ-rFE}I~jw@0jEOs%yQe+#s C1']i!apL69Y5Ծ=0!Y "Y8i T4e/sTL3sOjBz-?dh9xΥ3,9ЛpC[Q>eN^(Hqqe$;C2^֘v^Ej5,O3,@LOh7eQ`t=M *J4+-*'b]~՚ _Z4׻_kmf3W¬$᧢jug#"_حpalVě7CL9* 3&k6W4}۷BmP [a /i"7co@(!Wss̗EIB^HA*`z/$6[7 w p2sGx9{C䮸RFX܋b4n0ٱ9[iB87+Ve,~l@{ 0=jfV36mA91:o6w\ ً axJ6<MӛOu:Rh[ApˍĈ|Bnl zf5+ jOC伳IK)%ί\hRo'_Xl%Jys>Z%.馝ĤNáQI0 :3]Ϝ>}&@KZ'5( $R1ly',d5|WAҋ6P/ڦޕyoa= q;hJY i(nZ㹗\n71Fum >mAf oO]:vODbQHݹpށ6톈;Xb'~A(q9*P, @3 ~jlv<6~":~Ź"N@ݤ 5Glx)"1mbd}st4` Sv[iǝ\KBr d\}M~6\ y3kp=`ˎV`l5~\=G8ۿ|`uMtFtV9Qh-<+,Hೊ;%\h ҢU9YJ3aQBC8qBC>.x>~ˇ~?p"by&B@Wx`c6B"-fo& /i/[;>ca8pt/\5zq9TY5Kw!#]RSs G,]zXm/E /Ҭ/j"-%qA|E4B>o9H>Irʺ‘ȪWϩdE xbjyđ~i?{^9N w׏2jJf` 8|#o l~T>*l?r]"wЈ ]QUp;,=~!wB{SX.*-">%(T͵l1] 9v@{6 .-M~=`URzj5Hi! \a^1ja~g4FiH6rY%wbu#bs;?_ƒjPmspZԴ̤ OӨ CcK*z1,>ՁQnh >;ԂG!Tc^*Ѹ c  RJM b +|E Y B1˔ Ng}U|C$m46}Z9$̆s1oQ_'v#3%a%5sTi~qS\u]v% J?355@>;]!㑱X , 5Cq&'fxPv4 v_v(bcn}g|;6?cx KG5rSd :\_=L =,ˑdDnzH;7B8<ثq0hY;5r}9hت-Ƚ:;P۳FLŶ728X_8p%~EHm;HMVm8@\Ʉ]Gil#]v> ӵL[ÔC  Ăv `L_E1#P~P,!e`75PHOڪ *#Ҷtt-J|iZΒl*bNǨQV\.fzY t.ǝ{HQP7@d@ %S@(jl7@7$(XK*`d\ki1p,D1#1^5I~SbYwe'4^>EO+ W.9eFkD_n  8JuKfy@hzCӓ4앢21߷ YF+*GTs"*%,: )=17bs=ʽR#WD\f"W@e􋙿B* 5dj=L^!ox4\(^A=Ï'A}"w4REtZ)#5MG@PncwgEELrĆҁԃ_SbhX "INLBBG4mtJ@b7A:Q=K/H6IVYh!DjZZCω̥j8 A^5UD8*ZHOwJһKxv ZO@ A( |\܀s"gM9fBVaq<٤0D,KVP4gnq,vl,}Ƭ|Nj7<~CuC;w^Uahҕ;0U*%)Sk^#L5c-Rn1#jIԍ~hvlE4bzDžHnE/&v×SjMoW"tfYe`(`^A<eW-8K?[qM/{V˿z} !t @#9Ml}Tyh1֪I P사S":}l d>8{IIO7Q?G8x%7x[6bEUX/ TfF-&UQ ^FtK&_kA MD/+sۜ7w{?OO֝GudP۽%$kQUn*V>wwaX"H?'c Æ z%Vs9ca/(3p_l7_AS$ \pT^s%;Ayj(`>4A`ge, >K&cK7Є"h@AA CQ0`,!/kav OwBB2@@}blIe#h@I9N"I(()NUǴ‡vNk%k ljMd`6HuzAZu$_l^=m F#iY`f~<=`Pyn(Bހl @$(hԫr]JtF4d R-9ד!G4j 4K69VPDKQ8h ٦,@jðexG& ^`hȝ C "Gh @L`: 9qvlRA yv"VsS Cz4@Q h?ݒI]B]a?g xKWDDBp_:bF6/T!pH.)xUp/9L 4x`K=O#=îLʴB#F\RFh$j9E( -5hC:U/^iT$J p Kn !u lhuG4!L8BI]/FX:5(M!`A<.#͒3\s>\2DJr$$4, Jãi:i"/N?9j]?D`T w1ӎ! : cFQ)`! yUzJN\RQLSVդaʉ[~B:0PR&[$ؠs.{lŮZu]MD5j Wyp2. juO=}L[j\?Uw\>DGӛPS)QxpyXˍ/6SVM-BixQOjcnJyl(3y?6`N,>uJDbMC8,SQG%n0'3)w= !/fLeqG=eܟΞ_HuX~[XvүB.؎kcnVVfs* 鯑B0q2ZfmRvVJeЋ#"oDÈSI`:jwT1}r85Y4ưǨ`.7 O&V$FT_qʀ,SkQ PF%1en,Z04f䆀o_ 'W΀x751y[SF={WW+m{ClZN0;\ .㟻*^d*ѤI y.\&i:*O_@!;٢ JZ87g5iM' z]},(ym"ǏGU_ $*LyQTܹI2-o`G!_ODm̉iJH 48t)fI`=bYOշJ]%-]w 0 j a]] TZ H,]ό0ؤ$K$6ߣtez9sy< A+j5fun+x08bgq8M>Uu7\h׃d'k &#רZ]ɹB]t;( L^AboM攞g9r ,Ө5)a\(Up8D6M+ieNc@ZU,e<\pL* c6ˁ'/@&I4:NFծՁܺj5=fd-O7J;2wj%Cp ×G4^E H` / V"=`@IWx07Iuj2fCc;kVztC ^W$iwI-@bzUwhH sBծLCk5#JYNPSwwTK{>,!8KPSPٿ36T.XpOyu6e4赜lIp1P`6* 6<>|)7V1+ĜUIb/QÅR?4娍jTy/D21A4ZFGL C:uƏqP~{19@:/MYI ; `{]> *hbƻ-`[,JA& 3Hk=@%.YF*D2(d޴둒-Vw+$آ|*'%{K@0&\(KRgMP^rG~s?9Q5Jh|B(xȣ#AV08h{2xD&κ4WcxRNM=79IK(v@@6ƪ{P!U7 ulLO2^:!n^]rlXAp}] )O#-\m*Ҁb^B&"K+"L#&6pZ!!o#)лQML!K\mMv4 <>VCNe?!:NMea7YqyO Bs˱37؎B0?"0 Jlʂ"O^zZRp%QWC2bld@h|6%yPRu1 g,Sx9 JeOK, ɱ xJSb SBR4.L6Uดk.6{> aᔹ% otϲSԦhI)A9aa9r8ĉץE0QOZsFGF af"=[,f{ql3ч~AatC]z8[WE;meR2ޡF}1G-2!˫p۱t@yR-N|RtC#r2ױ~/bwμ[+D )LwKTCCW Llg,qHByU  զ!VVj'_6+,C11;8ɏ7Ȭ"\GR% pvk7’BD뽱ecqBQJ th b PU$OwD8IMsh9 ^U,MhQȒ,՚ozbXs >ڛ4Vؤ(WJh[Q\c3e/ޮi\wT_4# 8447,6[M577wt,I _{K9A!H7"lmɈ Cnd26wcStn.$Ih'Ը O'{i!Z|x.60Ur߻et~D"aރvd<8 VepE@p)z6NmBeqEBÑ)嚡)!惡mI Vg=*I%lp"2tJ4HdO}PC.(-,r2 dd3IөLꆰsJ/uXwpFKtmd]ŗ*}8ngOvZIa J!F'UR^y/%`p$ 堍eSv>XPKdžgBfH> #0(J  p[:%5;= -*,La8jTA8 b0ݹ(hDk:s,\JFׇ0L%`^~T^"xKWHqo$o*8eAF ? @B|sz^xJkÆeb?d>L(-sh- M5 q"YY ~*$ # 5d*]2]0!_-,N俺Rb%)wrPInxs4d)q\}Kÿ!7BD5b2 -"hICzMwBxeuG[xx KWx`?} ow" 7ֳG%f“J-E@rD=MG]A[(`ŌJND0GjgPnZe%ڍjcʊXo?ŌP.qtiij!.љPy=xJZOwGjHRߥp@4m'N52/c,Io?¿efB]X S]g 2/13C gP2`:an >Y#YOOEM%9lO Мe{V# c4pr 7"}Y*8-y|N4Tx9s)GK<)Pt9U*}7ۄ*\챙,4j #v}efYiJ#(gX=i;lҋJ0I{'pC")Gqs2~@w^sxqB uFR5@༏ #B7[2b1!cG9#zq兵юĪysPE_U8oI< T;KP]ĨgTY9I 1[1O5k `@A446mNrd&Yܥڸ_+Eh~,.;r.DE7m5L:lIz:'[DY蝳;9Ks 'OjDՌPM!!b;,  @!dTF}=М pRochcU^ok@ة9BA1D|?mf猠;ݍ?fdW^aV?In+& NчMfYkM)cc[3EsTZ|SKmnbIX4]~1~ @?Pˑ'%hAx{(eʮ:yE`ƯÎSWԞ!6hCR i=t>ǁu`GHAxuQ;FGybm]W[',?#L@x]h}O{aUJU1L( AlnKO Ϸ@kjB[h3F3pgt2zDg4^jLR-oIC?ɯ;r=%JviM#{w2y!;<};rG u/ f Sy:צߊ?K|WF7s l#I0+/O>‹ o;\P$ПN*\lH24Y6e |# гabJx]0P׆#WoEoB'([.-Kv< 1jEEIdZ*2Ie$)LF{l50 Z*GI`&e\Ŕ 5LWfOcyF`xBûvNRY<#U ]PcHLs ,!'9th1hWgDɄNp3vT9BD 8Շ,A dc{\ɫXEOKP2}wg(-uV8%X \N)6w3X,(+f&滷-B؎Q-s/$5Awz%ND)lQQq}RX*H\O* s֊ݜ(£*["%JXΙ x ȑ:??4&EB hX! ' P'ÎY)w\8:lz բhCՕLTW?,;$ YQsik!c(^bJH /O7z$SrT&U 2'_*沨bV)HuY`NΧYGY10v$ %-ld3vu(8SO09fN~;$Ȩ]102ɚ! n\Z_AjL(Q-+*HWRK* vtD,D05@EW=w1 z͂+oOe) P2&- qβf)yZꀤKu-5s42OnCu ׺:C{5u\Ձ,0̀>;`#Y n AE!vu"A;{@}5Ad. EҺ{C:$OMJ ezT)g2IX~@Qqgl/wxlz"1!g|5J©q t:"ᤳIn|HE|$;EnE_/ .@GPɶ)p PTo+}J4v@YFNl|,$xM%!(3E'FCfER("2ia|l 7#X7FGZQ@>&0/+3jqw闈 rH=d^ r2^XPy՜@w+NXX|/i6=\WBސ(1")0]FD# tjDcݠ|?GkXТAGwGirb1h~!m)-R/JJFl_ƌ4 ԉJ4!RpMᚖZD`7zs̟b0P_wrjy6f KSyĥAgYThYw N> [k6 /f] __ƌ-tAG(G(A㦭~&l^(V 90SpI4WMk|u [zj>DG?mGXtE':Կ',tdm=;h~.""-Shxzt/&CW<-64_bNѕ=ܶU/nolv\A?yzN $1qVBOBt1*pȭ" `~:HFA*NҲ1^E陭"uJQOL%!Bӷ1o CL|?fXA xL2j<,wY *6QtBi lg.^l[`p-HH/ ?Gu@5,)啛W 4r(}.*I H FY7/T0Ǜ*U悀"FR쑏 ;yZ+#}{蠳0dYLTP]pЖ.D\BZ!N2?"A\AUHͺ)*&O-v|D)Wٔ[H͔-7yƊVƣWQ26Tb f/Z P,NE;(;5E⸮A5lO#:i\BQY{I#a)A35H+ ao@337Ќ]*u00!©viS/$n9/ Q ֲ}R*"@ZHmBGIQ5/6j^kiѺs"߲If!nYI|8ءk ^ (Jԟ͘vPWvl0!qȵӦ Kug^ <.w E 6Ug+ { fDN^%`rt1c>Y_V"_,_ZQal{@ЈIUbjynOX E=0(ԘFG P<kcQnhhd$Yl;Tq<( q ŷ>B(#P FQV0Bq-v Pt 6R8(RI1#/dW4f HR&^6򈗢jOɄ\ֹP$'z2NE5!> 7 2^ 2I!2&P!r8NYh _Q=[awf :!P-II8@;&X L!a\ 5̨$V6G3t!c[BQ-O=A%"SbWZ,*6_0KPt$ū$GZ5Xqȭo'l - \:D H,qFP\:gp+ө"P<]`@$ ""9إu ,&p\YIX6 M "Eoą!ru @Wo򸓙[a`HK 8Lf\x4lґ@^=80 a ?d{Y$"B@0^)DkSj/1z'}<$Lf ۝ `"BB٪JD 6'!=ULQL!w&[AärZp|ʽt (#kݏ}KÂH[eՁ |ZN$iy>˺%j&%[Uq1Xa B"*vTgCK; m Q N(O&h#!!0w<kWSWy,QCK[R/UU)PO118"&hcu /BI)!ңƦIu6wHONC؞.pr`"vg3W8`ص8:XŽ/Q7:UF_OuN+ mt lxB_ڃQURHۼ@ 9n-e`)"5 B .P-h+ YCߟn|.{ᄀ=U%($˒G3S|ЄJ'g͏بE!הD+A)hr3rV*5}/! 'QTߑlZ(z{7`2E͠J>U,nIA2!38cK "FS[7ʼ>JDF.{Wr?jK\-͕> p#l"װ-$)itW7{Adt,q5,~S+И &CorӃpة,\#Ǔ҉%]@P7VE'1z]Z{._SP֮?u)Y\P4NLO恒 >wDZTCoWe}\9#_8͝6J7A9 Q1meTۯ*]# eq}7Wl9Pbfj`3=eN}6QqI΄r(IrZh̄Bj6FwH]fP d_680@twW&KEFF{z*w`V~2 ,`졢`GDQyod k40ݲx\d*t2C՛F!/@3qFUC 5ȦJ4mM*y4>b5#&LK8s )Rd-ִY5ܐNq2low~ls$k":LD˜ )S$/NA]*Έ8Fv4Wͼ ?ꇏl̯KÆ IF@W.u:@1M n g\_F@S^Nb8QU$-"̙!&Bxw %V!($#vV8МV_X?@,o m%Kkbʲi {)&z~V QEe4tAvQm,z@|8'^Irs&80-LAwT/)M/R;pPK\8JqUD9 ? EᅄM+? a C%xv3q/M`jVb ! P΁ .IB@1 ?~BAi2 !ߌȾ$~_ p5itWf81Lm7 ʊ}jN .sluKx VAf & rmr>Tt+_I2l0uXg+ {^`B?$ s~Vo3'A2ER,"J9F+-d(v˸M%-h~ lЍZS֠3Ru8"2n'h̳ƣ8L:9\󶨗MεÓ]Ɉ{S)UNkP/AOO2%_0 z`Tf;m\zz '-OIA,21xѠ8?N^w UIIȖ8웙xdM~ZOg6`bf%W'u`GS!%ٔwMńl< !.݂N ,W+Wpx4jEw6"g"ikD7m@0߻]=;};w7LeŽ3")e?7S)Z%[k%AsJVKdvˮ,N@n 0Vǂy-Jj;c u>t: -u.m] zK*V ~.;jI٘Г_N-6aza^):Rh4n#<5#羣$C)XƚbbLc~G+֒ T.#"gH"̤8Q  ChWIb=w\ip*63x&>tgojv}(>Lc冘Jm G +PQ+tH'L (>{j<8DR ylG̬X?r#* vc|:Tb}P#}@m2ΫʺubA?}M~lLQnt;;I A1E&,spVaicԹNs\ۜ֬{-A'ŀM R%FkuYC&}:/,WbN.ApMw50-1%'¿{ bK7pn~90ېums:B<6jiP͛J-(fլrj!&hcv+v0D锔!/b9gբ%1^!- lQ>wY5ãRj~_ X [Dϛ \?.),JD">ހ [JАUBՀE9HVy'^e'^ 4;H N9=%۴N x {rWZX"GSdAY5Hj ~;% Vd# lzbE8b+B y<p0~Oom@v JSMoqճP!x4HziT# + Tg?H!iּ?&hƟG_Ājxiȷn04P0xG(i#&9=nL:lLv()+Wjd:67Uh rkؖeFxYro$"3XJa\M'H}h&@*[gtXݹLJ=9Mˡe 8#͊oRpqR b9P"(Kù4&:qq7AyAGы x«čD} 鑋- i,+ n '#Eɵ~C>8OݕPBg Xh>evjIѷ $ -C&Is$LI\p! yCtyo h&>uIpl;P3nvgPQU1JM0_Q0VNP|G^.PX~˙a8Iwhҽl0< rnEF>9/تV(CqU!&XRT%y[6bM` V9 nIFu?(%fG5Ӌq55C_ 䕝Y 1iIh\8 SB%}F%dK%[0S!) mL fG x} @D$l7"9yC%B]p:Ɋ/95$ 4ЭYO0zM4VFYa_PH-kCgˆ p^sqն  FKDrÊ-fFlq܂T˜}zN7⍖Q{F'sgiVi\_*f*16[^^23)QQY8}.<2OO,z*} ( qdv0{L*;3_ad{W|7YGM-jH!}`W[ \ELO$UρbʼR3mNǓqM@“JV|040Lcoe/t{Je1^W$a 7"QM1\ QEtԑL ֘PR9}ls.,ϞUL%&o?Ҁsgi~ Fq7z}L 91@=:ޝg|q[,<К/eKh ?d"Z]|0"X"6j0tI+\^aKJ5^7y)„䎪NQ~r;3J"W,ʟΧh% v|w$'KlseuN{dϰ9U@'8M %]Ǜ`-Ƙr+Mx#50("}*bFbH?72 ﲸӺᰝKP7Ժ:& ^7kH}+bI Z?ߟx@Z2>>GOXse^o-90}6Y+v} &>XMpw%Cee lLE=s6|@!BOFb$0#H- Mc, ;e0ǹb_)Dӵ(졁%;FuiN։:]U,{I–wN*(MyB:A`&Q0oٙcF-cEnm\8 iG5rlٛ#gFCLdU0U5]ZkܬAP2.m_]*4{0pZL^Z9A7l o/"o]LQ `LPە }`@N+u& WN{hqgGw`3ڟs|?S 0DH8:9@!D$ T^7p%8Q1Ώ;yM 62U$ZQˠ@闶v9{Ї2>(xL\-ðZ=PJaxY>ie@ b$>7ȯq̒f 'IaƁ2MR!!%:mƒݔ||l E7#'#mtVfa[2)ka#Xe;>jhAbBAU/!iizC"{QgG< @d:0 Ĉ*wG(Tvc! -KgXre&4Xg? #r,I JP&’+"`AP1 }/S5wB>}{HT!B*$}q&/ jd}Vsŗ51OS5ǬFf#Jîq H:^ uUYk8r\ l5*UPj-kos@SY4@fFlcUiKrgJ0*p3"!XLcG|Eg~d_|iIF75 SVy̞_*w N{&vN8(C3D* ,eiկ҃c3U8oL7&XR(6@㎿ Z(9G:j:8 /F͋]w@;cvYYl΃VFTT1@Cbj>'큞uK<Ls r.= *ySsAF AR>9!hG?Nf1Ngh$)6H uZtK8 =Tw 9WȀe,g(͉h$ߖ۹{fZС\ދGM*.j;w$t94,ԩzH \𛉷{~yTUN ]uxB՜!3ܘ*OL #9j&ȍgd!l/c#DpGO1,jrVo1d5zlKrIv6YÚbG usc Gjc@| +A(kdX**BW(43p`mY" AC6`JfQfGU8.F (xrDv߄3' ~FL@cb3^RmXC`ZFNh 3n:[hd_~~,NWP ewӋ+pQfr&$^`7-xxݐS78 MOV]A)%))T{ÂAE}U>%WVJ?>gǨxH$0m/BfZ̀1jz⾭  @@, ;oIknI<05{?̐ʓ]Xnk]9~;Vo`鞭x~F'0cPUIHv~4`YvpHpg!_P~r`Ö y (&~qk/͵R{r=չu]bF|R;"4PMIR, ;9TK!4WęR{ xz@@RkKȐ#)H!̆G29spT. p|ƃG.=pC|胦u1ÆGQ F2eq&4lqh#i1FpPkv x)PxENJ(4QG@*UصL"Åk"CBDI( G !^$LLq:nDĜ ':gp\faC6 R ,t0A܆6VkbhOO=Ng@ @@ @R`"3 H;@A p `z`#pF( ]A~ 2SA` !Ddh 8( 0 @3@6` dS|G̿ Uǟ9|GWӟRyw_}WK_ G^_k>{+#x.o=W~fx޹w}tdL~]wΈwoF^R{/ϦC/r\nԘ/$ mbiM#an}2l.Fs&d"6&H$a*z< R@4 nMi$;8LsB*CSPZ B% d#KB/9֋$hœÅh\m0 yzMш-|~n(0-SG+x.ݼ4Xe{v+453]y1^!3͐ͲY|DNN߽ؿ_a/Xz#a*"@!>'E\kDpV fܨu;͕XOl_/ 1AF"/rf'#,`_CF$0쟚4lߪRp{(/ؼH*y$T( Cn>ڇ}^MV%a!堌`ljxՀG<~m^kPh Iy toy 5kEV \hG3R .)NPHi5٢F-8MU|6!kĽvdBM$~bǒ5+V&e:dV2+7o '\vl¦3n'::oTgr#xCٮVYN|l\rkՂ)G)A:P]Gu>)"R[C $Nq`Pd 9^If˰_* γ$<6tB"Jx/UUDE&EaR'\]4\p_bsSnQ@ i%Ⱦ/8Cጊ٠8{ё|NIzh%0VR+l|0BtĔ˄z%2IC,u:9G1J*6/3i4դYN c SvO#74[$;?Hs4(P>%p:[7HE:KM-gBJ^DAL ̥GCʬg)ȄXVCAcw7 -ݛpACťe#|yH6:pn^/);*fG_bަI=@3(, >"J1 "~:_p yج`аeZvna6 DyO%#W1?8Vt >rV̙O hdJ-㯀J0..ȰYoO Qi)O@VͼS(mX}]@AŒS ;7p?IQ X2S5PCZDd-4KnAp Ȉ%s>T>i$e0b I& m*,㰄<1/z\)uBɅk;VM&`a 0d=Q[ HN& kt~hU;Aߥ ɖc!}_V4LT=SRHCBD1Dv9Y_9XZ`##+3#aŒ,1\"h]z-#AOStw ֋epaudٲtBVV0 vioo%e$MF3 ; 5o]4xmIr狅L+X~#q^}n23t*vv E45l^0]X33\w:7K~i!I&w:vn;1 y ^ҟ%_g -b-{BҸ B-$T>ؚBiiP΄z6ߡX/!U"!TB~dX& }4IX,srޮoZ]=% !mYfS PRRc:DH"a0|;?@aMą180 4M9V?` >aڛ]Nt a-FE PK!oڽ@abilian/web/resources/font-awesome/fonts/fontawesome-webfont.ttf`FFTMn2GDEF'~OS/26y(`cmapbgasptglyfɁ|head `6hhea j$hmtxF_ locav|maxpt name3<postvwebfaUmQQN wC33spyrs  n@. / _!"""`%>N^n~.>N^n~>N^n~ / _!"""`%!@P`p 0@P`p!@P`pd]YTC2 ߸ݺ w p7!!!@pp p1]!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>322>32 &6 yy 6Fe= BSSB =eF6 >xx5eud_C(+5++5+(C_due> /?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%g5#!!!"&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&%.D.%G-Ik"'!"&5463!62#"&54>4.54632#"&54767>4&'&'&54632#"&547>7676'&'.'&54632&4&&M4&UF &""""& FU &'8JSSJ8'&  &'.${{$.'& &M&&M&%.D.%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'Tdt#!"&'&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.3b[F|\8!-T>5Fu\,,jn OrB,7676'5.'732>7"#"&#&#"$ 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&&z6'&'+"&546;267: &&&& s @  Z&&&&Z z+6'&''&'+"&546;267667: : &&&&  s @  :  Z&&&&Z  : zz6'&''&47667S::s @  : 4 : r &546h!!0a   $#!"&5463!2#!"&5463!2&&&&&&&&@&&&&&&&&#!"&5463!2&&&&@&&&&z&54646&5-:s  :  :4:  z+&5464646;2+"&5&5-&&&&:s  :  : &&&& :  z&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((88m5'%+"&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(@MMO4&#"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=嘧}(zVi\j1  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=p4&"24&'>54'64&'654&+"+322654&5!267+#"'.'&'&'!"&5463!27>;2&4&&4+ 5#bW0/% ')$,&7)%`@``2Nh0##T3'"( 0;e$5KK5 tip<& 1&4&&4&#\=E2 JIURI$#5 2D+v^b;:M2gc]vDEA%!bSV2MK55K(,,MeCM$!J@#"&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%-3%'&76'&76''&76'&76'&6#5436&76+".=4'>54'6'&&"."&'./"?+"&5463!2  2  5    z<: Ʃw 49[aA)O%-j'&]]5r,%O)@a[9( 0BA; + >HCwww  5 /)  u    @wa-6OUyU[q ( - q[UyUP6$C +) (  8&/ &ww'?$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`(@&&('@1d4&'.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^\3@P bMO0# 382W# & 9C9 Lĉ" 82<*9FF(W283 #0OMb P@3\^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 EU4'./.#"#".'.'.54>54.'.#"32676#!"&5463!2G55 :8 c7 )1)  05.D <90)$9w@wwwW + AB 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 (ںR&=4'>54'6'&&"."&'./"?'&54$ 49[aA)O%-j'&]]5r,%O)@a[9( 0BA; + >HCaaoMa-6OUyU[q ( - q[UyUP6$C +) (  8&/ &fMa%+"&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^5BB52v.42##%&'.67#"&=463! 25KK5L4_u:B&1/&.- zB^^B4LvyKjK4L[!^k'!A3;):2*547&5462;U gIv0ZZ0L4@Ԗ@4L2RX='8P8'=XR U;Ig0,3lb??bl34LjjL4*\(88(\xI/#"/'&/'&?'&'&?'&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<7?s%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?Q/!%#!"&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"@@@#-a[ $&P{<8[;:XICC>.'5oe71#.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%S_o#".54>32#".54632?!"32732>54.4>54&'35#5##33#!"&5463!2=uQ)OH,2QS+ * $  JB;5P#@<5Q#jXUg^ (R/9%LI&D,.D#3!#'267654.#"2>54.'&#"3##5#5353@[Z@0HꟄ9%YJ .H?MpJL1EF1&P5"?j@*Q/+=Y6:k[7'9C 5hoS6Fq}kii$ECPNZSzsS`!9f:}R'!;e.ggR44^>0$/. 0$8];Fk;lll ,<!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%@`@ @ @      @ :#@!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,DS,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&&&&a#!"&=463!2#!"&'&63!2&&&&''%@% &&&&&&&&k"G%#/&'#!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"H   ܚ  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  %b+"&=.'&?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*)$(* (&;;&&:LA3  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%EC&&CE%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/4'&327$ '.'.4>7>76 "!!jG~GkjGGk[J@&& @lAIddIAllAIddIA@ '5557 ,VWQV.RW=?l%l`~0~#%5!'#3! %% %=#y ?R'UaM|qByy[C#jXAAҷhUHG/?%##"547#3!264&#"3254&+";267#!"&5463!2R܂#-$䵀((((tQQttQvQtn?D~|D?x##))((QttQvQtt2#!"&54634&"2$4&"2ww@ww||||||w@www||||||| !3 37! $$ n6^55^h ^aaM1^aaO *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=QQ3qpHih"-bfGw^44O#A?66%CKJA}} !"䒐""A$@C3^q|z=KK?6 lk)  %!%!VVuuu^-m5w}n7M[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.?4.'&#>7626'.'&#"'.'.'&676.67>7>5'&7>.'&'&'&7>7>767&'&67636'.'&67>7>.'.67 \ U7  J#!W! '  " ';%  k )"    '   /7*   I ,6 *&"!   O6* O $.( *.'  .x,  $CN      * 8   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&&4I3#&/.#./.'&4?63%27>'./&'&7676>767>?>%6})N @2*&@P9A #sGq] #lh<* 46+(  < 5R5"*>%"/ +[>hy  e !/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+D?*%Zx/658:@#N C= E(oE=W'c:o0a%4.'&#"32>4.#"32676!##"&'&54676%.547#"&5467>'9C!5goS6/Kce3:k[7u">j@*Q.+=Y4%Q5pKL1FE1@Z[@1G렄:$YJ .H?L0$/. 0$8];8\;)4^;}R'!;e.ggR4!8HX?ZHsG;@"$ECPN[RzsS`;HQ.R)A)(-R6B@"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% . j+.=; 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&462!762$"&462B\B@B\B8PpP8.BB..BB.8$P88P広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#"/46321"&/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#^cu#!"&5463!2!&'&!"&5!632#"&'#"/&'&7>766767.76;267674767&54&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 #Q#!"&5463!2!&'&!"&5!3367653335!3#'.'##'&'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( & & - & &  ?   'j6#'. '!67&54632".'654&#"32eaAɢ/PRAids`WXyzOvд:C;A:25@Ң>-05rn`H( ' gQWZc[ -%7' %'-'% %"'&54762[3[MN 3",""3,3"ong$߆]gn$+) ")")" x#Z#"&#!+.5467&546326$32327.'#"&5463232654&#"632#".#"oGn\ u_MK'̨|g? CM7MM5,QAAIQqAy{b& BL4PJ9+OABIRo?z.z n6'+s:zcIAC65D*DRRD*wya$, @B39E*DRRD*'/7  $&6$ 6277&47' 7'"' 6& 6'lLRRZB|RR>dZZLlLZRR«Z&>«|R! $&54$7 >54'_ff_L-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&?626J%o;j|/&jJ%p&`Jj&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!Q +?Ne%&'&'&7>727>'#&'&'&>2'&'&676'&76$7&'&767>76 '6# <;11x# *# F-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(` !&)d.<\.'.>%#"'.7>.'&67632&'6'&' #"'.766.'&67632Z &+\cc:>'D> 6KD3W6,9(<*0-?")/SW7.Crb  :+OIX3'#C3:@ #*"-A%,1U=}AQfO$"|'"S*`H(:UܳJ?27sZy%+A07C~Ӗ5A"3 >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 $1Ol-#"326%356.#"#"326%4#"326%3#7#'#3%#7#"&546324>54#"47632&#"'"'473254&'&54323#327#"'47673#327#"546327&#7673>7&#"327#"&54632#7#"&54632654#"47632&#7673>73#7#"&54632.#"#&'#67&#"327&'3673326#!"&5463!2 />  0@[W,8 G'"5,Q4/&4/ $&J (W" +Tl +7o _7*#) 83 ( -5G8 .'3/$&I8 48+5%7%{,2,rr,2,x-2.jj.2-xL44LL44L[ < J 2)(*(8$e  '+ , 1)H/ 'H4/// ,~i6_7G*''4fE!%97+" ;=4FYqO" '+ , &2hh_ ,0(5N(ntggtnno__on4LL44LL  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];$+l|%!2>7>232>7>322>7>32"&'.#"#"&'.#"#"&'.#"#546;!!!!!32#"&54>52#"&54>52#"&54>52-P&+F) $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'[`#".'.#"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':@vvvMUdkpu{#"'!"'!#"&547.547.54674&547&54632!62!632!#!6227'!%!"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~~`r 8>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|ݧ憛@\ .    . \@r9A"/&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&"!@մ^^^@^^^@((^^^^^^'%!53###3!532654&+5!3!#"3~E,,EG,+ob'q,5,'  #'#3!) p*xe0,\8L #/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&?5.''&'&'#'""#''&'&'&'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$7654&#"#654&#"#.!"'.54632&5467>32>3200?t ='/@H@"+4K8"*!4dtB/&> c@0&=  =_JUD29i1"07 {x\YSgSSW]|t eyD0&0D/  I4C+) t .B3%h#/B0&&03|&p>i +#] WsgQT\QglU ]#-39oK_3[_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%cq33dqpd 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#2>.""$&6$32}L**L}}L**Lʸֶdd*~;;~\~~~ޚBPBdd N.'>!4&#"#6.!3267!!"''.>75>$732̏Ozv{kgw"+TgEۗE0[CWoG[SL#WN,:vDx93!"&546)2+6'.'.67>76%&F8$.39_0DD40DD0+*M7{L *="# U<-M93#D@U8vk_Y [hD00DD00Dce-JF1 BDN&)@ /1 d 6/1'.#"932>74.#"932>7#"."#".5#".5332654&#"#!!2>22>232>32o'Ve-0F  F0-eW% F0-eW%'Ve-0F 0XWD_J-'F]KAuL9!=MtCGvO>"bMOohV.(, fZC&\|h=*1Hz^I((H_H\V,'L0+A56@+0M%*5A+0M%'L0+@NEsH0EF00EF0-?F1%6810A>A+7iQPq "GY):;)2GH22GH22GH2Ft>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&&=,Xq&&@X,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'RK$#"&#"'>7676327676#" b,XHUmM.U_t,7A3ge z9@xSaQBLb( VU  !!!==w)@T!!77'7'#'#274.#"#32!5'.>537#"6=4>5'.465! KkkK _5 5 #BH1`L I& v6S F!Sr99rS!`` /7K%s}H XV  P V  e  VpdQ*d    L     @ d  %RPBp<$H<TfT H R , D x 6 \ DLX*(2^n0|bX*Z >n@jDH. 4 n !>:>>?|@@>@xAVABBBBCRCDE:FFxFGVGHZHIJIhIIIIJ(JFJdJKKVKLpLMfMNNNOpOPPfPQZQQRRvRTUVRVW W8WWXXhXYY*YTY~YYZ>Z|ZZ[R[\\<\\]@]]]^^^_F`(`aJaabTbbc cd^dde,eef.fggzghhhiiBiijj4jZjk knkklbllm mhmmnn^nno6oopppqvqr0r~s"sst4tu*uv*vw&wx0y@z8z~z{({n{||J||} }}~F~p~~~FnƒbP4t:~臮P܊2~hʌ,(Tԏ2lr8ꔪ\`\.̚ ^Ɯ:؝݆0ޚF߄vDjz8r,d2pL b(< P2nrrrrrrrrrrrrrrrrx'@ ^ ^ t . & $     * < D 0Z   Copyright Dave Gandy 2015. All rights reserved.FontAwesomeRegularpyrs: FontAwesome: 2012FontAwesome RegularVersion 4.4.0 2015FontAwesomePlease refer to the Copyright section for the font trademark attribution notices.Fort AwesomeDave Gandyhttp://fontawesome.iohttp://fontawesome.io/license/Webfont 1.0Tue Jul 28 11:23:12 2015keeporionFont Squirrelx      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopq rstuvwxyz{|}~     " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefuni00A0uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni202Funi205Funi25FCglassmusicsearchenvelopeheartstar 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_614U`PK!vps==Aabilian/web/resources/font-awesome/fonts/fontawesome-webfont.woffwOFF=FFTMDn2GDEF`'~OS/2=`6ycmapsbgasp4glyf<"R䨢Ɂhead%26 hhea%!$ jhmtx% F_loca(v|maxp- name-3DYTMj[ڥ?+t:.^kLќ6kK/C9PB5lm죅 ,fIX V:\^hJעZ-ѦUAX@yQFc ;h 52e-oE+[sܪ[vK[t/ۣ'Zݣ32-/$!q 1y.䩄eHB 5_/?;w+/ O|g|dmp,o^(߁ h8825M3['xڼ} |Te7oL&̚0kYlbDQTąQ) TFT}vVoEj[j7Ƕ~?[!?$$2}=s=<s[9DxperAyVQxGs8xX"MEpxgs]ղ:hɄ[zS,$.5n *F$gۅfyw3Iv6 ۸!jC #6{&]v' ϫw ]CT&_uq$ ?_u#ZIZb5ꏢ7z׿F'pq\D%^fF1ႱȝN3pd3nItz`ޣm]K> (f`V trf7_;--نofϯ=]W(.?mڴ='"gV>zYgێ<%LFwԑNhn1[qC§ ?vwP:䡔x!٪urՒpxUto]?܂,>!AQ U(f#J&VJt(NG u57N ~;UUMYgzmSSІZgDبN_KWSգDr;&o5JkWנ ]^fjY؁յ/L f&>0\ !n,@Ԗ  dn.O,wm 8%7@ݷΝ/`V9 Y\}#隒hV.vspqqB:mF brf 2/-4>c?[}GlgsQoan4FʩSLX$BUC9^ V ?=$IԇRsX[<xz>n=fjи;K/*⨓LzUM8gᣏ1,@inj8Vcή9x;e>83$h)G=o[C=Q{m ݁6Sϧ^(ʑv ⸰ÊĆѲ~l.GJVTJ~hRhE 7k:-!mnf AJ7syH12(Ȩs >֗ Cg?T!inIssmg@Gk@kŹjޏҹ/ȥ)fE>Iٌ% apZnM]'߫Į6_V6mزtW_eC5P|~OєN ߧzX. ,|Mrm˚-+"۠1۠PG.R H"ȏ얂(e9Q+27nt0}Y B;<1* :\ A>%H֨(jX1R4FQG!-&agg=j E-H ?ᓇćmo(|^ɲJ,Diw1Igo/f|Re{sc߭MYbc07&e"&!rrO6ܢ7^1MFښĴZ4--ӗLsÖĆIEKNvvpY FfpK5~Q5q^5GDiA8)%LQV+C[.o'\aÛա"ۯ1Dt?^hp+2epY`h Ū[pAuNqf@! Xr}BMiݝ 껲wv-Mdv i 8t_PSk6%5>-u;;f(Mhё}V s,Z?X;8feCJt|õo(6:ﺆuϨ?W [ G!B(5?z-Q30tOps^`) lYv]^Q+@8~p8oX]8h\jEz"ZKʚ:qi6MR-])'ϝkzEV *VGn ZgevK k#B-]s6g R(zo@pG0jv:cQ|}V4&K-!Nӏ> YZ!D1G5ןX1_SSvfƻPzkC=vVsÉ['~+st:Ci~A!FAt_Fp!9$4Ғ(HH/Jvs+|Fy.~4p40BQ)yS>3bgÙq̠ͥdHN*_ ?7Gzzf4YO?u_y]Wţ(aD@AT(1B6ETg,t Qo}j.Qa$Ftq-gMB=ƅ(ς-~ZC})談LP~458=6XI,Mڍf1[Q(-.I\=(%qrፋy\"3{GχyG:-.Q'G0CQ3`5 ẌMp;ɂ5Apl:#o>ܪ-gu-]ht[ 6[sHnBzë3E~v̱j{ɯ]!S}P([06p^`,TjBw-|^#D󐆻 <|G|9W#9F{2HA Ϲ(o >]] h =bGQ®*md_12DQSyJ*ӘKoTKGdM<x1m޼iwΣ(oY, N(g4Q3GC@y DN$RH1$}6Jt-5<}iy%xѺaU[Eԣ?ې[ԛeHn͈;C!Kȏn;G2X=ބOZ$5X cZ'F,9 6tǿEpNZLow,%:]N/丈+S$C#pGaNAVDI4H'NH< {9,XCĦYvmHv\7Da( Ň-I߀~{k'n\;+s?)L٬^i syCdJc5۳mf̉'k7{[=V?ku&Zάx+۱⦾ԪO.~9>ѥѦ<]9YBY(n,%M!-HCÓrEn!:ϲ`gF6#ObE ~񦎶w$q2v-OXͷv7cPS1r) Ui v/BaٹV;_;%Kخr7%\V&chSv F#Kxc8Bh>va~ );|FNaJQgDCvY|5hw耟=dIgL/Ü 7:-&c!VWSGlf$%C@τY$y{a t(ɒx_ʮaEH0:OY_<#K_}v7X;I x-M܍qMyǥkG1&p!)q n׸ALG頰AGi]c7NƎ$bCN t:p9 LQphBaSQȻT۹Bb.K.o#Xp'H#l|Ϧ7ufs粝&U < vØcģ@Ր/"Ƽ4{$}mۿy"餅fSѴcS#)lw̔3\8TvNi<1 v߹_&)"ZN31VS'r8gaT䒳8?[W$RO(K0h1c]=c/61!|7Y͇şS !B)=M3{Rv"+N~Љ{3TA;&A:ףbVz(fO>7= Q1 GgYu''crt+h& >n -A]xL}*u1̦Zzű܎cvŽc落dQQ,(ṟO Wh)I,k#IiLH4bgCQ86oܺuz*rX?D:% yMXPs`؀%pBI^p-^ `6&9N z4 >( 0Ae[k:A*V'K48\P"GՁL:VRmɓAMepTW h#GSc%Z>cDQ&:Tﱪh zM!% çhs8'Ȕ(TbSLq7R|N}u潡ƫ; EJg"2,  @ۅ9s$<@osԓjRwyWKQ>Dfsg(N={R~Vw|C_~^B?E\77Z&te2 6T_tEؔK0Lvdv 3('4f`H9k|n:ηHu4ŴB^JqFP(jB {o6C)6:To A)K*ț5l%4tO=tۥhw](DV= . r]n{gym5VzS[  X|g7–U`'!Xb |)Ǧӣ<Mϸlit`OK숹IRneRDJxҝLJ8v23Ω,?Qy h>^zelm?`2͎rʙ,*=_%)ULS9I/ 5e05FVDo_$հDX:K;&i$6y-FvyhKmIUj^լSQhmn`tGg}F-M5&HdbktөW[hs ~+3yBks U?W(SME˰[Z1Әryw6vJܥJ4~ >::raS#~9`a Je89|SJԮrklCЄh d4{T+TʘeV#=]DmˆiMʳ*KZpn6%/xh%k,VOkaMZmUzxjV/-Tm!sXkCW70:cāƬ$gdApf8ϊ8wU[{$M6m=`ǵ~"XyO*mq hK;. }WGO(1>wɸ.얁0& 3?Z`/;{bA+聴XbAR"@GH72_I *etl%-2/\A/gеQ=gߊC`nܕ4e쥀2!&iJ?1HiW% +בLqAװo<0ʇI%Mp3Uw=* PR+Eއ/Qv} O!,%BLO8CN`2T0M?#V-5?d;?Q'Q+: ԣIWQ.zFІ>]kL 1jfCh G"NzƅLϧ_/C&?] 4|$-Ji-v J(F Hq{,A(R̥fLk?JGDh3KC( Cvsi>!G5QcG;KݤKD5~Ŋbl&BKH[h[5"=,ԙ/~ԭ U[2 O)@T>Տt"qxRO_$ ƺEe/Px/rT"!(鞷ڃIL'j3I&+ٝ~o,TJv!T9wl1:dNʺ/E(&1ik;//?&֊x^4 WU4AZ^nm0{Kҳ/K_ȥ!&K3@z/ː#w 7Y;&k7y!&l>4a+.M?+ZY!՛`T*0D,}. u'f"|TRYAqW+4ӇyDMmg*=pJ{# Zo{i>tK_ۂ ԢA[R>_ џT_ajOBCdٯTbJLe?^( UBpe|e`v8av`oX`H Eq_4;t $tx`ﶠ]9̹Z^H$9tޗd7W8ŐdB(,fIJEBWomÿh7{oV=xL/LM}n;KW>ߵ-:l|}I;?>HѰ2Liچ=wۢZ/'cwNv{A΋? +')Y4 C'}g}vtXojq[/7] .7mOrsܥdv[fhvMR&ө<ẸYܹĚjmg )mq04J)_Zx~g, ڸy З}@u])j%d>om`a"ފ<:TpVfIt~z [h?U_9ͿJyPl_ m&Ů`v =srK?_^ʵ[s_;pv+ "gݓrI OD/;Zؕ׍Үd&\("h85̐#!ɝs;Iڃ~`Fɢf f3yTև(? :}[Rvq@l#` Sr r^2*ӂy@oVa#Fp[`cbß/Be@DČdˀK6B=J#:͘7 I6Q)]>%)ȸ7W7*]v\\dH VpQ@B(nZeJjP"?2T[O ^-5DovF) Հ.$#\&OqVתwXׯ{vjv~cc1 [|X_nh銝UOuoΞ+z\2dDŽh5KU]8EM!% Ech&J@!KM#t#D'q7%Դr-Od&,9=~#.{SEmE]vx+`]2?~7~n,͟dZNÊ'?~&摒ǿimv.kijY٪y!UV2L4Å}~Oc1.wQB/MZ^9ţ|r#RU!>SeSJZo*JVICQV?|x_@4hXn3:B54W-u1Z/MF2>8C3J<ZŠrJr֨s6VpV,0oWk7@hP,].5/{`D=w BySAo͢T?Ah|M5%W14JkLY ?d=6{fhLVc1䍦T!: 6*56OHf{3*E1n3#gܺ={!xu{`I>{*w*(G4j_;˪T*jI )5|iULý z\|!.?ѥJ7>nKCQm"/UD&[1 ;zq ]V]JZu sKWmPNHA|w/n΁Ӏ6n:c5Žc}|Q{ê:Eva.T[t|2c+:6.4LuSJzr26e|3Yh^:{Wϵw<Q|1(/GS Z]1jUT.QzUX{,mL9[4 \&AZ}^3$-c2GÇO>_7Նn'WQOq龾Oe}}/=:&4L^-n>sW^D'_ ]4@ZdA\[45*[Ko7p>m<9/gGH3rhٚ^X.̐ ;Ν=+*?1MTAL&IQ-9h=,{Q VUov^k%@NfgPDÑзO{ya];Hhxd6 6RII64W'ՙhRSm8ɞwa]pXuxx,'yl|R6?qӗ0$O0(jle0$ibc5|Ni9 7nFsp7uDD׬T{Q|M{ݷ&w~{mu\'DpF?q|O<⌊"yQņ$}|mfźw.ZfzsfMe|#zJILW7`E:`?AO颤9T4Z3G]Pr^Oѕ5S1[ `Եۄv}Ai5Мv<6:DOdoqGc{=f瓋:~0czuhvt(l/Eɪx 95]2Z>oa0hӵqѝOmq>繭/]sϿWdI-:0,6`UnGT]IRZ`2jXi{/lXB.bl(u5F<^O4X?陶Phd!n(m36տ1 _l/NO5J CrW͜D`{XY%C@BnufcQ#93# W:nh2}¢.EB01z3,xKЩi"U5t<{8Y qd nqЌ٤]ڍh鐋(;h?yGB(Y;lC']kfN% Go-@{дG՘&{3[)F*O4TBfmP`1¨LR.vړa0И$MVW/Fbr1u#x1fL"u&]i4}B{}46:ͮoDw~⸘53hT6xFZ( ᲄe\f,,Um)7I`P_S* XNIS!lԂ\D =*3E'P fKa?41(d1WAN OzאILNvz!vS~mԎHpop :_~+W7u]-0%fuEMWr8 @(3ow=O?'>wsLcâdf9e9kf39kvM_`\T.RK+yUort*Im\ApIb<=bQ R [ n:> ԞJ+n?2Hl!Wگ3:)z}Z1|A/ooSimr6y؎!2pf9ͱ/oK_S7%rNcµzg[L2pD{,j*/MF&I R$@F`DqI]`3bC0!uNN=sn;s^{<^10UZuI#kmn yXvG[͈磷Tܲm/!LvEQe%6d>缨 q]9瘑&*`I+G8j ;*G'1>~{;cт9<F֦qS]2{ Vm8KgX3䣥e5>&eZcMŎ?htVո<.υ5ߘ쥷lG7~o!lFWMxA~⇾JcBy=KSzk];ҷ=̴[⃍US\?G;R?RWwjwƫ~vk3gt-n3l\^6Ȳ%+@uai+"f? ?[ 5LuD3Ejbyѹqd~~âsBoKDͪZd+L5 9QwKޞtXs"AU5d7I$m/%k׭4:MuGgݮ4}GNe[55R؉ΦꁬͨȎcW>chhvFkvJDfn|0>sy3I-p窛5nd6R-.|M?u 0@pnRd^:-\{GMRL.r=Yli!o`lKdǝh6{cM6j2 f_qfJg﹈Ldn 7[ . Nm]CmF{iNl̂0%MM|}q,EJ﫵WrwlhQ>cF\1kO>7h}ܴŽ\־;7mcݪ򿮸ߏoP0)w/_W 8_c`m`$Op$f Q2vF(S#ȫ_8$s/zsxOy]F(~Q.Z?男OB8Zj_?u.!vwǚػQ:ɱn(F u ᓇF fՐBYVڳ)ǫ,~ /n]&eLn&4AtCtДT͊Wfx .j<4dVNs 55dJ[KҠuiLB=3 TB%s8)X^.7kN+ ܎a ӗߩ7&{ yאe~pkDs\8\s{]6~O:Pݗ(RsמN 4T=Hn{wYehBKc =Y<<%mmߕe%N ]ثeQkS[,7\MOO$z[JYX`o 8,lRx 9A/@Gr\?luW/ڗ^skgΰ\H^gT?]uu>; 8s(>;CNQ'cʞT$^b23ON=IٌgҞ47 iS}]smFTv_SƺzS?.Uc5MaflT~aL7:Os#PU?J^5?cK ɒ&l(k& 7R88Q,yz=y9/~w$>x1>88%6d8k-<3d7Doz҅fF:7s3tib>fB/;=]@Ι¬sYw.w#\da¤21-za'lqhPdhx|2T3fv0Ń˩wXXܟB}wpՊ^D4J/~.]M:ד7E{ZL:=n 8I4 Ҝ `5yyzcQ2_aOz.墥-`͘sz.=9{P{3 ʊ~~ HPs-ݳJv{(3v1fXu% }1\nQɺc:u4`<~(p>Y ʏp'uR6b錇B[x pRf`Z V؛Dvg*Jg+ĤR.WdӮ&s/Qɥ̤sYx暭sp q~ pu$`Ҡt-@/}8{,Q0#Ә͔$QOC8Rybp\QRkfp8zjUNx\S!zrAq)$O]&YVKME"m̰֗m(V'u,+9")=>nxF+!V]Zk/ų WERStk;"Ts٨ٮGgyF>L̈~=t,HJhጏRE12K)(fH ƒ,J'a`+%Q^\Lv]W&b)DwԂh -a.jNtIW*κQzZ딧uIvHnx% 5x,ٌf:ᇊXl(81f%ᡨG\W6cQ0KGIt6Ћne.*HnB \Юl*ueYvv#@RiȠt34+^L1(0Xd;Q7e1QH` Zg@ll f6M`z 6D": Wb$VAI@Vѥ-!'^"HFKz(k(&zdH*yA,Do dl!AjE fl5 HG6QlA'XD :$ajăIA/f3!"I:Ld9-xޤn"5a^^+JrŁENcAZ$ VV` Cg c^EXp ㄑ^F"!zm z!o1m< #E$`Cj= بtJȼSxíAЛ$Q'& ˄1鉌.B"6 QTa &Q0,&Xތay")J>w &$DQ`p!@ =D0RKqHyD^ -$u6^1OHpYkl b%N[*(ء=Yud˜Iz  At 6kg4Rol0Bspߴt!jtK0DY:sW<7 .*?5Efse5!<~o$/8&*.RBAWf!nST~DI_6֩JˌqS%f.}TAYrWZҷIU6 hl<4л^EN h,AڵA]^_-96u*32TF*H;e64#^t;K1{ExM8biE}2+ZwFh.RкEM䘝pMfr˹SN MRġ+ _`2?LR K.zطsƬ^hCw]k(}6zXmGV$LIp벽>T5cgx&@ K ݑ;I>1-$|Z_tKoYq77,R'm#[w 7dqHa?6 FdPxJ9,[! ikLG_R|7s ^ś$`Tk'A߉Ƹ8w^m>/?|ꕻvxu8?š7ykvI1)Q ڃ$ƻ.?Gwްrj(yd'2cs\p 5KH?(]sJ~$xt˻a4͘;p-Oco$݇7 RXsLG=H3j%fz Q,-d9O7iGȕSE9m]껎v>Ԡ{J]WV/G=֕Ga<:n3/ cd{C-p$ner ,캗aTж4a9Lnfvʢ>j aVБb)1cZ"fl).RNaX(mXz]f, o ]lm_ ZK]0Z&Zb /^e h9K,I?Cc^2/K؈Cҫ^l9@nѴEwW,^qCfzs3."uiE餜-voړ䞦0{cءkE?8S^=m֠ 6AeDw' &[_ѳ"D%m@u^v as}#ű﯌2kx57u8;  mVV.M`|vmmO6_}'of@5GY94Y[\ 2bOO۲^=kwtnKc7&r3 Q[[Rf/$LPޭm; *ˆՌVߍATLJ׽+v˹a;` )֍1> 2vgfĔLi;N()JlR> tͽӧMk̫Vl3mѢ X=,մ\бŸq[Ra]Ӽ;6 oWT֊%zWOtYvGV_kZs)ڎ%dk:ojcf+事.j|"n#՛*ƕTl/#$L2aU# T!l,Y-iJ!oNg5I w^L}n '^e0Z K"z5glΦadYz`UGK~=cAo֥ 8?\hkVL:@S>оvFfu;Z|.jcvZtm&|y?Fu#a5{ł*EIjdYYq9JUohCfEZnW],ޥFG.}MAo-#Ԟ˶w:3BqjkyV7a)YV/Zjlh%:z \q3wtvlrn x5%4%X37?ݸxFg} >uΆC+gr&+ ČfcBFFEWXZBMԭ幱s"1.=cՅ?ؤ{{lMSV)*nV 8Q'LzU_p% 9lV2Ea&7ZqӝIQ٢7Og/Hߧ~a?tw ?RHђ<,CB k>ߠ|)/`x?)o<ܢ[vjOxa!M(=?@d 5LL$Gf&"u%hJRJ6GbExb~Izyd4z "7ȼ|a-z?R 4%QfaŖ݈(iOtBuhKW$5~.]uMm-3T_ܴw_k, r2qw{Edtw:Kr$& WY6XnfsئtcA @P$%! ![3wSM?l_~_nn,Ŷe1IU3? 칤MYo|?bIo2WUEb+&YF6'Oϖȵ2#) .]dQ65<=K՘%+3Tr ^׀ gV6.ȏ=oP eqˆܬR[fMKyE}kr3+5nyXmj L+ L&@:f"yKhI HE")bh]gUu.(5`ү)ZDC׷TfM/64EuU 6RTWW*+sWc; pO+9.hhhKu/':.U#K#ʜjWc`=0?"&8aܨqh Zw ix^eH"VPA8ĩ&fHHq Ra>ҀDLXE#|?bybLӣVX6k?0]f6}?Ys*M<G}N[qYnV2[i;ڻuAl=7iycAOÌC.$Qd~y}-+1>qndOWS>qcW&%_~Bz˖?i;=+ƂPSTY-zTM~$&ZjQ r8D䩞0(hd#{HXwd(&&yӠ;0pqvGW\sy\#mHDK'FyL)M6"&l0 &0*hB Lr@JI5E'{%>q) l6HO"HAҽ * 1&ޛPڏ1Y$L0yy -&HwPl惙)0DtR`L'aDϝ ЀFp3=CIy)˰)F¸sU~\=jc^MLR=uvc2y<ͷǿ7IQvz2:ؙ- !0DiRHpv(ɘPV .qv3jf֖i/[Z &X:UBstG$ ^ڒʊ_\E\skuz7[HaiG,4cKbJ#+#`Sl\m:j͋L* 4X2ccW{AU58csߴ{ZI_Mr{Jcq܀GR(a"X3'̈9:e?JkcwӇ:;=ݻ6@t]{@iR@^t-z(E#&ٷ1g 8.up`19Đk֒iBaF(`35-CB[b=p,j9]@;Tvޮ)*{  I;JAiV VNv)iKk6-RޥFH Tfh5Q*z=kл&^r5ɥ{GRT(Vwbgh wNbaO +"5d3dA0-fQ7t2r&u_)N\ĨY` U 3G^{as*۰]+]쒮KC.,|~rWcqA2B,0=P1}X/F=Go}KMNk|}5ЙmL0gEgL~g췣a&$`?2`&mK+CuS5S4 ^&,3|ނ7 O}/􆫘d#nYh\Jm#/>N0?5 Ph HjHXɀ @7xUCM!4g>FkxwUf vp֡m-EJgk Wk(sDY" '=F۾$ɠrTM#RDk=ޜj(ǢjC"SՓUIeGSsS5I S2rQ60#bU&/-eYsvd&a (88jb%Qz@LjSn\_pbS-4"q&EYyfsW]gP8҇"0qvGdS$_N@PG mqXps@4z%۸#@]@L8s oclQvt=}A2 ɢZ%. 7hy8Ḿ$~x*APX8A=YÚv`:Bqy'!+ԗH(qIOu>OwbqC#uΉihz$/MI3ie# \T>`XcMr_/uʜJ\4@:2 u&O4N3=HL¸޳ ɣ$`M 2BEgT*Q )nV̰2J:7TQ!XPH,Ck:%ٮ0Fֆ{J?9._߇3v|))o)]Rs&&܍֍Dr\_LIqxE;sSfpJiWaUJ&=|#][ܭ߆lQQ^fp~܃ uùR^Ap0r8_s+`L}';DNW1?U~p))_Pv8. ~(_'-$᱉]36a<wsiQC\=ПO^Yd|Cm.={7}m̹@D3<7,G1YtI3c 5Hyu!Xd bO۝&PR2榉L1Lb7@g!چ^Dmp^#lU50sl4 yP +B$x_%!JHtϨ[^@=h3cA3{N LZk* ㇙Rebm AIT&~2% vɓ |k!W|Ԥ¼eǀ$)gI}283cZU.2aԯ1_!y6Bh}Q2_N6LPn>}*czX%Wul|ߒ.WΞMڝtR Kw3|MT6%#a'2@5-e2D/ujNX״fͷ"%5$wwEſr^`)|]b.5k&$+yIϖ"Zg-A5aK[$-oH!uҘyL(kXN0ik\h?\Cg27}(%]u]rxMb1xu ZwB4dgȭv[v}SR-l@[|G _:E@XnWWImFqv ܡde[dJUa[帬b?+[VK ۲H|C)gqEJiބIJ"Q3rHLӐ0z dLNMjy)*$La27R=zC|A' FRRdfK"x,! ϕ~3O4?%V|T&4rҡ4}7F?YOr( xG'z?Pa$0=t<ـw[nc ߡiuv;1FA?⫼Wd6@d:=N?"RQIWgJXZqIB8a: ĎLa#N^QuhpOy}>xxAY9Cg Ї)?޸tzAbz:^w|KWy {W+ߦ Z3Wg? uب+͆xzKr!?MЯfGe΢\BUQө8SL (RD e1r&jңo0 lJ|ef]fXRyα{zUWКү<짷5O,)d*\UȎ 3%]EbK/~ctad %Sk!ƣVZ@ۓtz.27 QHvaqH!24Z e ސxα׀[~3#ddo>M܎#ݸgOvp=3k]'(1"|7rLv);H)"TrT!m+av&WB:sm-ΣA oX̚-,6],^?0>.ajehntֶxԟ}x0/;aZbHO|QP =74J#24z Q>0(+R$'hxX6h4!  ,93'K!-tGɮa=qz) IwIfMc,P|C ;?<ݓgF@W{Oe@ 3Qգ|ƱGSLʎs&K$~ ei'ME{ƼLZv2Lt o7ѴG{B̧ {kʊ$+ ЌPqLWjZꛩ՚5|Lk_fo™ٲfpu%Br|ҩʦmv#H̄-=~KJz=nDRđr 1SAf1.I:r'^"Қ:D3w pɅ4ãŊfʋ] 0'h_C!"f1h<ġ~ĤCbu"QoZ4PnOˡ +ӴH3ϫ/MMg]V9{8(&Ľ}jįŷ/; D_ks +Sw鮯+mtHc>TߧLD2}zl:uٴf1);/;ljk u9u~fz!- H.-M4%>,Z 'ui*جGii&L;`*+-]2~}]3y9-Ps1٘L(+P!oԀCpCu܄ ӘcHChQl~q{y[,70}[: 8ÁG@]@?{QteWVn(Z~ډO])"QC _\^BBjܭFޖŘ$ʋGq;q:R7m;Τ,&$w!*>#qN$*X!Bµ$AD HA|\[lˎHLN(@ǂ0@8,$x@w/O 2p8cLLƱh9h: 0:P&ZL#knZw}F#c(k,5+LTc>Эa hJ߼GL聼jdj};V}ʪtϞ:/)åT< [&"mXbe+!E.iz#ۍP+&9Zа?eZE T=Bj$w v땃4#-`I-4nUB#ih ƂG{쵻G8jQ|E/ffxOJP5n )ftb p@୉~E" >xu0{:HxiaqԲ0TO`#р >pg4A6V/Љ5l2Ja4z:oXs]G`yPp,z{~ {|64y*84 o/_Xwݝwsɢ*C@j)4 ,yKE)l@< KQiQhvjqU -#7,ֵ~}$\M?Ƒu _fУ噏4< P{zJ'~݊=Fx)5{@N9>׸g:`O1ÉMf؀(;#dF`#9AΞ9oScmXҺH+ALovSz*w2; ̙x'pHDi !S .Z{Zkѡ =Igq&O'kH=iڝMMsxga8~~>&yoO(Ŗ֜ &$!a丙9!& ~Xk4hnyWxMRc~-Z׼VƑJp{CJQޏL 0Od9-liI Cu˅0~YFPhH?#>6>4 cN4n1]́55{r 0 3iAW㻪t@?ns>@7=cEZSUrzJ*.ՊI4 Ja%Q'd>**B*]I˧]jjBVQwOE)he =Hx$&=%卺 &HbM'NHڄ&>i "!+Uw)P1e7W)j@Ps[DIW0(y1!3>#`hCWn[9:n|S  ?m'Dok {|q \YPpSAGJ800{j4ߒN@7@}S=+79Yaڌ%'se@R L&OkxZ{ZD uuk%9GG+N!jYIE &@}zGpvj5J'3e}(R08EףHBͫ{[jZakvWW XSY?D_Ć &o6Cυ7pH< N L鿌PhEqLMɣNOt[,"e~\ p ',|cp<%}һo׸̫Jg4y"'o4"Y2r>/ʉx.C82*HIh&RL360үhe4Ձ>xWj\A-nřZ ܰRѥY0:} W(i+4 ^! yg ~WIϰoG&L_#cY}OlSxv-:,$ ha_nj]J ͠d9.Q}4zҎK.C0 6d5906-/hXK_8l3?Jz2?pY\DtjZ5O* `-cG[<[_Th.x-:M\E<3B7G8)/Cp&57Ih*4W#ffmpF\ j$._JW-!,~!7 T߾EܟWڢYvFXk{5l$ĺZCiAӫ Z^Fl^!ku1L~rqRҨp$Wؚ~N||G7kڪ9zs p&܀K2)5vlh= 'X<@ 逴FI}IJMr;:lS8p>;DGzķws֣V݋*x!Uxs2V38^++슭k1c(Eg3=L&h)-vСcɤMV+EZ%%YKuU Z_F'ޗokF(kTj&2cB-Ù|Qo3xQ7#) )RFLqtuѪ&ASi1W7ک"v^uKG-L9*^FsKW-m|Y6ai|.V95\f US9RVts \>c 332Dv79W5~ZU0X2ė Z\a Idb$]JqyS2C&6}_Mt`!h9V+j,ʃs{n73qZ< ?6.hN_>~=Ydֶg'Ƨ֌~f4*έ̀v$?L{dOP]DLd$ItȪ`f fwH0 fn '3՘"I#ĥ vuiK? LN|Wt*U?]13FU9Ozş,^o_yp7}Q_5#>_j\hٓ+}z}L鄓Bh 'T_Qg𺬖jǸqS|?܇qkR?IrEPdLVDd :.T f6e2 AH#ɨLpZ|YdW_Ri*!a⬰sOӕuzrhЕóU壼 xlOF6lA02 Šrً-/{M'y9'B!?8gSף$0Y1JjU oZOw}=>{eqj( ϜKPc͛oHE=hk Nry=ΨtBN7{Ny$3}fkzϖ_%K};PfLhݏM 5Zt!H4e-ׁ%NXa%ZcWĿf-|`K(Lp_WV񗠐+R'Bp)v/rÞl8')= M>p.=06Li]Pzqp6r ^z#HP~G`ҩGן8Ri/Xg~aObLl9 $عӓǗ 8)KS]{VxΔ⇏'/| ൢ:Թsg'svγem{߼Rms>xۇ!x=>|g^̌~(\i6P+I-r\0|l1|AcY 6g ;,b*xԁ˃P9Y|"9$HVj#ֱB8f':K#eP$g&$h^hHp #tg0Db B+*,[YdزRϰx˷u& AdWЅsqp>(A=s܆.7l^VpI&xçWTrJ r0o_nRAFo^q2o 佢Y]`t Պpԩ|`Ix`JJNF:%lAB}p.R-ꑤ+Tǂ!4PLI ^.)( -%_zW*`I:_UbuwwY:u* o8,0r_2^Q@?nu)hҰٸ[Rl\jtu:]2fYΖ듩ot So渧١SmWqN&kVsNte_jrO8NcmH擅abG r$hw5 6zM u\X[t}۾%v)+f?ab W`lqb=bwξLa*lYTvc| kĻR]#W3{h1J%H!!WchY6A3V0{I`! =\LFӻoN* +{0 o.Z[PTUOLfJԸ%XH؈d"7ֱ kLǨ2 fex~qC3?Q>aqáҒ0+?ޜ^2SkX=Ө9po()m` -9WJĮ҆R!!+[ gwz6_JJe&}Cz41͞4N(/A%$$>LTe9T('wH0nX)BXNbtXFMy4ѲY0jlP#E*)c? Y"(hAZ b.ZɐhƗ2I%7;)&4^IL<~iBr<ΏldhIKH3UM2elx)Ӣez?*gA2$U~>"pGIӜ4g, DJf2ךKhXTCR3Գ7 ++*[i1@ ( 1 zxT!&^Z0FUHW/̶@R#`37@QlQ)e3`аJY0Wa*T,Pev[ M z[!8e2 ̦3 2_Lnr3Pư?1z唗h!F#Q>2J +e&u~:/}') i ~`e֖ cJ5 2VC @ FƍfY-{P\]`-Jl0X6)(;!$VV Jbj#^j^/YMҼQyr>,>4ktHP)w -4yQP,/olNQZ]`PQVidbXV@sCު9J/WN9hlkgd \4u9fTvPU ,2)h^fj]2U P(j YE B+C9e.F`0: jS0 Ȳ怶V54gkV( \`W˥ ]Wmr Z¶VK!vM[E*X3J q U92~erѰ2U`Nk~}Z$z?~mĥ 9>7apD8 y#U7a=8=E&(X??&|Kjz`[:YP)m++jiKnm Zpx15YYRUX/6pt_š;2;;2qz0ZeaW ߬5"rwC黮9A~Ӏ}n>iG;DU6ć4Sm$)kc*B̳2%v N`HS줭e5`9H7̎*B.v9]9;̼_Y^У=v]n_ [Rp|.k0FBt8y/oS2 ޏ Ŷ^"/47 fbC :$Qb#s,Eɲ}&L|ƐTDžΰxj$ghX(RoA{%<nIكoZ)}#Hnl^jJzo_[Z@:pҚB+Hn,&taW5@[3$[r8gTMGMee CIn( *N[`偁~h>:/ioj,;D"W[o((Zh7Å=t)x`~_ nX^#ŮyIaTN\ $N "st檶6~b$dVZ5XؼCUU >塹Gn-f5{;vX۴(/sT픂0:Ekm'yBC̙<~Z5?}{ɷ\-(:3־?.?~k-8: n2ŞdXBcqUFq=ZuN8ͺ@,fʟѢenD 'K{voG_v(ٽt]sm'e/\11ZQS Fl2#/I[[6jhzR%ؽ*𓎝nZ){<嚲Y{T}4 5vL/0͕:y2Yۮlw,_`zLcW9Ks-.jt]YAXD_RCH█$_x`_e7bVNٹPIoG'=sp,- hv/jG0\ںp'a=A;Ksusq&,fYEe畗LQ,lkZDΗqоgU /7j;@"Qڠj6"̴.R/h37;\?ECdՊ-`=/fHd"~UdEB dУP=2G8TB<4~ٴ`Ճ5|\b.~s3^vۦ憮xQD bE]&sâ7mM3TRr'Py5'N<5{DBi?^+a=?eN=~ǠwD_OP 'h`:P13諏5?շkgp( v?\lA떍ltY߯-pRRAX}.36;t/ݛv;SIS8B?ငB)Y,>a>wTL 'o:JgMDwUX ѝĹd'>$3?C1zXm*113=I-ԔCLӫayyb,zdbq6 G9j oxo6$  yitzpM׋:-'B >HA"l\M'HTչIU}hRy$f9]k rG&U |~xh߬_V_|gSN (" ٪i⺅l%E6'0kL{8A&u_L3ӄNd&k3Z>Bbz^2g[5$0[nr!ɮ &Y֏㛷]X`Кw^ "I+umv<3 f,Kq5t ]Tw&t[>b舫 :ٵ|ݝ7xNE\T )1EѠ4O" (sP¦ x3-b:p3>0ш?VT Z&IFj%zI5=:Q5ĚKpL Gk^&}^2&_I1ˋ/ Y'RZH%> ,,nwI=?PkEY#z 45vW^ّeՔ=u q|+౉B;y3D)L&v 'J>h*Ѻ>s}*^*yLbl9d>q/1~/wPiSybW^ne{X z>|S|O$'G]P \97TۘoCYy9}'iͪqETV_gG\xLDll@]F l,@St7uY-nʽU`ą|1{ucnXsyp_bs\ұlBn̝s)vҢIz9ӟcNYLrTeG΀8~`#myХN?9tnEE.\p7wE#gN=U蛜|ĕ"t;ۛNI[`/89iKr'aI(+8W$MJ1=ZNYcן]z×6?y"Qu)m>O!եF@b|n+"Io~sqo_9}Vƽq =?O/(Qwј1!WsED5a &i /o$A8!26q愚6' P!U05hƫFԥ"xA  g:T xhL>ScF Kï>63rHJ{`0I87%N}[BHÊ}U֙K#rC0v1K46vΪ< \:/c0-*Vǩ%rNpPa6Pl*LJӏyVڧȕr0墨4OG:ٝf+\{IU*Z8 Jʢ glu!y?gk$Ѕ-r%j32 pN0yl5-OȵfmIn00%&LSTr@ t){iEٲZw'p*4dR3f@c+@S!sobcx)e|Sl+.BoiQH9 U\aezH"cߔӊ6٥!zD XW (T8I8h#H$ED/Mu]4Cf~'tDoceyײMIVp@?-=6Ss,e:3eZ5R9+7.9Imۇ[X~g}cUlmM_a[ Tsxg!nUyMeyG&B^mc r4sʭj\g1H9T1rFBCZ0JPhwanĠmMP5 zނ5oB͂w_:WK^3~VO\n}F_pw>WCkQҳ׌n^TbPƵs& -3[Ag42nbby5͞dkKcUW ԓ'6%O\jl(k3%bd Q)lju%u;g  Bi(;PbL?Ș(@UKJ S)tkf:]3`uG0~p-a%:A* ͛Lf!/k`GX7-i1nRt46E/g$(/u a mu֒RQIsʠe3@{ E~^Ot3GgyV T[ͻ=ڿʥ iu5;Np*(jk ^9dcpv d 3u xBJt,1:Jh} -@i262!)Ԩ%m0dJ9H?Ip;/Z NS7Ҫl+dx@0:$ߪd2 ! jEh`_܏@l'.QwRS;P`! @7/Buy^@gM{q^ɥavwY<.Mso\'¥a3ˀbA;UAMt%TFTC9`1Q MCL";vq\ 4gD snC ɳZ?Jv ;hGT{B)Aq㣏pE)HF`$@ 2'a|>/ bJ@$c*KZWղ[/Djm(U oM]n×5uǗZ5.XyI+93ZG5ni!&\9maxSDǪ;V/y*k1'Xum~eMq؁sVw4X&,oț2w˦CS{W;_ *h/L}{ߞ鷅r:6T\acS,)Jtc=w:G:a){$!|:jAJW飩pPRYJ]'KE%-Yl@xdΡ8y/BczU d^0 [ />@aPF A<1| 5&TЃ֤%YL#kA/tCKК;В~:]ړjIY[=Ip>d-yRx2^?+>RZ6rg^'G vf^;Q7tџk$`%䅝'@6h_ S̉e<9$CDG>

    |֕yk?cڇaܯ"T9F0P> !x\ *=\ʵ׾޾k>b4djCȆi>Ye"X&_{晷vIrZZnGZ9p##G6>~@n:DpE{ Hy|קj [ &qs`ULG NMj[ۄ0YֳtiҮ,l-)\cD:MNO2F9ĉ*W?/o>cv:gˋ |5 !\3Ğ'ލzflYwR~yB0fLv-@x"͓:≦$K$a8%ADcD7h Ǿȼ-5S4rR_5qe1o- CA5t-ž"K^aRUFlФ}!:+!]gre{i"hġ;2L[N_sf8X ݯ5#5蚧`@)G/=6k2P/F c8^]HR*y[ EHn e1ߨin?=Du䭛C,M,$Ww/YGCZeci456\Ǥ-`)43vI7B_@!lr.sᱧÿkdRxRitj)Fc~f^̏ H/[V2c(nFҶm0; Ao!8NrP,(=m >!= s29@6%.V&d <䪉犅c >,u$S*LVrJT+UB"S+d3 P u:gAlIժCfT*e7%2A&QMCQi!f|2+8R4fqD%)/i4fZ5iR &zH$J()2JrN!T`AjL!%k|U7ex`~ +پTTOʸ>Ȑ .D[z}'U߁wxE|c4~NT~rZ%@ څ +ZsVTe+zZ#X>{P^ttoAҧUf hO੆Wc j1Z< 8 t F1ƌGgT=" gPçA{%a|)H~tXT Qp|vJS&q~ƩFۭ#.i׀TʆlAߪj4~` 9!'`ڐf 0YHAHΉ)TB-ਛߴI7Y݌:֨n;VBLRS$qyW|&d94Jt%ƘV0o1C2CLHqzje4+i Gzi d_|ѩk>B\^R rEN~Uͪ%+ U08ZM=1-&x, Q-}1)6Ըj.LGTx4j2_"A|ow;|%4cE1Y$9vL6B3%^ jHwgNmڹ3wmuwq[GKGq[thՠ-}QJAG}}{tpX7m{:e=ؤl} @Q ݐ ۜ@^s6f0Y.O u>O.$"@34 ~LpÌ+Β.; } @MTZ9u8=rXn_k5Dkk,oDmKky%NS򺖒ںak ~'@;=.㷢oXWvL7 Sc 9 9׮^c֟LEˆiϷ@OBy!?34$B-ϊ ~dY39ss؋\=ϝ9.X֋ d3z!.%"Kgx{ۉ6H)9&?P7!l07Y)za; W`y壞l}n( 5nH1L"bO66Ĭ$.hd `/0󉚊]R8/@NzaC#sZڐCcW9j՜P!OfLNw{ #La&+8[Rsp~{qCnhcgw:F8j"_)l4,sk?x,R9fUE^0{i%dwKh+ipڅ|O6Z994D/ -4b$ѣKec"s4!f}I5I5-jO-fsZ5v4X܅+i +"#/P x:.U r%h:t55j=^A59FXFoѪE}( ntјW@'p8'j$t淸‘wr߾ʊW?Wk}84fLS>3dݢkNyiNj]qJ!gݒKՔGJVV^Qn1g&=sW썏;lt,CoY7Qd^`,wXa3^τM~!W0PLKܗ]Q;bPˀƓ=|CMk7%Yo4-z$Ғ:>Ulyrҁ?CR_};ڎ,&6|G7Wv t,-j6̨2es ad?xzF3 yB,%nN10f(,YDʸmqoɐ=u†+FiZjRإW۶2u ֱ!̨3*[ #RȰǖHj4N_êQ!,Zb~X6` { ZSj[Y0w#%J`.n9E2UoY5x rBҊiCv=#^՘|N/`zym{,O8Ȑ zG4X" VZM![WM[a{~=XLHJݍ>؊흲PŇ@ ʕm no{yg$EG^ݑ0Ft@[3MWn}'隕oۿY-70@P GYu FVx3}ZW{K4Jc]3y `~:;ӽ2?\iyOO<Mwe 4퓤|O=?cF/<^i5pcϛwJ9ˉ|mԔQX;L$ =߁+ ֽ>:pze!W5Zn;<}ՈW==g+i!p>ݯwRPBes*JSwi ]B{؏ oZ6>YY g.|?9mh $ANJ4pxKpDd 0#ZFti-7R`u[WS-8j(@t# F@f8E { xa#9X"DLx}W?CA.bΔm8Pd]p8On9zQVx>9`X[|o8#Wd2M%OaQt2l,KYzRT2ƈAwxHΆGm*6&o}gp )O JXFf bt 8 WH5 L^49#a7WThs*P GwDu(e<77QbMq J%LJW2<(oRƞ+1 B\S'xD~ X!bs@mA)Ew(p}&ECLo秅R\s: {R((E2sN*;;G4 TP_̀%9r<@܎*y o K>;Lw ZJ/";񥟂 \'3R傧kb1e)f׋w :F$̙ߨKM܍G6 ]7nߵ3wȝ4!:16%-fk 谪֞5n圶1 z8mv3k9!ZKOg>l ЎWjըo;abzk+CB[m?-Qhn˞G KA#RX)/; JPNdžΚ54ݬp^ dK*F> Gİ< ;wόb =hB #䗖"~ӧ@m|w}&*XmL2KA%rhH`qQ _(H Bp'_P('l+b4 Xe(~֧bTbž.^x%+TO72[2hP|E`իmRG(/EI٠<,&کA/[@rK#2Ghݍ=UT69GcT͏4 )Y O'@OU ypC!"O ,0t `IP:M)W1=Tc Eg1eGSuԀ\^%^I_L2/͡T7F`,3j3*+QL.#k! gΥ3K;/[6n8} ?ލ3ʡn|+XR`V^P<6RBOd 2O7deG^J:n\\ ҹvm+qFv7H'_{IRh v3`T 5IMSy:<JiO76O;H{0} RÉ~xU8!Dh"=eN 7cQHz Ag16O 'E)pNϊY\k;4:MrrWHaz|@FPdS>y ([n fi Roy $ 1ZhO-f?dV̢4ôPҫfH@|'X4)nqKO.4͡S5Hh@W<2'a@4cb Csng(*pOT.^pEW>#K`+x'X0%aosO/gC U_Vq0!:6Wf Wh\;ƛ]8%tV~4Ė9saqѐ>*O*3ͯ gww֜;}CGc͚mn]$ٷeO9Ե6|VW{ϓ[[ZU{7$۽hKFJY0ER-8\&,GI|Q V*T('sƒ0HGQ9zJ]B3JZyzs" 4l^ `t\r]EИFy5yq M՚~x1RЕ2y<y|j'pSzܬN@2x 0>//6kڗ|!G2x|\BYDn f7TBoAQGdz._ I"- ygq{kĹ $ɂQ`CQpB:qhP8 f5o,o%C,)T;]\|@j2]x9MY2](2JF>JiSEn1m2}J"Ǘ}JRLFi5ۭFaʏ5^dTL0̎h!-äAjάӕҼјo.͍f;M<7E-Ç?N!mM~`޼HQ'd\40ߌÑ;'|?:߽2^*TlYP.YL)uR)gX(9ʔ ]r<ÆfɤK$rB,@? ՘Wt`99vj7` A FQ|4!昹$x≍u<}!x]Ԝ5 pqs_fȍoJs4f&0i'|O%ĸ>T?n;!|-iFr ΅gr5ȫDV{!Lvm&AX;0A+ѨwQҟ'<új "!Nl|XxjQ#'sD.Lu&o^nm\ѽhV_sXBlنg)ttwfbk~:r`6'Gˬֿ{;j=f>5$|8}MnKn&z8aF/K67|D c2]|ɪxXT>mZK1yC1}w/6lz#ޒ~_qKKK=@n oZ/o=qVeᛶp9R'. }Y{{q"޶Jϐ | .(D_*+'\.?hu?N'᪪@=ƬTXUU^?:5/p9)2eeU3ұsX&:tq,8qd>IMLO-Ow&bLU+PNU+zܪRVpD#uW_vU\?I?NƧb`|*0gr$F22{9K8BT(GK&7X,YX3.A 5 $@k3W ^JG ~F#| 8}#@0C fS~@*i1@=P&z4&)j0trGQ sRUcuYi(tp: 6V47T2?m ^MW5+u<<53 Ta?e}U8z|c;*b<#rN`%rOxFA)\&?W+cᲭJf.Q%@Z!+3Ǚ-dd`-Pj(^'`uu5u5F}qa̲e& ihQTbO(}\D el!C>$UBџafJǬw:c$Y:}}gkAQm}]tv(b{@WUWjTYrRm޽pQ~)nByuuCE݋kfVh˚r f'x>7vH';3퓊ZʤydCYfoegߥXE^^MgJQ6уO++)-L_bݧ(/'ϖ$.KU&³<_hJ}⾑P8'Gz3i gb#%X& 0('~/^f/1U}R{VΚD@Crt}FZQ*]L ܆s}%-` vlIRnG ݸYޜ D7MqѶ\=Lh#;7/[G-]zcĪ KH/ytۤZ\GbET|fڂ(JXMOTtV|M ȡD=PKqC#~H{-n!RQNE=/zuAX- 6M#=PKCJ=82rʑc 4DI('o`m~O:"̆aזW#gwjWi w4\#~I0Җ̞͛=4Vۘ[}/4r2KZ&jUay(xř-= kD/f^1IYܩ+ԕ̑B;TuE6rͺiUv%͗\3\sS lɷ>o^ cWRaYquEz_Y6i@3o?0O-XW%ViQbHݸAݽp juFZ/$j5R2!}?G1nBA4s@@JU!'TmkYtv?07?<>J[뿿b{9+G,t\\6(M.fan.n3ۮOz׳9F^|)5^? 澲obzڌ˖<#2mίۨ-:=^lƺր<J|&LBDH< h`I✟8~O}I!gHc=N G`dFsYhH{j̤>9ɠY6~Cs(LDiKs/urUU /hMqӰvsJ5l]Y/ybXEvŽ{)B"[(zjQO^A{3L*_*hA[mX}ի9O_6YTFԅCF\.dG (Ò=fy3k̑P^F> I 4 -ђbx8M? Yx ">!|~S&ʄZ4O>ڡ[ߺ۟ԗ eMkd[+MO@ *)joE}wCwl+G@TXbc ՘u}t|痣kv{^g.Q+yq i5P{xR8MC:[01l(fN\pQ;wbÇRNXԶrU*% W^ ?%yaYĘzBI=&(ʍไ}dCJ3+li|i˖&i bC@|]:. [L_T}woIuL4iAeB BX Z /?th9۶xz`}cHsta%eF33yL3~f3<. B^[L2x,`5 @ԃXRj<æOT-j֕"NSٳ4ysZzp6X+ԨlDEl}NtA^'`R\Xg3GG` CfA[9WvѻNxҧl>}Ɲ9.aWhc>@_5;j 3#^A0vq-ٿSp)CdF|xF*8Fё"U\Q&3L#Ndi<4aJq3`گe9GB &.ImMf Ggh{:'9 NTƒՠO^=*e(P);@߯>+Cށsћk/>[:! 1p~ ]މ9r#YQ^B .CAWMg OLLH"Яs hzo$1iZ{sᤊfD@FQx,7'l޻ 9mjކ2ЉǾj jxv3qY+QX\u iAs E7^x I.01ۉMijd‹y@7YakN}j~o; ۺV?fo>zmώ?uw϶.^}nٹOq+;eoBweܹUa۶ yVQ["?}!&rλAPPQ(8h;8]qcY}fgnr^?KAf3\$!4}kO=Esix7?W_=bw]KgF#sB"ڶ~LԓRgSƔ3UL-SLof&1S~Y¬z-` DD,EHވˠ  u)OZ>INpZfu Ԇ'TsL9}dTqz×Y2<3B[pGV "eܜ+hJ-}U('|,oc5\,a8<Ҿ;?H;h̿Q~ee>x&/ g+rm?Iؼh?Wq,2! h6_` `"{}R 7$5"GB\!}Ϟx僣Gf|4Kզ3k7~]7uSltL;X1{vqĕ/~ss+7nX91C^/2 &uJ`n:c>ֱfNmF0#&!m@]k M%~ˉ.3z32PU~<??BU82c_"i vIսߵv~>}$2V 'Twa{>blbRBF\[Hj džpP4O7<)3?Jlm;Pfo3.]4W3]u ;\@iOyمk0 (Oe*-d![\27<\΃`RlQjgc8i \ƣvn5FhX wpfQ>1܂}.+CYB _㱨yi4 ^ ӻhOwD:, u? ;z%0fȑFQpH>#?)U}v4".Eڌ Oׁ0 f8Ց# a} o˭-{=8'YExDV0a5iwj,`,Z*.w=6B+[jhPLAT]5 ~pSH` 8UH#'~RX%RU W) RY:W |PӭkLm8!ed+2l ,s8p!m&%{%Z[.^ oñc|Hg (h]y_y[1K+0Gm[ZpeBsL{&b">·cw8 F5wa&J6jNq!M 53dEUI^^|#:~8zA<ϴm*pZ[@]ךsyA+V͐p@$PDQU,,YY4#].]rѾMoUh* xq)QٱA) IdqW@_+/ Gwt&i^WmyҌrARyw!7D !nҿbӞknTޢ/cmRc n,&wn\@܈t{O\z ҫ;G=o ]R`B{V+5%3eVy,W0玉___i,i4Mym|͛0t͚jr)e*zf$]1CɍHBif hbʐx tD&8L,["AuߝD1Ӌ٧:{x0Ҷd֞=Б^sŊ;a%R{7G=H,7,1ocփףЏexX!4ÇkPiC8XkWeL#36g #H>6$.=̞P2* 6-֘Yt!|ۀGKk4g^x]R]ؼ7W;i$bG?ƿhӃ,Pd3H W @)M&+f||\2+6~ɩL-qIxZ2lJʝjT\N\o u8u̿EK*iۣ^ȣ%iqB;󟽼lu}v;,@r;L,ge/eb㣧=)_hs0Up> d8WOOfW8h{,P:D({)t)K =GP?G?[&a"tb~z\n'ms|vX?k?q\43&#> tdA](gw=>< BY"hD1\XⅫݥaW>yyAҦ@D+~{14 ٣4Fpw%B\'K CDnlXT ,M/>GyI.lj;E p⅗D*ǡ# ~ȗķDn\߆ȇD !3v]9/TA=Lug*Jbz'&O83t5gŠ]|֊ īx|`pҲa!QBu=*.v޶%[<s8>R8*Fֺ/cO c\L]T+Q, & !>F T =m}:emo A)JkygM\Ӽ3f}塳[CYtɛ!d%&b؋kXBC.S Qe&66v$2Dl  !(ى2uG=K,gGKp@M&I u@nJxbC4S) > &BUʀZ h'1{C `jfѐ`,7?Í ?+i8?zJ)e3 ֕?]SCIB7Z-T>5@D%4T*!{^y jbR櫻_ɶTjի2 IWL=dQ=`!=#*o{]oI|;I?VD`eDU'L4=GF `$x|t`BN@01? STS,2d&Ww#]`j.&u#gjmmC3^?ԅ7mm`b$aP-mcpp5.B9B1OC?U:˯OxZsgY/:\OƴHˋ)Mvb JG#L=}B7~?Lz?/ѯh8"hX0[;V:V,'m$ԯsETX9 ~kYLl& ztsR)/T [?|2O;-N;wΫgEe{^]oL9wHrKaqC.`jLH7 0L 8>_TCv<<i6HB4LAN$b`4Sx˕%<* 397uM!/篖@|X#kM#CY oI6B@<9q,uW0L`"ڦ8$B2 A&3h #ٓIO^=R?V\1EnœE@bd#ِ/! 1oހ%qKi^" p`VyRīfĉbϛ E:T/܇y3E|r,Y8%^BqݤTB0 "/Q|Pf5J=#pJ!54L5֙?dsavAb1>4gS7olnni X>~'5`B$X8{2h+$U&6%eB`B& NO:Y(#h,5bQ$eY |ZQaqӘSPQ 0, kq!}aA)j"G8mO8pL -j5M!,HnsT<[ s&v5HÐQJu5'{Yϐﳦ:U@ jǾ|,8w2e<9D܄)YV׾κ7cieuk?9T+5ps8M!~yJN7`u5>]-ANX`L'7FC#44JUkRj49jY&*O-ď[ձ1`V[<7%ǥUT.oϏv&j4?Uk1 39/пN"Ӣ+]4‚>;ʬTe \mTgHi꠼6ɭpT=g9$pБ\&d6Eͪ/TRJfנtS4juzdMYr؇W?1E+`Qt,]W6}&#>ý*-WeW39XT4Þ fn̑h3tUr.oz= zAj\.;xpR-1m9U vqpok~+R bQm{+TC* (9CJUET@f,JԧRed:mPk-W(F_,]T^e*', biW̲P8xRz礯Mwwp^@X1P.yo_\w?O:8L$BÇ,ߴe-%S45m/_^P>054ЗffL4У}]j˒GA.i*u*_zE-#fί7޿t-#3,JCDKʤ,I% *H6xst"(t b s=$ӉӘOyX\tlÆ@  JH(zZ]ֻ2=5BZNAO׿Ϣg&5Im>C{`2džiyW6\p-&ź[}#&_?I <{6z&7a3&1-g#,]4V*6 ϳ+T]Wڪ'OՓCXhފ"V[^yJS\+ Tp]V13%WqvV蕅XS<E~X9`0<5}o?sz/L˛ڙlݘjVϣ2!Szyx7)vr`A :ݷ_F cQ 4oVj d76-mj̖pkyV:fulUO Ԙ…uG]g9@åYFaa\0aMڇqP/}=3G@qɥ^|W* Ρw V<?<(|+VaޒEۯo6w*bPu%V";)pNZkk"$GsCO+x\ߪn`ʙ"!8vItܻƒ$p yBa\%ϫ+!:+DGfKIڰIϘv27A,F#;~4T6hP h SV;Kw˂!sw+n,gVYPgvՇ\T흜wlOwI"8<]cs<6]CPw0eěߋ*!PKbuo4[Xrs^nn%E}V(vZ]aZ]84{̸p}~-=V_7fvFqD&qS\]Jnܵ+p-d x!zbꑛKXbhɑ=\諦;z=Vr[U𡪘TUVo3>nIsc,r|tat/:7" T(arl/pdڛ' 2Ϗ$~GvV" R  _R ni Li1v4o\-R-.#$\-+UA2EX%ENcOWO ꉚm> |o%ms6k E+6b#վX3طט3@1<'ߞ6&sۦ$wA\4PdjMƕwu\E0ӈa̯D1K!wHqU$!2m2OwIT` i G^rfDsEGTZ*x9wL=ח{{eUF0I}j+zd2<wCuHou`TnOAOo"^VRSmE޶#}~.}}ݺ1ni=h:U18A%ⰬUbuWjpoUe y@GW1{#9uۺfQ;ܒ@rbVGa+M\?qd$jLg[vk r\,ys#46?>ml~ryNl]ҪFIۤدhjur&tp>L.LT[=" dqG”EIx\9zos}œӇϲ76_meU%3fzk:oiFӖ\mz*_ڛT%ޮYJi.&0V\ wYHIXWRHITF,GKX[BHf +֥roAcgnI})t_9J3.TȦ[7BOlڟؐ5/.='YhW +'7<8keIj6>RSVǶ?x k z}%k]ɀ\vؖOj_ߍfCZ]P]=y F`b} M+@ƕ2.%F揖odKC.s> $tI)tucjW.:v1{f%,h+,sJlyBeh!7jw~}_`T W[RFF-t ExcTCnSl fzˉԹ0(m_n6ЇzfNeЫTS2jR|JM+c@ܬˆ=FEUqȌTz}J=OoӫyR따5S:\͞P +)iK]žTW˘hg4-xYWOHQYL0^ %L" Y47zzpLjx(}}^-9{"7-{hA7X`9OC.:VGsMJ÷Lܕ%gDz J.w>5( .Ls ./uUk NzhZ/k1܆iMCܵZBTVJT/|{}e~~(׏TqPrJF)0=]Vf4pT;Tj_nPtoHQZ۩N #,WB2Ȁa;!t&D`d'gƚ9hGф":DgDdϛ@!;"$8MA,!yC2z7]xhqmM2d]y- Xp,cنWdqTÏ;oޠQyEg|ZfnU>>N|/Px/ѫZM%0kp9<=0@f8xC!'ĵBâE[qEK\ˁKgo8z;O!>:h;B\&5XW!uw㗍#퍗7EW* ׇ y{p2yE桍ۥ(t|S,už˖{prL 3rFWj^|{3563=L颁SPF3s %܎gq:ô(mA?9X h׿8Uvw:ٔc2D?dLbo~6N"* ;xc =pa\O+`Iׯ8)xZ~VGji0}f9i,x@Li<C0K<I -fB!nm$jpQ`Ip.B* FcL8;Dkwg~l6|9A&|)5S@]ŎTKA4[+b9fb6NSKi1L>/@o_k>?T, E tĐ)RLUm$l9,\$GfjN(k\tVI\ E*D>!=O ;yuFtJ1E-h>Hze6m¢ wOwfS9U!b@4H1p'g|ztqTqh TtA*e\z$eчk~@g7`zd1 Jn n]~BwAF%w6́nf?ߠa䵃}JAlcjՂR*\i"|mrG ꈚ'Adu+%f.zHuS 7Bo~2fmEWpk0b00t=䍾쌳^B߃)fҎG;Jxow'y͏͹ T ^nt}Q %GM8S׮w节z ">RO(X1!Xj^ f?>s Հc7?}P,V|4^Hje|fo\./铹w 9z\34;ppe= ԂIOjV7b1M)f?%X Z&^͂^%ePfgԠC`¡hzs5qʋ]QDfH]˒6oEY|A /ѐpx8"W3f x_~N\skz ],AWϢODA5h=3_B3"fDHc.M@?jp}wYr?c#G_'2_cVk3:?$XؙoorM_~ BO3n%&{~ao]Bagn}$YL|lD!Ħ όAuHJʘЅ(]hM1;Y';KFz%{&*$"qq>kcޟq,de'ke3ObΞ.qq{zs`iOͦ ʦo kj/A >>w^r1ghhU=2]:pG.8oߔ o&<5O!7v|YX>>3":N KA}3Iz[\]vDlzh*˕Pw PH/>K'؀QMV 2"[\., B񎙙_8ЮVw m[aʐ|w;뫖5C|x$\6tcx/;O[x4 Mͥz&]c)Eo~lO2x1y`{ s&S0[8m0hj\2v`!+I`iQffaUEU&4gӈE@qZ#lʹۯOʼnmMT>v\ f)6f@uTO<&*[\j6`.A3dp&3g5KPuv6T1?XԬD1kTlo~ypSI*m>TNN/3xÚgTKXbj!Q'{P{Vlپ~vE;V=+1/G_sNJ5 ɦ7{AU$à PT1a٤>2ܲgdW4Zn,XHBOfV(FolpԽn{R]t\[e@{d(#& w)3N/} 0ɲPDci^cI+7x|sQ',IetQ5&kΆ\#2ׁLCI>G!WMhw-j%;{?{ԏ"F)ٿƽD4&Q?HxDEg}1EnXk8&csLuen\Q =ۄ m s]~v6cD{W_-ǎɢjQxfJ .LR2x bV9j~elGLbWq: s4SmVLY{*0kt#xZ")(c󕸶vKflNXA$ jX<y4 )γtM[D^pa:O4gwt+v{:FN t?A%JdA e˷gwPJ-01 c-;}M qr_}[:?Wk8"ym"NNҴ9SH-ˌQ^7 Lwysf},{0\mSOl8ޙÝMε.\cFON=U_~Tu/p?vĸ/tʓ:@bDԝq &0L6dT R|e'x7vRx xl7J a1rCfjYbWĎln? 2$zJ$q9Y Ҋ": H=o<-G_iy/SZ̡*Re`T'FOr% Ld%ۊ>sg? TH6,Smx Xt0\'6} (]N_&0sS~K!/q*aNnD b$#giDr9:y99d[Y:o^jfrJ@zp M F/!=HYe\x(I6ǨũeeG9 Lzz#RԢVa5'mLKPD=FXV)ҙfQˠlOxc`d```ad+`I={&r00DC xc`d``c @dyyxڍTjAݝEW%EQ"sQr ^^骙8Q=]Oxh=0&t :%PhiѲ/mWx0swcņ>x, !U&M{4ҩ"/Tr'}Wr; w^lhόrscƇ)ѽ^őrDȷAOפ[S-U1>{qC˼ty8TllW3=͝;fy^Ul|8qtg_ծ91\5w-j<-_ިx^l޿-{5"kxf_$pJNyD8/i& cеzs^. o|?~E}|mL>N‰9"z;V0ocP=l8vgSYFnARџ! ՁYf5>ٟ&}j?[)kmzRuwcĦfmf|-?)kvh娀SD?|]PɯC{"8[Sn՝ÁJ2l~Za=׹.|({>gSʓv] ?ɺ~4dsG6s=Q_h;"xڝS`22*3rJHTqĈ)PX"23GD#2S\9"cDD52FY)GhdfdD :m`K"j9QIY@QK׀s3H3 3Y™S❕38+29~{n6&;:17k.wn[lvq0/oZ@c0q/(f][ ψw8^XІ"8 ŸJ ':F,A^G-^ZLIIJOI'M2QbO&%&ےY1oqqdjIRє[jJ*#UP0 Mhi45 8222g:.]^^X>A[_!Gx3޿Rs+Yٷ*kvU0u5{u\Z#^c%FYkk;P2$O~)@)dJ:.*Q}#ٍ_i`r鹢\Un[-7Litk#x#{c(O׷IIollf1 Ζ-^&Y ja3ւBI!PTY*EƢ ̑qɭ̭n"Up#(Ly*7!>?ډY' >j o"YUL-)K2K8%ҘRqiGi_v,P*kb'֋{(8$0I$jooEF|z_>Gefe~~Sx 倹:[ K]12@Fir\+iŇ5###JR D4橮79ux<φx<y|x^/Kerx^kuzxo[mvx{}~|>Gcq|>gsy< _/+U|߄o;]|~?'S~_7~?Og ?_ofQ`se`k8p=wpw#s0{޸xxxGx x.`Jlc$<OS4<7 7㙸³</‹/ «xhfF p#[qNE}܆a˸Qh| >'IdoSix+ކx'ޅw=x/>g3YlsA| Eb| _/W+Uj| _7Mf| ߆ow;]n|߇Ca~?O'Si ~?/E~_ůM~C?şKow{ƿ_ow YyQEQeQUQsbX/U&v{=^boW'A`q8T&G#Qhq8V''Q -!E[tDWĉ$q8E*N Ilg-,q8G+ ą"qD\*.+ĕ*qF\+׋č/n0%BaB n,,zZ7Һ֭iNNZwӺ%eR-r#4m+*#E.*UnL(FFP梯~Cd3-Fc#ѸFMz}-ڋ# #,o#gTi67(S W>i11&ĉ}EBfC/ Qme6TfZҾ=̈?dzq%3Τ3 )Ev@)Dda).#5]ܟejLZTڟ*^HW0#fȢ%*(x9StG0cۡ9)nO`bG!oV٪h8 SÅxRrZ;$۩SUށg򎡅 '6sUҷ[뭼-tLxӺ.&ﬔP@Y60& r} D˅SHnHWS5.(ƠHaNo 9 ZH̓"dPaκx &I7kQ+1儃 2otz5t#>:6uU?޾}g+KQ ٍs;̾~xm f&<>4<PSx4ۄGˆzڶPhȬp_HOqz=QOwd6E +hs˅ٶq|mԩǠ^ 1Ǡz ւFl5hrJf;΍6.\03Πz #ꌨ3mBZ3k0kJM^Ɉ&#hۜNzC钛eZӚ'o-^ūxՖV =i%$$$$$$o͈6#ڌh3nuƠv=u^tFGܧZ1XaY[(Xe_oS8s@՗깩oy5#dx*LTUwdT.W :9@( EBL0TP@{f=usF/tsn.\v]W_]3Ojۭ"H&~?ݜABs0֓?5;8(w1@X%A\8[R`ԈFFԎQ5hѣBJNP~D`$3 Wg,Wg{*Ȫ!ӌSHߏtץ?+ɖKdSL7Ol#&>щ@K<6u'﯑Wrq*TuF8 ǰ1f㘗T}UֶI<>"pxxy?`ByZm?*.XVnjS^ςjx39@7 t :gS[Y>&,8. 5)weeII 9^wjߌd;Ɍd')<$0[v ڲ~fz;NvJ]F*S=bIڗΟ7ukϙ)L\wknvq =#S=Lkx#k䃪!d̪/U+@6NDy֤t8ڜop_@U H % %TAT3I QG'ݯ)ٻvO*P@(&ىR'iѽiz՛buͩ}qiv{=鸇cۚ6Gt'8[z;Xзtv']Ex1;sԥ&|,EYP o9ڗ e7[veEh^YRu$c AC5dNV:ȹDmH+2"rlI?i_L5*$յmmb-ڨ((`"XD"@{BW>J<@[@D#ػϔavpixd0ȕ<]mr+r{B0_;c%`uC]lc9<4ό̿Zs>݂r'YǓg~G}.r{ JC'ީk @@b줂#ĝ\a6'Db)-g_?[͓NID`& bd*$ <[~k+xݴ$S*(?o]$iaRJOp~#|rKQ/ؿJńaIvۂ8?^ meRӑW,9M)bP.${i.4Vƙ2P{{7ܐ$#➨D-yF Ѱ i.Z-puLOnjWz=gSf!aoVEH쪞3"Yu:)?q!7;~OWkG7_}V9f(oujg;\ՂFj(( /T-AvwH!#L&v5{G<-w>̐e4c}>?_xwۖyxLa&&ZszG{||̖U%+i^jpśZq0CP1Npm9%*V#[5fc挧Ӷ4?0a8ݤ!,fߐ oѓgx}IP RmL:L+ۢݜ:Bt~]7]_1'm,uaU3+_s~<<<c@d)doe*27,!I8": v#>QkaS~#b=B=|9ee!d႖pפ4hhPP(1$[^d9;zY)Jn}!ܲ;qi+헄H"1$),&0,7z(٘5^7Vk2)AHDk?(Zqhю~f#Md0* ߢ)Α*UV(_jMKe͛s=i劈bp\Dk_VE,fNbSY1!Xvy Y57I,4 zcY=X0\K,M6GmiE6LH!HK]ZD˂kJ&G]]1`,#4Ǭ5iXi1+ID*-*^qgRr X߆o}[But_~D"2C2}7sS PxΩt™8 D,hcbP#w: 7Q}sü~D`kn|/|&*y0I(rlUaRWuTLi)$aCE.Nt_%tĥҀlE @pT0u0Ln\U:56q{cHj2~pImjh`pGbx0r,6juZ/ٱAxOahkhd&ܠ 7`NҵftS#vLU ͣѭkbn 751c Z2%HJGY!JR@0t_|f cjMkhc}++w&Ƕs8J{oAK&Q m~+LYjao2ܩz U'*"Mqs^ٙEZiȓʹhSiΖ3VVYkR<NF:(yPuue*Y:YcL579X{k Tx1 .^&WeU+^JcʚwQM)?)/)qHQT̑Ո5>%ͥF]Ϳ5n99 /8REGkw ͦ<ԎKp֫g 2Es%f %U> 1^鲊O[MEO_C9ѝƓv,P /t]*>F7U<*n&WM*'<%PXUl&Vq 6EDʌWjWApD4jjg>}k8\)-yO} ,%n?)/C}*PC%T.A"]{9\3Byfbd>Tm}ɴ}T+񊷶0TSYԽm |]DGF_$rňIW\q{I dzW`w4Ug<d"UPII UIԭC_GC+}%R!yC9Ηհ 냥},US馠mB~cH'SKYSy0ZƨYʛ~V+F<7Kh&mV=)kxqӇc4p_sfM8l.0qW k,幹l ?1#14N/?E.;Үt^oH 8X^6uCLdY;̀HCY`x8xca`0t@@|}RoVm%Yw?ėw: .^eZ̖-GeûϪ,7aý幩bU@ѪQӚ۹gm~bNkc,z/\M5,.&Z|pU=<5uL_[p&4vL9%Dr 9Ζ'o`ҋKFXcm 抜:SsnݏOj{4 D -VB/&8~ w\޳FGL 1墒;5uf(loN8 hKbZByCN@@ ~06.;TSNg-vWy  AއU8F;kȇ;?uW[}u,:r4QHE`SpAiǡGeͬÕ[d}6ZZj1qtfiPm!,k 6r GԹsm${,C])4`jKT/-Y &C{ ['ٲ6LG1Ly[hr؛:)hXT:æ"PPR<ś azoTQ+a-o9+f֞PćցMlͣS,}FD$sKm6tG$ ~?W p6<3#.NS\5И#|T\o0Cq$7EP"vI@֐RNiȯ= 7ܤpMkpFQ5--s@WC~Y Kk <7IF/{",D|,KsX2Z> 0F1g"'T6*VGV{ ٹd2Ry<H dS1)x¤2av0Ğ+B " ~VQJCLJNVR,Kc$ֳȄY8RpMG=|S 'Q`~ y4<JNܴi#f~#* uͥ򶆯 ;cL]tAGy|󡣃: W?7*D3ߔ* \)J)J[ @xӵ tvu18+ x9{, "t۷ܩ*\R ĈP:4̛2׉ۜBd{cՆ ZquEKD\Ru<:>[7ղԺڠjM\Ri

    {K!d3_dz#(J𱔒@g odեw܆ķow.Fсp5 &cC#JX29[*]k_@\]C%A:dJ/CeG߮w[ZI4R]_IggæceM,y8( yйd;V(y\R B¢,z!+\FeSBU^8O\Lm{Zd4zZL%[+m8ќ.c8-8M[=M`±佯l8 ,K8LpPDd^Ps.`KT q'dQ(Y=LhNӴ-lEh1Ц!Sn`[@w Z-VehpO#%$8a'>d<=N-I ϼ ,$ #D]J ħ0`wXk?;Hܻy #nxw#RZ. TS+XzϨHw,ӏtWj ]ep)"7Dk(6 hh{+akUMeC:8S8a d8jsOzn)ś _ڂ1PlYղO 6^j= ~տ`iETgb+Ƅ s/kn be#-~r? (+ko99B\ut!VIҦrtV7ڢxAHp6C iֱ[l6|kϧsz[:hz{p/Je;P/p޳1}ﮇ],r'^k~U6-mpK"W\L )b+Lȥ_;/Mqr f'[wwѬ "V"D~L$C!jB K(*MDp< Es)RKn [@,؇VYy*A1e:a%rB~JHnbG\Ͻ*J]>! P¶'ԅqz*DJxPwnC<5yF%X4R1 )-ڧAzSO60U_lr &MJ .((\v# d@Tdw2~}^ m(Q@لR`iP f}j4z" kLBZKoDEvH<$GL3%FS>)B N EAbSŴma? :bz]IT3eϪp HR9K,>#g uL2ÐiZF%U#WYa@1nil-( 5nmH''MPj9 V  Cڀ4rl+Z#4E\־Yl8 btdXa?\u8g@ d_WNCɀ>+xH*/Ll<$ǔF0CK @0p6"mokw88JZadnUnrmY9T ]&U4Q 8JKd:1LN`@,%78r,*gm>i]ZN;ٛ\X%ɪvEc xP_.OG\QyI)3]0e]UطxweӢgKzpG`ӫjid,ߛTU[ni8o@-_Mgg'?/m,mz;:ޝJgؘ-TydITV,C askam'VG%̰HbI DDj8CYZU>8#COR<Ac8WKΰWw8ZI)FJIhOIW8,~zaB+ {AT!7lM<]\M7(Um{pka `"ޗYR(giĽ fq_:dGVzuh >(0ZZ3 XC?<$z& >^Bl ;MR!y2cnD'gǭoGY$di0EK'{_MaTTq_uW}`'Eg"z^;ṙX2F5zEоizzãK4I+(/woɥ})B" VO‹\(R_rQTIS ̄"D*孅b,`nlOOi#v<yWc> vǵ.Ża:@K(SX3U)s)1;Q{@ӛdVbv?%6-{,܇ B,Ϙߚ@Q::?b|m uςyK3>Z"|-4V¬i!<@l񉆔Sny\Lֻΐ!/HKZc $(Kږaf,O>K%.҄`)\ suBcS k*\kkmxfMq3]-:Ď{[iaYXpTerv9+-sr#Rˏz^HI?J76 I ^1P..>`FغPqqX.}b?Ec#(UmqW_/E&xdsISOĺؽw0U YLKa@ēp4ۢ˖ۜ*{johM wkٖ2QWQ:51|^T0z/;3y%Fҩ䭫tm!^Tn+6bUup &턆AAV=]]0 z fQ[M,⧞ܴYu:S+3ձ#1bQdC$ SLb aaZ5#MU\c9gH+@-hN~rwVמ)Cn[ZFpq(_oD _ ,J 9 7> %X!*RW>'XJb@Ͱ{haۋI,a\4K|/L20Kck^W/A±qklGXsJe4UHKS!at)CX̆!=VU{ B}{ Ċ\j f®oD3_-9<QN'UH[eaʌ=&޹8P d1h SmoّSN@/v5\G aan{S}7N} $n5i]zcs!3$2;[>bb])QE>>`Hq]esE]Y0Xq.Bt@y #-77~Rq}}EYk O"o?-gQtۿ1us(O(TljOe֬N+~eK؏mФӋ](:tǟ[MzxWob%tzKiMt?1w>(]1 4S&@R ڧat,yٹ"7Զ0 ;]FsfB)Ym sij_t@>ec.q]ϝ7`R !Ǝ8A%qNu δ 2@\pՎ&?я*;أ$н!̀ҳUg *B7!.;kA?DDJwF:5eȁg<̰!K&bX'%B',:sߘ3,vkEm̪VwK)&:RogˡZڽ*Zs,RFy*&om4|6> >\N:X 4=3'ᣓ|5TbXγ>pULRU+;GDyk5/*{1,Jmͤu?:$́;&CΌjRY>=% `Tۋ|kMNt@n`1D{wG rSZ#/25H9 +}>ac5֑玙d-Q/']f׹?z?}!A>z34idq}O7x,/.Yd3 pP"ktvk J8=F Mߵ>&ji7+9\p&qGrGOnב,l{`>؎fo8kff7(V  6kf+TvbD-ySMW~q,-;oCj=յ[f)̎LJɉ 9cI$UPR Y+E8;+,T=2&z~; 4Q_V|> ~j:=&6쁌ӼIQ jA?ns(NP3'(]SIsK88-y+.+l`0*!j%[M8w06;Q#cˢlurf)\΁ҊN`ŁթAwP XݝWtH֜ R H,Oђ0t@û-,7+8%NT|!ZefaUp¾y`nQYhh}qI5$(oZU]kB?~ߜ/D/5AzvNP, Cky"\=Y> 4T,mp/C>w 2M,=ddV?ALZftgXϘqM3]Ċ;g7^qDX eHC:U & @~;Qcpk+ضbQk,0mJ@@`9dn~ncb([[`uz|3ٓ2>C=n\AlZ6LWu҇G#ܮ$a)h 3LoT9&yܗ}(2>k!AH C| n&hd 5F?G{ bs9-_WK˝hii<>B/7R|Apۄp5k-29>4j*۳aeiv=JK|mkgC .CFh%|_#P,w}]2ްA&=67)V&gEt2o[ wXzQr;3ߛb!vLL3>8C+ E1ن(;tҌW>Au.%nRR@.Է/jy31zb^5BRa8|;ONsWKKBS|ӻV~Ëg*KGcB)wsY n_www)Y0jv~vNln5Q5Gҧ¡ uTɐ(bL q:CPWdIa"fT1A3<pJn&=Dz4=`&<Ņ>ë-,b3$✓];-I+5QF$dc٣ޓ+vs*Z^AX0g"YJz:V< U#xNOFuAy1^& y݅ g0S\6*Lh63S/Ym5aѡ,[^-Zv,ϔ~嵾DqHGJZ9v΍{FB5->g^ٹ-߲̑$oPׁ#Z֨Mstb[@j_1ˑ˥>fyIۚrbVe ݳ!z:SD_C%f^kvOtnyCjP?*t.{o88|p)깣EOPUs>1U0%X{5f#cmM&:%8?` v8q*+.g6+O[=6 !7_ɋFIWY˜/hLVLKDv =L2a"&c6+.JZk"]SnhFd=jfx&a"H8L1t.-y8GeYQẇ`40g`K%Oۀ|f40%*ꥼ-6] ӑ VsH۟2T rfȝ0g=0un~ӯrG#JIjSL|;)Hevqt1Q'[]zObȁC=^U@mg*nqCwX`z85RF#Dͫ*,z*$fZ,{4+ʄq8etp>K:rHR|*NRA5w #ZxR zrNeF"b; <LĩWYDċgz*{ڧ|,T@lQ&rF#fVݦ`E9OՍ>ScN c%S:tI,TnZ,A]2qJ?B) 74uaLzEߏ 5UB>ffҹ"*xR|w蠗L_$#2)I~ٯsJ&n~ꨐ=OcڇGtMPN;aWpW@!c {Zx?CT,>sEO^)O[?37R`ZSY˯ _8J,~'@vJ^'ʱf+QiWJjAt%jLb ?"u:u-\?QQ5@C#n{'ZQp<{>tΉ[ym^zѾh+ɚ>j3ɜM,ۯ<(74Fk;FWY+10.39tzhLxe[g# rO%=U¨ytg< 7(^BlR2!&\õ72O΅I%)KJ\6U\k%=[z]kvt|Ԍ/?l?:_|tT@'DZDv' PHbj7=aԬUUGsnʱ65cmҲUf6PC8U" e.oMÌ]9 Ⱥz:D^}d]qm$"*!:&4#HHs^.%"S-YXnw &= ˊ5uDw,7PbE{[@l~=)pk떔 f5Qqa$ Ī[YE!Zx\ãrx^ }jGJ2em#x<0BdC}0545S@ -p <3-~B\׶#7\ܖlgP.uL;_uOǗM]F\+#Soֵ*W~09Y4v߬u/?T:}Nc/?zo}H491l/%gs'oa Cdؓbl2ЇAip_Db6,qY̶Nh, A|`rۺBq%(@%-<\q @Tǽ)_9F95H>А2fz![5-J' QLJ^v8Wp%Ϻ" kcq_WIHJ"j <3tK8^lC ]߬U FX&xl|Z"qR|7p @̣Bx| 6Kh5?@P>4</\쓎<F}ĵwrc)uf҅6Oh)NBO@V 1&W}B/oO:k:o{F QLteL*xJ٣K(hJՇd\E$6wru hT ?V&JT)A] zD_ 6_Y;zL';Xpe}{OzoGUzL0Ѣ |eh&yȚGŵ~=rBP!8,lv0Kf_ N;L쐫Pƅ0YM>󭯾,#@!gAM_#{y_]Ĕ*Hˢ^R50 ^)qwf9 ??7) .:'on0Ga\/c > ʂ  U}C Aq@rMdZQӐ~"Qb< 8q''';Q-FdENr gSS;[XbC*_lsSuJ!ܭZ4hKUDlLu CLZ !lÜ"laj̏ʇڟ SD,L-,QpJ7`__-ݟWf0J(j>yi+SM i{IqƻG|J׫#r'gZYjLfhM9d#]E LKI-fzS 5,9 2aV0nD;}'QUu=lx`2xm ;pvM CMl?&c;5< n51uܤӻw4V&XQ!PT-OZ e{oX~Q?j7AץDGbP?.{:W7v)v"'jͦ,F>9`%Zy ;b2>/y:JAE_w > ;(XquXKwcٛ/?tcnUlAUJ(vdmOXf˕B ]3B=B-9,|! ߙ ,ݹ ;¼i-uubYŨ-S(G͆Qz]6&~9 <ŏ)WU;~u X}FFEc>G PBPal4!r, clH,BNQ-po `V^CI6/B8!\EpM>;{b:E w|*݌PTp^ qЉN. +*=PET b:Ut}O3U(Wpd^PPSvUi2,0՜2ٻ8pT/4g]S;**6 O6:h#ZGhB~iY:,lbܑp^u1फHp>h$fSR| <8?M:+2Q@"RNr~D7ivG;m,O*э5!M(_)6Hs)Y; F8u=:`'ʙrý]JI!t/&GiWoԂꗿt<%j3\_kziⰞM!$%K s(UC~]1g}g "'E}(ޘFJ<?l#Wx.^S2je(oѵhdꝻ5*_fdhuu?scEcI8cՋzExLG$'RE8SS  :nFg! 8Wef?|xF "-l Odau` WIa|sQxgkwFc@ͽ6G.4=*fj]dߤͷӚ%6UB= 6v 4RTӛwDARi8= %pUf- !C{Rݖhkp0/%Q@ Z s*k,Xj5 ıiӫMꢝPPcX9WwKNQ2 SdfγpKD㾀Oqf&A gfÌ+S8w3003R[TW/{/]#c.K?tmt3ɒT8-%d LNJځ腥Sd|DUO\sNv&I°4hJ%$PhMQjݸ{Ŝk0rNm6g(ӫ &/ :s9ԱtJ WhL9kNGKr:4|?#\ҫXB 4H=nAQ~d[}Ϡ1 M\#G, Bl, ܻ͞Npa~`GNk{Ƹ iN!N#2 *,u7aKPVNBHX= b^U, UiITc9֜Q9\FѯgGXsCʟF[JqG1Jʼ7墊&7ձdYX0D}O]f:F{y:9.@T1p Pxn u.O9> 8x*8P七R`bؗ$poOf%eݦ'<1%-ȓ=;-x6G==gI򘧄R%v9`;P h' K GCݮ>Ի_'[skC ZqxhqopVp2nտI>7]y!%+4TI(?4q܅H3AE¢JT^1vEhXElzNP2XTu}5ۅDc5`ߤ2)=!%.h[C; ifi}N2k3gzꬡ+s#l'%0rI.qs*z{ @hhE1S_/4QcH4?@y $0uV`AL=ֽϓTX*?z4&}W7k=5%H{$%n\4󌌃߿|WC9"g]XсOp L~EqZ JЕͭ0NX a 菺-VTbȖ`DS.ɀWWHth7yL,֋S}C l4]lO ݯC?c=5\JK)UpW»Dàbf~~Bkw'< jc64]F<'Cj0>i=Mټ DM>Ͷ/dU#yضD@7:_Ema#]=gON޷H1Wǘ-*HŴKQdR8Ims-" n?:\m߼[o|b1zCon~bU08 2,;w|CX~BQ`)a͹V UP+9 !hDf́E29pp 9'b̨b_L&QKI&a2bx a'a6]Qe8AP  U[ DwYx`P!.QvyT $Yޝ ׂܸPURGu:U`0)҉RYA.5뭢II@Di]b*vr"[e+Q_GO`(d+GAUxߵ- F9Sl=cԙluRX.&BjJ}َCٕƈ\]ucv~s>{V d^03 ֍ߚ{N֡G5MRJϪ[<߇`Ձ3D Cԟ;oR ]lZV{uBj-j ٭X4ͱ  3jK?r4i* L|ܬ0yrB$CFel/F@~X D * 8KV:j#d?yG)KAd|zu<{ a+Nc4:X0GW*S/cDax7[C7rŸރ VWoZ%s4EFN˽ mϢ\0ϲ) )9 ) ]%<}N5}tT]=[=jү__9Zwp,|nٸk (w*Ɨڌ {x ?)gc=HJ|NeR_MW&pU @DsjVoq MW2!;mٕic΢oD$E0]O$l$}VV;\~]S+ZZ[k&'ut<靺OWwm"*}YQf7PV8cje%btLb ߈Be}32 #2d.ش 3)B> 6U 0c;΍Rm=HU[5Xe$eZp hLR@~@t([SY9xW'bif € 8snߌ`uKG˷#4.Hj9xKhOe>nk+*k1օdX<[)ÙϖbRϕ֣z |ͫ< BG_OO'ž[OƹvyX+ݻW\RKXar]/TL鋜aam53¬qrn C`K'aθ"Ht)~=`w82[ADp&)$ &Ey>\x`ik=a8J"X>DCEny ǫ ! 9gg{r.! Vr Lv E;DI!!Nu ˫`n~ PE Sj }X} }.w(܃?n(𴖖4 !p`ѡPM0/̸$Oq%'DDPWM@ȝʽR) E%2(d ul #a@ZrCC>FNyT(Cա PSٓLp[Mz :l EN0ӓ`yzpU|P.ƳxЄDK__g|6VmCPg}+/OD8m͕>"t oH#=$vf;r `ef4X{yR|(;/_ެ8|B2=Ѽ?+K*c}7nĘؔC6*qz/yiP( Mr0*oEU8aE#cleߚ6; ݴLͭ+[P;ueUVtx( 98g.RYD]$3 j*B ^rDc2KR\A9 zpG߉WwAۃ(Vh)-<+U8ɫY}^6*;'WDh'q^<ܥ>&:bF򨆄O*\Q:|Xު xK7UJVj`e^zhRm%;WѬjMCRx孵3D3<,>'FIHe@jzR:rcw/% Zqjݖֵ%]I^󹣣l]5v 9&"41r眏;2+V&R.TJOhWzRMDuLKVOl)џPp.qF^ɪ9ѝ*[p(J3˪%и ) ֹլLLX jVx #G^rGMiv'sa|mo-TB_^^D˅>$rG^~IT\= != ^YߵNZM}I^.|2Pqgp؄ġX{]8Wrԛ:6<RMlt vvwavͪ%a^ R+%c}E /^@F*׮Sp&$:Tsr6G0=iŐ3}`h!z;S?][{ |IK$6_2b!ԧxT.?µE_{,$/2_#K=.2JZkshd*7޶LOwa&̌94JDe;\t8e@)$0mb}b{Wm?hks6Ua^{8mJ.;Ec+~рçb KwA}g\xnO'(2xl+~ʭသ : z7h:[Lv?u@ =+Kb%9-ԒFSz"JENKd%ebv,,MIKOP3gHOmj| ĕu5'w M H)|aCy'9:@(?o8/[T5!"uW YHSt^ts p9b-԰~x[rW4/ii nU0 R.Rn`0-Y o O|wijpR#\ЖT=c70_ 9juT,#f(~9JzDZcR 1)ܐDs۟fy2q'ga_ȍ{3?}{isb?_ftk%[S܀%$Mplӫ"K5Ӄ2 `"^)?hMAWel6m5r2{Lo)ɨp(C4+,hW]X]ցfhFKgD)GƎ9|)҄?}Lr zR? {T'۴ D=>$hA٤/B0bk򾘊  0Uҥ>sćFe^K)N3҃#]:7 S<ي./ 0g`^qic!G2(A͏6'hb9{ =nWỴbT/Ab4 $x4P{ԋsx={L܎.kxÜq]d8nzG,|%Tjoy!i ^] SK2gC5lj$(f䍌m 6si?&HXsOm .ҧ_7׉r0^#vO M HL$b~ Ê1~}^sCs`:o(lEbC n""P 'SYg¦,ׂ A|6Evм~ٻ?䴰/; RiI-An!?j_Ppz]|,pUW@8DUӕ[3[K䍎mcⲔn@1ЅbͲ[ݨUH-'>%4ŊZhuJoH0_& ߥAPd[Nܭtoi\ >Ї#P NYc 9_<yH긬hӛGys`nwwJyҩYKj"qOo feQtn+piX d$6Q_V,?Cb]L:2PuSHn[N2h%TT vN@?ۜ>7uf)uߛAX7kr9ؕQ'5:x0 yv%8-IxscHRYlF:[e}_TGƮ{;9 <2?4dX>39zO(j' =,rc_u+MP } F\t&ґhuѦ2.!-`  fC95DŽZ*jx=a<0QP{60̘)E|apNS-ґNku^롖Mh4*NmR9jEcJ6m~ќ_hbC|<(?LRB^l& !uNy2ۺZ\;r++}\(BqOjCC=( 0F]2(^8]alo(:&vE1jl@P`  LPb$h{,NFd,qbq 辶Sd!EE癬Kq.ybԂxjDX4;>b}/o6+\MmK^{#EםJ4f1ϣYšpXsЧUJ p=ϪY32KdJ%vsLb?BwNtDgq_l5ﲙ FO%ELqWE.A vyL7eR*jGp4HG+ׯ4+)[7ІĤq+U$?)9B?jQˏk?ţ4D cbqF`{~8?vBO'հ>fjG+ߺ!Tr*#qL+9`FY/N5l;Xȋ]hW&h{~hП bS&1x Pd~ %` .nd@EVi5b_34(ych~ Qɪ2"3 ܀V!ixgSP(+(""bXmн^  mMPVq"^d7 vgH_W& *B7btZٻbBg/Sz\ּFp # x)s=;}wFTԩf.(,[Mhp9-8?Z܄ ma=T1̸hҩ?u&i>*Lenj+n~%UnH4Nc 0|r!e`³ VYGW3kg5Wr`yhZζ\:}@c-7򸧎ZaGv2AͲsXi$#>m]9gٴxCT#0_ykΊ9<S!,`\d!Uփ F^}]j[E.I~*'&H=}k4RVuycoށvQnz%w `t яX2+`K cF-G[B#% :/:ɺ )qum숵JYEZ~4;rg;)+d'XW%/I[o?{*DY!׸EȜ"HM" #AW*A7RG+ꃸ8Zq޵P֘$c]2NxQRzfGU$sPC^ GhxsฃaSy7~=ߐDe8^jjemjSe.g7tyW+-Ӫ {@`Hʄ<;Ґừe1AX6$;/0M !<{Q؋́9j<$$w_=ۈG}X,Xqlp2r b\~mQ5" @>ݳukKneIfE16S=RW]l|5ءJΛQ<4L{DCkdۓMKEP^?"C"ARxeM"ĦuB 8褐[Es'U0MD|GdM ')`9J]{8~N\`ؘJ@.MM(`P@4~F@4ro?JP!k%&шRd+[LW^u$ J+b!XCiC*}P0 Dګ@q MS!utk]j=:vI\PGA#ES1 eK@ZELpe ѠPQ=(@{V:L~?L1D[,Sg̍!'b:檖NoiNMOknIG- )Ocb[13S!̄r:ZY6;E>U. w t0' ׭^cܣ}l_"j rXN`37nVbe8ozZ4J٦[ ߷rbS]r7Gw6pemu2G:fL8'R7ܰlQ Z>U- ל^d(߉U^Zn 3c!w[HbYwЫkk}Yo"kmv_@}k׻\2X !A?Cj3:i8P1: k6JFLY}_z;p/-0ApfW /R'ڛQUp-B3eY]ȃd/wt〘iW ?tp|>}ml< x NZmLZS'@Vè#uema;$;vInpK X(>/ 2Rpx2I-V;B:*?rgVL(ԗTEQHv ]NoA}##IY|Uz:\U#U*-F~L!)_;E@5!?[=T/`WY  T 9 Em>oe3[2wGwݲy@5ׯ'J̿ke'#n7-Xwb_%_=Z8xۭ<>;O% QyS?0:2c (oԬ[=}F$D(Mf(D|0F~\:s(X82OO؂H79TB5O4!s̙Q'hMYUkH#:eضY| 'Vn4*) MzE)jqOjh$$mPN`큭IO0\p#5P>#"3-N͕8iSRRYML ĨjǏqF#Th{ma!b7Wb"^Q(4fj/m ~ 8xGnF PjEfSMʧ Q]c5424)wvw TdGi]N3waY`Jq*'Vs ZW၃ n.:Aۡ⟠khQrq~AWZ#?p%-GkY&"fup$8h~ϚWyrH{Giʩ$ݑ8O3u\/K7Y`b3/ pvcyPP^ uۈlP1x#r+%(v 7-S/DڅN'8R(|]bbUo֫2a%ZᇋΏ+/!aݙ[f`_R! j[46sg0>#$Pȟ/o'>l`ӰASfht(皓Բny?Fz)Ɇcp>nv?a͛qͮq Cj͛ MX~^,kweF~=6ģ}) ?$ 'ܑ<M߷J\ nld}݊Aʖ [`hNTYRNjν/ڼͯ.C0AH18"l?Fx]CWZw{"c n+f=\=cjO;!"Rjc|ǐ&fDҎCO/H `kSe&7uH*%GHu.5r|o{A[-.>fzc®|Ʊ}Rw 4L2s!XT#)]T4i'3-!1~_ ls3Irf"CPm Pś&E/̡3_LVsD&*װ/xnjH?9TNC y%BO,eevnSO3޿[6=G4]0E-UؽXa,[*.4ذ^-8{ :BL|WgR6~gs?'Iynhlع~ b6O?xBZ߼:F)`7dN:}-AA7R}ie+iϧ )z>uK8jhWXf8'bn͝}[8f=/ŞAn`iR6j(Udɝ~0FZ'H3wb8E&VZoäitONQטeؓ%@-CP<= 4;xu5bs}>_4E]w,d*|×$e$km|a Us4l c3ܨy.LoN'9[rnmIpɜ ػbQn-(I&|NZΊ v]D|L[wհ71 Wؕ[uHY*I9 ,&~YG/:,f de;\߰bAM|6u JNO?cEE`(ljA6L!C;CH Iz2:^29mγCByB!}Al]J[VGJe'tkCV!T7o+/AY9 c6ok^ŕboj[ wlΧ3OΗt^X?p Q8m| _gN~Ei)[ މ%̳@,1gv~g1yFb+750E Ʌ^ 2L͗NJˎ &ϻn; cb;n2}"P)Pa1UYq84 DWkJB;OGl&pKsJEjC[WQ6Ȕc>^6 `lDi)$mowa,*/wآxxkG9IewE$fԹ+ ĵB g2}o׳Hev!-dgf""B'jO3M v2>hyRAKÙ_HN{fsaf^-vYY῎g1h 7w"0Q}??p-:z<:jۼ|D]:9QENȦeoFn TaoQHna 1CIB_Z9@#r{m]4"fkJ' T$f_Nt8}ȳ9w-->CW:x862yփ藠GLDvMu5g$P.hcT6Pdt' 2ݻ p 6u% AgVn@&;5 #e4vsgjB(ÚA^ 6# |pgGGl8l`d[o6D{ʾ- p EomV} ބDc˛ĭ7Q 8TL)kYؓ|E\(쿺Z^ , FPq-l8dJ"I`wt W`9žTcT-<497[uH"L׏7t'RE{a&LZ|s[*#S5v2 /:lP2~UZoӘbXvSG3]%5yUGwBzƓ; Ȇ Sy `!7ġWs #$d@ϢD ݢB~M_Lm;NT#7݆Guom-ApZ-^KQ(Ƚh/^6>;7"ߧr;TՔ@}4ZUVBΪJt8YB@vwXW۹.a}EĞ = FSd=Vp?꾋1}H=\ 8j_tkn;1;} g+W~Yk]\p`p.ZwlZ|+l!@]SNo?>$ɶ u4N*V8#7Rg^{;N]OQ\1痝MQh' =ÇLb7E5Z-f6D@[ 2VgC7lW?OEz}^ܡu`[t?G {f뢶%Ov=AgEԠj!v ,>Ǒn`tM7E~7b@t;m,kLOؑȧd.(69*&,pl4c(Ml;Q.I4lmܸe!,$N XrܨB0\V29XϋeUiʵɊ#Y&|0|4:=/ u_}w;W6B=ÇJi9ͪpȓ.d><}˜#WsũY?/YZ=K$bcY 9cEg y] P4VE-I͏.Im7oܜDB>tinPݹomA&%1K>]Iu$7&^]_#OS?,  Dt.LaӲ쎘P+r!u_ ۵a;%D*l_{aSﯱY"(UCd[sӯ8v3Ulp( )<=xc6WH&[ I,g-""MHޱGfZӂ{!"觤{mcTzZJS'cmUK3IOr'H6ėreK^Mkd!K Z“5)y<8`e 0yW+P L6hpT$Fy5Մ%jW_<^kc]D2"n^Qy̦J%s"9R)RbveHuS]g:?9Iޤ 3~Ox/>V>22þakz&uf72gPG﫣ԅyMC?׷HBn{6=gl8@WS<\_sNٚ; VnS6w/Ýj1#Uˇwj|@LZx7@]7vnw&Q- nڜ;F6+eg[8rc!~,Z #uyGϡK u#G,Yw42N~joe59/C*F|f5eq96r)dص(w)X3 [sqGĊ_+|_L۟EƠsr[aB),8\qSOSgKSPA)00kNYH- q6}GK$AEd5|ݿOMzROU/07E-xfA GGNŊ :|/GKu mͬ~+*v'. ^C)O !4_cL`*4*Wh)RtTi!Lj 8*<`]2FzDZ+*b?^ⴊ% H8h L^S)y ɞf!@e`ϊDn֤py5VUN AcqbeM'FgŮDqTfj6[ N$ 5>0bǮ[Uj,<|Zo5)t;ܭƃ$yB}@vHlsR??P_^}u۝zaף台4ȳBg1m$-nD?7{!( ZB۱>mW4|r" `bRxoCT嗘AtD]~pMճs.}<8 {橔I IU|>I+xL87n֍1bEԲЯxXF웨D&d5a{y-k<䙚x~3RܔTf8~d(/DS $U%RfyQzw37w3+|8`/k9k :m:gCmP;;8S}% ]ϓ'?˛pssUC>!a6da'>]77k[`~X|C?V3¯dG4k k|8JT]7b+FuFh#Z#1j!Z`]O{4 dRM0;xiQ_VPKe\Ѹg!rlQd'|"88#FR}Z=kI%9=~ys#ѧUo~{;F{Xv<m (Siq5A =lJTĭqH`a*7&C#@p(fM ܽH&NtS16(x4'ZF2cTo+k&`/yDu)9,Q,F)sb蠢pNlq"vIb!E/z}o2#n\ϡrL LwDR'FmŭqRSeŲ+cŠioHZ=T'/5ZLׁ  ?yrsm 5<DN΢qN"NNG"d7퇅/x8Ķ:'to1aI$>^KΏK}ud'Tx`b BJƯ?$ rUC?_WtXplfUcnPge?H̃q:mݧ۶[GYzq78bHdyTyQvLhT)+Qsf}W>il7^8zuy馲R: ܏ꎺgcޯZMGtGs?eSr |o?Z">HSK23; 5>{٫ه14pUkcI]iV.ƙc002L\ 㸌]yw_Eu14*/:p:Mظ5jH0Ӄ}Jď GfW2%UTwi|AqЏߵ!yk;z*8+u߇\u0@Τb(.\rl!ԍ3Ll,x^LFV"7^4v(7 MR7Y(kʓ.[LП#E6s b:#}}h(ޥ;T? DDp9X[z^;>yÛr1s]s،RjGނs+:15_or)/&Hͱۥ;_a7?RV]Bn%dXXB{԰fo |4Mk4e{QF+3U{rNI}ֿnP-;$qLܺ+T9>%w (vI-'@p!R0̯Tֆ~S`o ՜k7N` ewϣvSq[5%aant jD9vN,i+}7&GFCwx0Aq }u^[,=wGGFs%?lJ#3.Z/ɢGP7 4A&?e]tKtV;x/^u,` yXXyT]>E9}u rʏQ+xk?- N=Q*eKdm:{7bVN•3 ,qaooyRv;8Fƛ+S UT:LH k%Ɓl%qZh$ gxF|쿡TAItRJvHn4zt ,*.BM^:6J(,ӵ'gWëןh'Y*?0֩MNH֝#UU-QN-Qc*Z$>v d.<\2.Tlx(:54$}+.Y:*! 4-uڨAq!zT9YV-]pB*S#?'F' Tg~}{mr ݺI\w]Rf^uqը}ufV' /FcYܞPRp*KFYjWCs<.УfRAELvl~maURFH]y)[_#w1Q3s&U*6GX͸8'ğt_1m,x+KgTjJK}S`1I Ap,X1mOnYO/*]6=e0eHre/O' R@?ӯvk##XrX~6Cuib99Y |0rǩc G+#)\W}gh۵fۛ WU\6ulykC&^oty-vۉ'^Li6[Ըpes↥yYq ,੓ԍwB݈G"<"YBNpW5ԍ}zg<׾V:oKC?*M:\̷*_?֗3QmKm*|pfchVɨٲ}vfʏ1s=C: 2,-,ZOOw_peEUXC:,r酕[6WڜB[l먩gH&̓-[kUQ%*SlG$sa7n;I= v`qQ@gRA/ -u:6j&N͐ ^, L15X}]"Zř 9Gvz_!"R- zUv',C4H& f6`׬orzHZQ~@D@-RJ~G8P6A~ z^ó2$DKs^S|y *-cw\e@|1 BfVwmIA"jPmUy^{OU(a,͡8mw'2) b~3?W(B]D25G82?̉u5fg~8Jѐ[Y-q|14.D*t86hǎN>fh0Cw]|VEN]QCS`PԺ6{q6YA`}ޮN41j|-|FIFzhҌ޲v15s)W6^uR[Es|gC&& MO8rM!0EjcHn}sw'~+o0GClo fєJe& hJz<_ݛ%aݫE+'p2ʧ7V(Ɲj; =mb/@ͬnN#D~\W)\vF-*qnY]&-ًkJN0"hFTZm ۪3 owTvhvcvZ 76%F:^dFK)z*H=-[`ɩHʲ˱ik_.6 ހ]ϛ_y@$.aژo7xEcG(Ynͥ]A-G7qH*6 P^,/\(T:$v2ob(-O * |Pg~q.Ƽ>荝N9f(eh\F8#7ބ\ZN]{»# @ {pZ(y*L*g;Tx]ި,f最NH =E([3RBUi$"nE$~\u9{dgVי}177_u\G dHD]' e3!o9̉2 k^ Y;F!y^CgC۾㪳\8=FOzxh $-xP~;6yVs|aUn!|;!+.q9'$>4U`'R s'[1T(Zȋn\:?-a¯8˳;` zDт<^æ0hx#w8i5j.|Ei{ = $zїVz :ڵ6X˨0^p{/4{GE8#C}"ڊ`EF_,d8ͣ!'(p\.fk+j~ԏ2w>7v\"p%":߸څ|>vM-˅ 幃.@Тeog]"w@){ ]x;_ld.Q? 7R/_{Ƒ΍xxU/T'/^kӸ}g39b鍫:2&l٦t mŽ515Yo1ydb=>~Bс-Y&%mtL!b̙0 cqs7Az HAijcݹFP(]kNDG4fc&wkLuLekR=Q)8~l\  !B`0% T#I2v+lξ})A4 keGq?Fcu>W\oi *@zn(Gt:2~珮Ɩ-Ю(1kE"85LYsp*vv"WƸ?>5F{q~VuuY&أH5;IЈ8>-ĸL9,tX CArc?=[_w0vvX ?=ˍ|Ljt+&'[BW;v5?j ]pdi,Kxd*+K}yFap6.hbiM!pNlEȇ?l8f-U8b&㺁T"_ҷfxxrrӦ̅F\Mg5}|@|sj˻tM{X>S+LƄ#cESxs,`sz֘Ij$Uhar s5C_ J*h9dSςBi*!FD0s}Z욡|,[F{RZ?N3n'ݻk: )p<ueTO1(beΈZg 0 GwQJ(jn7_5{Q5p+Y_UY}~1 -T gz ՠ;>cЃn5l hEl1Cy.@So+qD-Rp SiiiU| :#6~]̫DVc팦`UkkuQTڱwqEg-QL\! ̕ <.UF}4=\̶ؙ+>Ya%_\E9ȿz_PQO=j7AJmwҞv[@ٸ]ŹYɜ[.͛8IlK7dRlZ6E'shZ|גijN|:a4=+=bsVvvq֍a5Tؒ(%=iUӹ=u(AxwKj {F{~6x+-:L>%Ɨ%t`u&QinM\*c*ѱJZ]j׀ncj}#  c *}ǏP#yk? FDuJ du:tPqkf`#2ۃ @W.Z] B1a9]UIKp6ý(8 *!խhE>nj=3^3H mbZXzLIu9$:XB{'s,cÄl9ҕr"']rwЁMc4|3M+ }>cٕ@wx1bZ})|$s,LhͲUJعXJڵ'܌%ٵxtud0Gp'eXW'2zUkXv@Vf{dš!m|JGD.H^膀L;gd7ê:ܞp;i*A9O`ܣ߸iytGV! RxxGuI(.$wmY\vcLyY& z:{(_wHyh 9V7'4EikhL& 7||^/q[3ӳ4ċgH-fԁW$sأ?I%nҧ=Nw#ajo5{=~Y K[,oq;qX]fffɨ٠_mcWHOjM!^w3:m#M[GYk=MM4]\[+gxsXµ9N FW onnv-2:I w A8z xUDq"y;8}5=>#:Y:N ů_o)9!Sh(DA0=l@R9]̈ Xh3gƒЧ0u0e^Zp$*V֥MяK'1$U $ +~<B-ID)(E ]u]}g^ƍZF/]3 8/i<_ qPPBVuoi /] I&iQ%2T͟4N#UzH/IAo+;ֹ_OG[6#'ue|YS[0~4ĿsFdBHrrjQk]v~֌uvJdӲveP1醆>dUDZJэQ)z򢁴zq#'qc>l{_IZ]#A֥AlHc=BL 7=4ȇm\U^ fqE,qy@"GRF|уg{=^Rӕ&&cgUNW_ZV%7д6y6X1W @_l'vo5>)M`ubbu EqyUF-:cXk\{.;3G/=M(?dHL(›n?*Y?RE񁄃A`CrD$i-oohZG(fFiÞ8Liia^ PV/ԣ/}3㎸b뽣xjq="܂=qD=/I(GS]0,lҐQ!q~L0?=ikmG',Y] d$a/ås^P-77/(n*OWQXsVNVCTu"\C^ k]SQKe d`݃ 8ŵ\Dn#scb];NqKmQπQ;K}#b8eGd\Ҕ>iq1@\ htD1eH@_wU􀃈`K/(2)Zanӈ$kU2wTցC (ΒGW "Keq;+grK=*hqp{hwίEfov 2 pDžܖnKAH-֭7kta'`oXG$&Pw-+qE쐄Rpe<{,hܧ3<?[m: -C R[Ҫ^3~emN0=`cB (jȋ&=*_Hm'6Jib4.':Q;}UL=v1`,klsWVGϴx?z2wy$mwe9]Q*l>-w"]=#hv{hMr#o4 2{Kk QU7"$t71mt c}J|9NG;ЦEv61 _GEs픐e XnnvCr_Z ]­hR,]}NR[LYGZzJƦx6׿ɒ94i G;%#Imǿ ?u7glZx}ofvZM^ Bj*C({g(jhJox&ۃ҇dBDV1WHo]Wx5B7AFGEp#9+?(B\LO%%4" ӹA^Vyѹ& 0i,/$p[f폯\>.޷O~8+!1 E4/f8?r+sdqz;uީ\-3'#) obնmU`c ܌je/] @/}BEͼ#ؽs N}>!X:03D1tCV8xco ]O\{`=DC}#,"O8r癓m/]/{ !#mXsVɽp,>||fޏ Lfy~c\{E_]ko ѹ zz燯t@ ]/+倾?DpDݲ\Řؖ'Z_dmZUm*6fQzA5O~ Aܼ\ѕȗƵ%ʂ㊛ػg+3JxcSUlxg̢N~G" hd+PPcߖF ~ܿڂ&n v{Z{AĻY&nQ! 9s]/7ڭܩ>lH\҇|d{e;R.:רwU'2xޢ1r:V0FˈuNH?EFgqմC[jn9x:7sDtOI-W 3"M"|6Kc_ARBZ~VcEʓZ+6lXZ?_ ]TްtLѳaw{aű,qwJu{ÛqڄꜶVզ:a7j7Of5C"3c, K:܍^ݷm{st|v[]VѐMGa>`l*O7W0fځ@nyO8r>pu\Pܭ--~I%@". NPy]V5'hSa07eZu_gC֛&T.*6*]vꔢ\>KWl Ucb+q"T85ZJtzk\ Ve5swpc%Ɣ#&Y 9 xEE(&hUiMH߳.Z8r9,;<#h]-iZ'>ӳsm˶muխWD>D-K tOxxN;:8PS8,EFp4ӣ19NpbHjYM+ "jRY411=e&o>"4rΟ~ (Kկy?{q#q癝QnDqCI%BG?BiDYh~Նfֿl%"L?\jcS+UjtW^YQyL-7U{]3>攐w[; "`UY:cxFF/D o_U b$ MF*.5du~-+*pm`y^>9..s}G Uքjoɂ übpY {W 6s6zUy[(=0,gDۀA{%"{Il=^5;L'12I+>YM׽)Z\ut}ہ,]*llFfԆ'6<nC.9Տ;%@~)%Ǭdo}fQS U7b֚@@mB?#џtBP6Wf: bGa`Yo3z+$RE_*X{Pp%-ً.ֿͦ Ң}qSlIH.]qhNW-38ՍY?:ww vg6D[U(ߵ׶ UJWx%d\Y 3<;8(GL#^g}\a؉s99۶P:l4)sF4>r.:rqq+ܨ~uH"/$4NK {+rv8r|mnOÁ0#4[O q6F0汦?XDSJ{JSrNSXnaBB+ZXdd @3\r})tR@MlKj*sg|@@19Ó(OoDsm"luϬ CCs~"O4u}9H N!VeA ϟ h00.Nlj{}8 tMhRTKPr:^WJD\''q\ 7ã xNtq x{pz|9!̥C?Tњc8E *u&SDO9PT-e_ts[8SAzGt*ti!;8;>6K]W*4A_CQ(>XRjkz?r45fvY..y An{;G3V!ijY{ Ju2M-1H4_bq<|n(|d0VQr3OL/Ci*  ߽C2_6!MPN.nTpG<@dv嵨r9}V~L6r2x]:sHρMQOQXHA5w-p,2fDoc-x`oݵcvݤ2)C;CUo$zv-/[E=Vk-"gR|HJ wX}]os$|3 |a>>143R\E7-gX[l\Q >*+@ &u5#" 14 i6;r.|uZK2QApycNMY]Af,j^I 01{KPf{} %D8ľ>~u H]i"K͑gut٠4Ԩ\0u BXH]Ec21?vz"ee|̷/+o}}9tޤs)=jxqRȴHM|dBNmV"\r沾5݃|ƈ>½jc,)Y\ Yp:*-C$v7z`}tuKeXW@4c `һ)ae]F +!{+##jq P@Dq?`xftQj#S h(YfTN/dZ9Ȉe=ʊe ϟƏ@o-į5iQ6qh êA ~͊>lֶ d+^+"4Ϋ5E :v_O8DRϜ< ħ}] ;'^R.d=c}Rw? |bµ=[j uo-3 $;8۹=d|&OogdStC&5)\H6&KB6(mMw׋Ň9%U'D)۳`JƪRLH |UP냘Օhr<[BUqoafDoSx蔼2ud =%@3TbXvED\{@4Yʅ=WHմ 5eX__ɺ؂n=FKnR<.͸yH$+tY1?XX|_D Z"!P/MПLPn;W챎~Ng+S(0oRnJ{j* ;[x^bF ܡ=^R2Lov30MGP0&Mwz@4ȠSWgg,ӘГ0C}}7\;`l "F.&?o*tZ^09GT~ok?a VSv[(托*vg~oA_7L# M[0H@`! 2T䛄t:~k}CD݀1|újk]h!D[=4/;sq}~ndfvT4+*

    uSGIvy.d_eYT}ۥҐه4(|ONbE5U>CHBr-x"vFI_VQCXij'lxd>ދVM xz(dъ{!CU"d |tof/JH{g  "Z0#|,K&;+ 뻛E+ZzZxrQBtaEu-dk9 !.Uxڨi96%a7UmH~(Fm[I1NI"VWwc5Z1EacOޫ2+i˽{6MR2g0G؁w ]KI3m~aÊA;8n4ǖ|a0?v{e%("$);QO@ *J"uN,/ߗ[tY8 %Z[q^cB"FIpMbɝgZAη;xɳ EмÐ}PD|rC^o8|Iբ'/6C7вaTEjR\uh{TM\[G\+{@p{HqAeKn/&k_{;\dzocKQUCC7;a/CWszFc뿋;ߣ)$UfUnLNRov/ ::Ε졸{- 2] MD_Rns @u"*dP$So#=_IJ$GDfVo jU*{3DgV!/0}#R|`v[НT6"X$[It KҠLZ/$.lߤDL2+Ǧ<2ī؝ߓ&Ak-} _1o6cB F2%)S+d10H)f'E]t|YB+(wt$_@: X݈? ,n,=>ݒ2*OӘf 9\K:G;{EltHP`PqlV2IR~g҈ *_\pdu1DY%,P/=p=b-tBhI)>NxiBknKkKZЉ~}s@Z[CyZJ`pנnC9hS&2=+b-fʾ99}m8a}@)9Kҳ´sv%uq- %`B]:h_[<,, `}LHhcR10fkrEbHkRZyM|}dCe }uY68jB)a 9'(c~l*ۭ;O@S,Ng5vlNk<ظE *'ZN{PT3``/ m/fR6P.f`-o mжʶŶ*5n{:k U^!ꕯzTo|nblq~x H_0cΚh)=Lu7ፗx.}?đ_z dXb8rW㤡l:t%C]Hw g44tw@5OHN)99܏n3=^r %]|qs?(K,ɼ,ߐYZcdFfԩ?՘_Ep BoO>I\dM2=i8 „B*m $ae08Bc8lgOfp@VMƯV5mcJDi;$`1mDӒiFQ\&kȸ% h58z2 B8_ qT9 k|9{IhrAq2n6à7dΥ׌ϊi) ·z[xDGQ =1:]?7n}a3年Po[#u}s7E75h >q +޺0'^BępW.duKvFjkEBDmޠ/D]s)-@RD90 YD~G+-"91AįIua-3%J>FavշCsE-;P!M|bL˸zK) c0sETe@l=lKo$:䦣ԉ_9vYc}jj # ѬM[ 8Uhlnگ b?fG?;/v3*K~k%2Ր#ſ\lհCa*.1ۉhLR5Yp;uN#$a K49_CxuzN))]y+̆zramhNmqؕ >4K1#t L:Q/T#@qD?Ok,{9 ?ES⹑s`. \ܔBM Lwd:` 9&fǖl >8H?L HC%h9 _-} a#war%(\2nD[G(jz.c߲&,t{ΌR#c:+\7/ NK;Cװ~S9!Ż&_{K@qpwO,)!ðZY&J U?FT'8q=+8D4`WM{L4I?Uh~ V TF G( u8 rHW5vHOgv_`T5+mU([XQMXYVJZb s)wO ۥPX!H~lֳO4_}>wثѕL<56V.K.vl0מյ]w k%7$juIk"ejk*7D)ک<կ67tHYMc KHO$/ҚO&,o./2qXodIe濜ʣf?z(6ǷW?rՊjH[~BS .{>t"p0=gg90uymΦzo P TD2G}y(J#v:&/f:C qsTzk9n 4kǾ\%Zkޣ1葤b!f)"*)QgTiH"RJ)Zkc1@5  g@LOQ"AŁ33Zkmw~Dq.G`чStp ӻWPK!uC5abilian/web/resources/font-awesome/less/animated.less// Animated Icons // -------------------------- .@{fa-css-prefix}-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .@{fa-css-prefix}-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); } } PK!XmqII<abilian/web/resources/font-awesome/less/bordered-pulled.less// Bordered & Pulled // ------------------------- .@{fa-css-prefix}-border { padding: .2em .25em .15em; border: solid .08em @fa-border-color; border-radius: .1em; } .@{fa-css-prefix}-pull-left { float: left; } .@{fa-css-prefix}-pull-right { float: right; } .@{fa-css-prefix} { &.@{fa-css-prefix}-pull-left { margin-right: .3em; } &.@{fa-css-prefix}-pull-right { margin-left: .3em; } } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .@{fa-css-prefix} { &.pull-left { margin-right: .3em; } &.pull-right { margin-left: .3em; } } PK!!(1abilian/web/resources/font-awesome/less/core.less// Base Class Definition // ------------------------- .@{fa-css-prefix} { display: inline-block; font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } PK!WDww8abilian/web/resources/font-awesome/less/fixed-width.less// Fixed Width Icons // ------------------------- .@{fa-css-prefix}-fw { width: (18em / 14); text-align: center; } PK!o9abilian/web/resources/font-awesome/less/font-awesome.less/*! * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ @import "variables.less"; @import "mixins.less"; @import "path.less"; @import "core.less"; @import "larger.less"; @import "fixed-width.less"; @import "list.less"; @import "bordered-pulled.less"; @import "animated.less"; @import "rotated-flipped.less"; @import "stacked.less"; @import "icons.less"; PK!uլ2abilian/web/resources/font-awesome/less/icons.less/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .@{fa-css-prefix}-glass:before { content: @fa-var-glass; } .@{fa-css-prefix}-music:before { content: @fa-var-music; } .@{fa-css-prefix}-search:before { content: @fa-var-search; } .@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } .@{fa-css-prefix}-heart:before { content: @fa-var-heart; } .@{fa-css-prefix}-star:before { content: @fa-var-star; } .@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } .@{fa-css-prefix}-user:before { content: @fa-var-user; } .@{fa-css-prefix}-film:before { content: @fa-var-film; } .@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } .@{fa-css-prefix}-th:before { content: @fa-var-th; } .@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } .@{fa-css-prefix}-check:before { content: @fa-var-check; } .@{fa-css-prefix}-remove:before, .@{fa-css-prefix}-close:before, .@{fa-css-prefix}-times:before { content: @fa-var-times; } .@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } .@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } .@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } .@{fa-css-prefix}-signal:before { content: @fa-var-signal; } .@{fa-css-prefix}-gear:before, .@{fa-css-prefix}-cog:before { content: @fa-var-cog; } .@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } .@{fa-css-prefix}-home:before { content: @fa-var-home; } .@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } .@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } .@{fa-css-prefix}-road:before { content: @fa-var-road; } .@{fa-css-prefix}-download:before { content: @fa-var-download; } .@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } .@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } .@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } .@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } .@{fa-css-prefix}-rotate-right:before, .@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } .@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } .@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } .@{fa-css-prefix}-lock:before { content: @fa-var-lock; } .@{fa-css-prefix}-flag:before { content: @fa-var-flag; } .@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } .@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } .@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } .@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } .@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } .@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } .@{fa-css-prefix}-tag:before { content: @fa-var-tag; } .@{fa-css-prefix}-tags:before { content: @fa-var-tags; } .@{fa-css-prefix}-book:before { content: @fa-var-book; } .@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } .@{fa-css-prefix}-print:before { content: @fa-var-print; } .@{fa-css-prefix}-camera:before { content: @fa-var-camera; } .@{fa-css-prefix}-font:before { content: @fa-var-font; } .@{fa-css-prefix}-bold:before { content: @fa-var-bold; } .@{fa-css-prefix}-italic:before { content: @fa-var-italic; } .@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } .@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } .@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } .@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } .@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } .@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } .@{fa-css-prefix}-list:before { content: @fa-var-list; } .@{fa-css-prefix}-dedent:before, .@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } .@{fa-css-prefix}-indent:before { content: @fa-var-indent; } .@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } .@{fa-css-prefix}-photo:before, .@{fa-css-prefix}-image:before, .@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } .@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } .@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } .@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } .@{fa-css-prefix}-tint:before { content: @fa-var-tint; } .@{fa-css-prefix}-edit:before, .@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } .@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } .@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } .@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } .@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } .@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } .@{fa-css-prefix}-backward:before { content: @fa-var-backward; } .@{fa-css-prefix}-play:before { content: @fa-var-play; } .@{fa-css-prefix}-pause:before { content: @fa-var-pause; } .@{fa-css-prefix}-stop:before { content: @fa-var-stop; } .@{fa-css-prefix}-forward:before { content: @fa-var-forward; } .@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } .@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } .@{fa-css-prefix}-eject:before { content: @fa-var-eject; } .@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } .@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } .@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } .@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } .@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } .@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } .@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } .@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } .@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } .@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } .@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } .@{fa-css-prefix}-ban:before { content: @fa-var-ban; } .@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } .@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } .@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } .@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } .@{fa-css-prefix}-mail-forward:before, .@{fa-css-prefix}-share:before { content: @fa-var-share; } .@{fa-css-prefix}-expand:before { content: @fa-var-expand; } .@{fa-css-prefix}-compress:before { content: @fa-var-compress; } .@{fa-css-prefix}-plus:before { content: @fa-var-plus; } .@{fa-css-prefix}-minus:before { content: @fa-var-minus; } .@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } .@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } .@{fa-css-prefix}-gift:before { content: @fa-var-gift; } .@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } .@{fa-css-prefix}-fire:before { content: @fa-var-fire; } .@{fa-css-prefix}-eye:before { content: @fa-var-eye; } .@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } .@{fa-css-prefix}-warning:before, .@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } .@{fa-css-prefix}-plane:before { content: @fa-var-plane; } .@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } .@{fa-css-prefix}-random:before { content: @fa-var-random; } .@{fa-css-prefix}-comment:before { content: @fa-var-comment; } .@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } .@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } .@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } .@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } .@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } .@{fa-css-prefix}-folder:before { content: @fa-var-folder; } .@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } .@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } .@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } .@{fa-css-prefix}-bar-chart-o:before, .@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } .@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } .@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } .@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } .@{fa-css-prefix}-key:before { content: @fa-var-key; } .@{fa-css-prefix}-gears:before, .@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } .@{fa-css-prefix}-comments:before { content: @fa-var-comments; } .@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } .@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } .@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } .@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } .@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } .@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } .@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } .@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } .@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } .@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } .@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } .@{fa-css-prefix}-upload:before { content: @fa-var-upload; } .@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } .@{fa-css-prefix}-phone:before { content: @fa-var-phone; } .@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } .@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } .@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } .@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } .@{fa-css-prefix}-facebook-f:before, .@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } .@{fa-css-prefix}-github:before { content: @fa-var-github; } .@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } .@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } .@{fa-css-prefix}-feed:before, .@{fa-css-prefix}-rss:before { content: @fa-var-rss; } .@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } .@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } .@{fa-css-prefix}-bell:before { content: @fa-var-bell; } .@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } .@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } .@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } .@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } .@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } .@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } .@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } .@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } .@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } .@{fa-css-prefix}-globe:before { content: @fa-var-globe; } .@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } .@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } .@{fa-css-prefix}-filter:before { content: @fa-var-filter; } .@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } .@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } .@{fa-css-prefix}-group:before, .@{fa-css-prefix}-users:before { content: @fa-var-users; } .@{fa-css-prefix}-chain:before, .@{fa-css-prefix}-link:before { content: @fa-var-link; } .@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } .@{fa-css-prefix}-flask:before { content: @fa-var-flask; } .@{fa-css-prefix}-cut:before, .@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } .@{fa-css-prefix}-copy:before, .@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } .@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } .@{fa-css-prefix}-save:before, .@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } .@{fa-css-prefix}-square:before { content: @fa-var-square; } .@{fa-css-prefix}-navicon:before, .@{fa-css-prefix}-reorder:before, .@{fa-css-prefix}-bars:before { content: @fa-var-bars; } .@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } .@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } .@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } .@{fa-css-prefix}-underline:before { content: @fa-var-underline; } .@{fa-css-prefix}-table:before { content: @fa-var-table; } .@{fa-css-prefix}-magic:before { content: @fa-var-magic; } .@{fa-css-prefix}-truck:before { content: @fa-var-truck; } .@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } .@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } .@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } .@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } .@{fa-css-prefix}-money:before { content: @fa-var-money; } .@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } .@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } .@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } .@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } .@{fa-css-prefix}-columns:before { content: @fa-var-columns; } .@{fa-css-prefix}-unsorted:before, .@{fa-css-prefix}-sort:before { content: @fa-var-sort; } .@{fa-css-prefix}-sort-down:before, .@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } .@{fa-css-prefix}-sort-up:before, .@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } .@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } .@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } .@{fa-css-prefix}-rotate-left:before, .@{fa-css-prefix}-undo:before { content: @fa-var-undo; } .@{fa-css-prefix}-legal:before, .@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } .@{fa-css-prefix}-dashboard:before, .@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } .@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } .@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } .@{fa-css-prefix}-flash:before, .@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } .@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } .@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } .@{fa-css-prefix}-paste:before, .@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } .@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } .@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } .@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } .@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } .@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } .@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } .@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } .@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } .@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } .@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } .@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } .@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } .@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } .@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } .@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } .@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } .@{fa-css-prefix}-beer:before { content: @fa-var-beer; } .@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } .@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } .@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } .@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } .@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } .@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } .@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } .@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } .@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } .@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } .@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } .@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } .@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } .@{fa-css-prefix}-mobile-phone:before, .@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } .@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } .@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } .@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } .@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } .@{fa-css-prefix}-circle:before { content: @fa-var-circle; } .@{fa-css-prefix}-mail-reply:before, .@{fa-css-prefix}-reply:before { content: @fa-var-reply; } .@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } .@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } .@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } .@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } .@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } .@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } .@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } .@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } .@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } .@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } .@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } .@{fa-css-prefix}-code:before { content: @fa-var-code; } .@{fa-css-prefix}-mail-reply-all:before, .@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } .@{fa-css-prefix}-star-half-empty:before, .@{fa-css-prefix}-star-half-full:before, .@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } .@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } .@{fa-css-prefix}-crop:before { content: @fa-var-crop; } .@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } .@{fa-css-prefix}-unlink:before, .@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } .@{fa-css-prefix}-question:before { content: @fa-var-question; } .@{fa-css-prefix}-info:before { content: @fa-var-info; } .@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } .@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } .@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } .@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } .@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } .@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } .@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } .@{fa-css-prefix}-shield:before { content: @fa-var-shield; } .@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } .@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } .@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } .@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } .@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } .@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } .@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } .@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } .@{fa-css-prefix}-html5:before { content: @fa-var-html5; } .@{fa-css-prefix}-css3:before { content: @fa-var-css3; } .@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } .@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } .@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } .@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } .@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } .@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } .@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } .@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } .@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } .@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } .@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } .@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } .@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } .@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } .@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } .@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } .@{fa-css-prefix}-compass:before { content: @fa-var-compass; } .@{fa-css-prefix}-toggle-down:before, .@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } .@{fa-css-prefix}-toggle-up:before, .@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } .@{fa-css-prefix}-toggle-right:before, .@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } .@{fa-css-prefix}-euro:before, .@{fa-css-prefix}-eur:before { content: @fa-var-eur; } .@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } .@{fa-css-prefix}-dollar:before, .@{fa-css-prefix}-usd:before { content: @fa-var-usd; } .@{fa-css-prefix}-rupee:before, .@{fa-css-prefix}-inr:before { content: @fa-var-inr; } .@{fa-css-prefix}-cny:before, .@{fa-css-prefix}-rmb:before, .@{fa-css-prefix}-yen:before, .@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } .@{fa-css-prefix}-ruble:before, .@{fa-css-prefix}-rouble:before, .@{fa-css-prefix}-rub:before { content: @fa-var-rub; } .@{fa-css-prefix}-won:before, .@{fa-css-prefix}-krw:before { content: @fa-var-krw; } .@{fa-css-prefix}-bitcoin:before, .@{fa-css-prefix}-btc:before { content: @fa-var-btc; } .@{fa-css-prefix}-file:before { content: @fa-var-file; } .@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } .@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } .@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } .@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } .@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } .@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } .@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } .@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } .@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } .@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } .@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } .@{fa-css-prefix}-xing:before { content: @fa-var-xing; } .@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } .@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } .@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } .@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } .@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } .@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } .@{fa-css-prefix}-adn:before { content: @fa-var-adn; } .@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } .@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } .@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } .@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } .@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } .@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } .@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } .@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } .@{fa-css-prefix}-apple:before { content: @fa-var-apple; } .@{fa-css-prefix}-windows:before { content: @fa-var-windows; } .@{fa-css-prefix}-android:before { content: @fa-var-android; } .@{fa-css-prefix}-linux:before { content: @fa-var-linux; } .@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } .@{fa-css-prefix}-skype:before { content: @fa-var-skype; } .@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } .@{fa-css-prefix}-trello:before { content: @fa-var-trello; } .@{fa-css-prefix}-female:before { content: @fa-var-female; } .@{fa-css-prefix}-male:before { content: @fa-var-male; } .@{fa-css-prefix}-gittip:before, .@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } .@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } .@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } .@{fa-css-prefix}-archive:before { content: @fa-var-archive; } .@{fa-css-prefix}-bug:before { content: @fa-var-bug; } .@{fa-css-prefix}-vk:before { content: @fa-var-vk; } .@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } .@{fa-css-prefix}-renren:before { content: @fa-var-renren; } .@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } .@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } .@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } .@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } .@{fa-css-prefix}-toggle-left:before, .@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } .@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } .@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } .@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } .@{fa-css-prefix}-turkish-lira:before, .@{fa-css-prefix}-try:before { content: @fa-var-try; } .@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } .@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } .@{fa-css-prefix}-slack:before { content: @fa-var-slack; } .@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } .@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } .@{fa-css-prefix}-openid:before { content: @fa-var-openid; } .@{fa-css-prefix}-institution:before, .@{fa-css-prefix}-bank:before, .@{fa-css-prefix}-university:before { content: @fa-var-university; } .@{fa-css-prefix}-mortar-board:before, .@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } .@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } .@{fa-css-prefix}-google:before { content: @fa-var-google; } .@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } .@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } .@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } .@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } .@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } .@{fa-css-prefix}-digg:before { content: @fa-var-digg; } .@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } .@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } .@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } .@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } .@{fa-css-prefix}-language:before { content: @fa-var-language; } .@{fa-css-prefix}-fax:before { content: @fa-var-fax; } .@{fa-css-prefix}-building:before { content: @fa-var-building; } .@{fa-css-prefix}-child:before { content: @fa-var-child; } .@{fa-css-prefix}-paw:before { content: @fa-var-paw; } .@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } .@{fa-css-prefix}-cube:before { content: @fa-var-cube; } .@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } .@{fa-css-prefix}-behance:before { content: @fa-var-behance; } .@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } .@{fa-css-prefix}-steam:before { content: @fa-var-steam; } .@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } .@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } .@{fa-css-prefix}-automobile:before, .@{fa-css-prefix}-car:before { content: @fa-var-car; } .@{fa-css-prefix}-cab:before, .@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } .@{fa-css-prefix}-tree:before { content: @fa-var-tree; } .@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } .@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } .@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } .@{fa-css-prefix}-database:before { content: @fa-var-database; } .@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } .@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } .@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } .@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } .@{fa-css-prefix}-file-photo-o:before, .@{fa-css-prefix}-file-picture-o:before, .@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } .@{fa-css-prefix}-file-zip-o:before, .@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } .@{fa-css-prefix}-file-sound-o:before, .@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } .@{fa-css-prefix}-file-movie-o:before, .@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } .@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } .@{fa-css-prefix}-vine:before { content: @fa-var-vine; } .@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } .@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } .@{fa-css-prefix}-life-bouy:before, .@{fa-css-prefix}-life-buoy:before, .@{fa-css-prefix}-life-saver:before, .@{fa-css-prefix}-support:before, .@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } .@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } .@{fa-css-prefix}-ra:before, .@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } .@{fa-css-prefix}-ge:before, .@{fa-css-prefix}-empire:before { content: @fa-var-empire; } .@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } .@{fa-css-prefix}-git:before { content: @fa-var-git; } .@{fa-css-prefix}-y-combinator-square:before, .@{fa-css-prefix}-yc-square:before, .@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } .@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } .@{fa-css-prefix}-qq:before { content: @fa-var-qq; } .@{fa-css-prefix}-wechat:before, .@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } .@{fa-css-prefix}-send:before, .@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } .@{fa-css-prefix}-send-o:before, .@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } .@{fa-css-prefix}-history:before { content: @fa-var-history; } .@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } .@{fa-css-prefix}-header:before { content: @fa-var-header; } .@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } .@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } .@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } .@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } .@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } .@{fa-css-prefix}-soccer-ball-o:before, .@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } .@{fa-css-prefix}-tty:before { content: @fa-var-tty; } .@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } .@{fa-css-prefix}-plug:before { content: @fa-var-plug; } .@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } .@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } .@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } .@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } .@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } .@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } .@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } .@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } .@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } .@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } .@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } .@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } .@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } .@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } .@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } .@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } .@{fa-css-prefix}-trash:before { content: @fa-var-trash; } .@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } .@{fa-css-prefix}-at:before { content: @fa-var-at; } .@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } .@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } .@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } .@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } .@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } .@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } .@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } .@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } .@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } .@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } .@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } .@{fa-css-prefix}-bus:before { content: @fa-var-bus; } .@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } .@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } .@{fa-css-prefix}-cc:before { content: @fa-var-cc; } .@{fa-css-prefix}-shekel:before, .@{fa-css-prefix}-sheqel:before, .@{fa-css-prefix}-ils:before { content: @fa-var-ils; } .@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } .@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } .@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } .@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } .@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } .@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } .@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } .@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } .@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } .@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } .@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } .@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } .@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } .@{fa-css-prefix}-ship:before { content: @fa-var-ship; } .@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } .@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } .@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } .@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } .@{fa-css-prefix}-venus:before { content: @fa-var-venus; } .@{fa-css-prefix}-mars:before { content: @fa-var-mars; } .@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } .@{fa-css-prefix}-intersex:before, .@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } .@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } .@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } .@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } .@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } .@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } .@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } .@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } .@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } .@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } .@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } .@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } .@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } .@{fa-css-prefix}-server:before { content: @fa-var-server; } .@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } .@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } .@{fa-css-prefix}-hotel:before, .@{fa-css-prefix}-bed:before { content: @fa-var-bed; } .@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } .@{fa-css-prefix}-train:before { content: @fa-var-train; } .@{fa-css-prefix}-subway:before { content: @fa-var-subway; } .@{fa-css-prefix}-medium:before { content: @fa-var-medium; } .@{fa-css-prefix}-yc:before, .@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } .@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } .@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } .@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } .@{fa-css-prefix}-battery-4:before, .@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } .@{fa-css-prefix}-battery-3:before, .@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } .@{fa-css-prefix}-battery-2:before, .@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } .@{fa-css-prefix}-battery-1:before, .@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } .@{fa-css-prefix}-battery-0:before, .@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } .@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } .@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } .@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } .@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } .@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } .@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } .@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } .@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } .@{fa-css-prefix}-clone:before { content: @fa-var-clone; } .@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } .@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } .@{fa-css-prefix}-hourglass-1:before, .@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } .@{fa-css-prefix}-hourglass-2:before, .@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } .@{fa-css-prefix}-hourglass-3:before, .@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } .@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } .@{fa-css-prefix}-hand-grab-o:before, .@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } .@{fa-css-prefix}-hand-stop-o:before, .@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } .@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } .@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } .@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } .@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } .@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } .@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } .@{fa-css-prefix}-registered:before { content: @fa-var-registered; } .@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } .@{fa-css-prefix}-gg:before { content: @fa-var-gg; } .@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } .@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } .@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } .@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } .@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } .@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } .@{fa-css-prefix}-safari:before { content: @fa-var-safari; } .@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } .@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } .@{fa-css-prefix}-opera:before { content: @fa-var-opera; } .@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } .@{fa-css-prefix}-tv:before, .@{fa-css-prefix}-television:before { content: @fa-var-television; } .@{fa-css-prefix}-contao:before { content: @fa-var-contao; } .@{fa-css-prefix}-500px:before { content: @fa-var-500px; } .@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } .@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } .@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } .@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } .@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } .@{fa-css-prefix}-industry:before { content: @fa-var-industry; } .@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } .@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } .@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } .@{fa-css-prefix}-map:before { content: @fa-var-map; } .@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } .@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } .@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } .@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } .@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } .@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } PK!Qrr3abilian/web/resources/font-awesome/less/larger.less// Icon Sizes // ------------------------- /* makes the font 33% larger relative to the icon container */ .@{fa-css-prefix}-lg { font-size: (4em / 3); line-height: (3em / 4); vertical-align: -15%; } .@{fa-css-prefix}-2x { font-size: 2em; } .@{fa-css-prefix}-3x { font-size: 3em; } .@{fa-css-prefix}-4x { font-size: 4em; } .@{fa-css-prefix}-5x { font-size: 5em; } PK!\yy1abilian/web/resources/font-awesome/less/list.less// List Icons // ------------------------- .@{fa-css-prefix}-ul { padding-left: 0; margin-left: @fa-li-width; list-style-type: none; > li { position: relative; } } .@{fa-css-prefix}-li { position: absolute; left: -@fa-li-width; width: @fa-li-width; top: (2em / 14); text-align: center; &.@{fa-css-prefix}-lg { left: (-@fa-li-width + (4em / 14)); } } PK!93abilian/web/resources/font-awesome/less/mixins.less// Mixins // -------------------------- .fa-icon() { display: inline-block; font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .fa-icon-rotate(@degrees, @rotation) { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation); -webkit-transform: rotate(@degrees); -ms-transform: rotate(@degrees); transform: rotate(@degrees); } .fa-icon-flip(@horiz, @vert, @rotation) { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1); -webkit-transform: scale(@horiz, @vert); -ms-transform: scale(@horiz, @vert); transform: scale(@horiz, @vert); } PK!Z91abilian/web/resources/font-awesome/less/path.less/* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts font-weight: normal; font-style: normal; } PK!,^Bnn<abilian/web/resources/font-awesome/less/rotated-flipped.less// Rotated & Flipped Icons // ------------------------- .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } // Hook for IE8-9 // ------------------------- :root .@{fa-css-prefix}-rotate-90, :root .@{fa-css-prefix}-rotate-180, :root .@{fa-css-prefix}-rotate-270, :root .@{fa-css-prefix}-flip-horizontal, :root .@{fa-css-prefix}-flip-vertical { filter: none; } PK!4abilian/web/resources/font-awesome/less/stacked.less// Stacked Icons // ------------------------- .@{fa-css-prefix}-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .@{fa-css-prefix}-stack-1x { line-height: inherit; } .@{fa-css-prefix}-stack-2x { font-size: 2em; } .@{fa-css-prefix}-inverse { color: @fa-inverse; } PK!rWKK6abilian/web/resources/font-awesome/less/variables.less// Variables // -------------------------- @fa-font-path: "../fonts"; @fa-font-size-base: 14px; @fa-line-height-base: 1; //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.4.0/fonts"; // for referencing Bootstrap CDN font files directly @fa-css-prefix: fa; @fa-version: "4.4.0"; @fa-border-color: #eee; @fa-inverse: #fff; @fa-li-width: (30em / 14); @fa-var-500px: "\f26e"; @fa-var-adjust: "\f042"; @fa-var-adn: "\f170"; @fa-var-align-center: "\f037"; @fa-var-align-justify: "\f039"; @fa-var-align-left: "\f036"; @fa-var-align-right: "\f038"; @fa-var-amazon: "\f270"; @fa-var-ambulance: "\f0f9"; @fa-var-anchor: "\f13d"; @fa-var-android: "\f17b"; @fa-var-angellist: "\f209"; @fa-var-angle-double-down: "\f103"; @fa-var-angle-double-left: "\f100"; @fa-var-angle-double-right: "\f101"; @fa-var-angle-double-up: "\f102"; @fa-var-angle-down: "\f107"; @fa-var-angle-left: "\f104"; @fa-var-angle-right: "\f105"; @fa-var-angle-up: "\f106"; @fa-var-apple: "\f179"; @fa-var-archive: "\f187"; @fa-var-area-chart: "\f1fe"; @fa-var-arrow-circle-down: "\f0ab"; @fa-var-arrow-circle-left: "\f0a8"; @fa-var-arrow-circle-o-down: "\f01a"; @fa-var-arrow-circle-o-left: "\f190"; @fa-var-arrow-circle-o-right: "\f18e"; @fa-var-arrow-circle-o-up: "\f01b"; @fa-var-arrow-circle-right: "\f0a9"; @fa-var-arrow-circle-up: "\f0aa"; @fa-var-arrow-down: "\f063"; @fa-var-arrow-left: "\f060"; @fa-var-arrow-right: "\f061"; @fa-var-arrow-up: "\f062"; @fa-var-arrows: "\f047"; @fa-var-arrows-alt: "\f0b2"; @fa-var-arrows-h: "\f07e"; @fa-var-arrows-v: "\f07d"; @fa-var-asterisk: "\f069"; @fa-var-at: "\f1fa"; @fa-var-automobile: "\f1b9"; @fa-var-backward: "\f04a"; @fa-var-balance-scale: "\f24e"; @fa-var-ban: "\f05e"; @fa-var-bank: "\f19c"; @fa-var-bar-chart: "\f080"; @fa-var-bar-chart-o: "\f080"; @fa-var-barcode: "\f02a"; @fa-var-bars: "\f0c9"; @fa-var-battery-0: "\f244"; @fa-var-battery-1: "\f243"; @fa-var-battery-2: "\f242"; @fa-var-battery-3: "\f241"; @fa-var-battery-4: "\f240"; @fa-var-battery-empty: "\f244"; @fa-var-battery-full: "\f240"; @fa-var-battery-half: "\f242"; @fa-var-battery-quarter: "\f243"; @fa-var-battery-three-quarters: "\f241"; @fa-var-bed: "\f236"; @fa-var-beer: "\f0fc"; @fa-var-behance: "\f1b4"; @fa-var-behance-square: "\f1b5"; @fa-var-bell: "\f0f3"; @fa-var-bell-o: "\f0a2"; @fa-var-bell-slash: "\f1f6"; @fa-var-bell-slash-o: "\f1f7"; @fa-var-bicycle: "\f206"; @fa-var-binoculars: "\f1e5"; @fa-var-birthday-cake: "\f1fd"; @fa-var-bitbucket: "\f171"; @fa-var-bitbucket-square: "\f172"; @fa-var-bitcoin: "\f15a"; @fa-var-black-tie: "\f27e"; @fa-var-bold: "\f032"; @fa-var-bolt: "\f0e7"; @fa-var-bomb: "\f1e2"; @fa-var-book: "\f02d"; @fa-var-bookmark: "\f02e"; @fa-var-bookmark-o: "\f097"; @fa-var-briefcase: "\f0b1"; @fa-var-btc: "\f15a"; @fa-var-bug: "\f188"; @fa-var-building: "\f1ad"; @fa-var-building-o: "\f0f7"; @fa-var-bullhorn: "\f0a1"; @fa-var-bullseye: "\f140"; @fa-var-bus: "\f207"; @fa-var-buysellads: "\f20d"; @fa-var-cab: "\f1ba"; @fa-var-calculator: "\f1ec"; @fa-var-calendar: "\f073"; @fa-var-calendar-check-o: "\f274"; @fa-var-calendar-minus-o: "\f272"; @fa-var-calendar-o: "\f133"; @fa-var-calendar-plus-o: "\f271"; @fa-var-calendar-times-o: "\f273"; @fa-var-camera: "\f030"; @fa-var-camera-retro: "\f083"; @fa-var-car: "\f1b9"; @fa-var-caret-down: "\f0d7"; @fa-var-caret-left: "\f0d9"; @fa-var-caret-right: "\f0da"; @fa-var-caret-square-o-down: "\f150"; @fa-var-caret-square-o-left: "\f191"; @fa-var-caret-square-o-right: "\f152"; @fa-var-caret-square-o-up: "\f151"; @fa-var-caret-up: "\f0d8"; @fa-var-cart-arrow-down: "\f218"; @fa-var-cart-plus: "\f217"; @fa-var-cc: "\f20a"; @fa-var-cc-amex: "\f1f3"; @fa-var-cc-diners-club: "\f24c"; @fa-var-cc-discover: "\f1f2"; @fa-var-cc-jcb: "\f24b"; @fa-var-cc-mastercard: "\f1f1"; @fa-var-cc-paypal: "\f1f4"; @fa-var-cc-stripe: "\f1f5"; @fa-var-cc-visa: "\f1f0"; @fa-var-certificate: "\f0a3"; @fa-var-chain: "\f0c1"; @fa-var-chain-broken: "\f127"; @fa-var-check: "\f00c"; @fa-var-check-circle: "\f058"; @fa-var-check-circle-o: "\f05d"; @fa-var-check-square: "\f14a"; @fa-var-check-square-o: "\f046"; @fa-var-chevron-circle-down: "\f13a"; @fa-var-chevron-circle-left: "\f137"; @fa-var-chevron-circle-right: "\f138"; @fa-var-chevron-circle-up: "\f139"; @fa-var-chevron-down: "\f078"; @fa-var-chevron-left: "\f053"; @fa-var-chevron-right: "\f054"; @fa-var-chevron-up: "\f077"; @fa-var-child: "\f1ae"; @fa-var-chrome: "\f268"; @fa-var-circle: "\f111"; @fa-var-circle-o: "\f10c"; @fa-var-circle-o-notch: "\f1ce"; @fa-var-circle-thin: "\f1db"; @fa-var-clipboard: "\f0ea"; @fa-var-clock-o: "\f017"; @fa-var-clone: "\f24d"; @fa-var-close: "\f00d"; @fa-var-cloud: "\f0c2"; @fa-var-cloud-download: "\f0ed"; @fa-var-cloud-upload: "\f0ee"; @fa-var-cny: "\f157"; @fa-var-code: "\f121"; @fa-var-code-fork: "\f126"; @fa-var-codepen: "\f1cb"; @fa-var-coffee: "\f0f4"; @fa-var-cog: "\f013"; @fa-var-cogs: "\f085"; @fa-var-columns: "\f0db"; @fa-var-comment: "\f075"; @fa-var-comment-o: "\f0e5"; @fa-var-commenting: "\f27a"; @fa-var-commenting-o: "\f27b"; @fa-var-comments: "\f086"; @fa-var-comments-o: "\f0e6"; @fa-var-compass: "\f14e"; @fa-var-compress: "\f066"; @fa-var-connectdevelop: "\f20e"; @fa-var-contao: "\f26d"; @fa-var-copy: "\f0c5"; @fa-var-copyright: "\f1f9"; @fa-var-creative-commons: "\f25e"; @fa-var-credit-card: "\f09d"; @fa-var-crop: "\f125"; @fa-var-crosshairs: "\f05b"; @fa-var-css3: "\f13c"; @fa-var-cube: "\f1b2"; @fa-var-cubes: "\f1b3"; @fa-var-cut: "\f0c4"; @fa-var-cutlery: "\f0f5"; @fa-var-dashboard: "\f0e4"; @fa-var-dashcube: "\f210"; @fa-var-database: "\f1c0"; @fa-var-dedent: "\f03b"; @fa-var-delicious: "\f1a5"; @fa-var-desktop: "\f108"; @fa-var-deviantart: "\f1bd"; @fa-var-diamond: "\f219"; @fa-var-digg: "\f1a6"; @fa-var-dollar: "\f155"; @fa-var-dot-circle-o: "\f192"; @fa-var-download: "\f019"; @fa-var-dribbble: "\f17d"; @fa-var-dropbox: "\f16b"; @fa-var-drupal: "\f1a9"; @fa-var-edit: "\f044"; @fa-var-eject: "\f052"; @fa-var-ellipsis-h: "\f141"; @fa-var-ellipsis-v: "\f142"; @fa-var-empire: "\f1d1"; @fa-var-envelope: "\f0e0"; @fa-var-envelope-o: "\f003"; @fa-var-envelope-square: "\f199"; @fa-var-eraser: "\f12d"; @fa-var-eur: "\f153"; @fa-var-euro: "\f153"; @fa-var-exchange: "\f0ec"; @fa-var-exclamation: "\f12a"; @fa-var-exclamation-circle: "\f06a"; @fa-var-exclamation-triangle: "\f071"; @fa-var-expand: "\f065"; @fa-var-expeditedssl: "\f23e"; @fa-var-external-link: "\f08e"; @fa-var-external-link-square: "\f14c"; @fa-var-eye: "\f06e"; @fa-var-eye-slash: "\f070"; @fa-var-eyedropper: "\f1fb"; @fa-var-facebook: "\f09a"; @fa-var-facebook-f: "\f09a"; @fa-var-facebook-official: "\f230"; @fa-var-facebook-square: "\f082"; @fa-var-fast-backward: "\f049"; @fa-var-fast-forward: "\f050"; @fa-var-fax: "\f1ac"; @fa-var-feed: "\f09e"; @fa-var-female: "\f182"; @fa-var-fighter-jet: "\f0fb"; @fa-var-file: "\f15b"; @fa-var-file-archive-o: "\f1c6"; @fa-var-file-audio-o: "\f1c7"; @fa-var-file-code-o: "\f1c9"; @fa-var-file-excel-o: "\f1c3"; @fa-var-file-image-o: "\f1c5"; @fa-var-file-movie-o: "\f1c8"; @fa-var-file-o: "\f016"; @fa-var-file-pdf-o: "\f1c1"; @fa-var-file-photo-o: "\f1c5"; @fa-var-file-picture-o: "\f1c5"; @fa-var-file-powerpoint-o: "\f1c4"; @fa-var-file-sound-o: "\f1c7"; @fa-var-file-text: "\f15c"; @fa-var-file-text-o: "\f0f6"; @fa-var-file-video-o: "\f1c8"; @fa-var-file-word-o: "\f1c2"; @fa-var-file-zip-o: "\f1c6"; @fa-var-files-o: "\f0c5"; @fa-var-film: "\f008"; @fa-var-filter: "\f0b0"; @fa-var-fire: "\f06d"; @fa-var-fire-extinguisher: "\f134"; @fa-var-firefox: "\f269"; @fa-var-flag: "\f024"; @fa-var-flag-checkered: "\f11e"; @fa-var-flag-o: "\f11d"; @fa-var-flash: "\f0e7"; @fa-var-flask: "\f0c3"; @fa-var-flickr: "\f16e"; @fa-var-floppy-o: "\f0c7"; @fa-var-folder: "\f07b"; @fa-var-folder-o: "\f114"; @fa-var-folder-open: "\f07c"; @fa-var-folder-open-o: "\f115"; @fa-var-font: "\f031"; @fa-var-fonticons: "\f280"; @fa-var-forumbee: "\f211"; @fa-var-forward: "\f04e"; @fa-var-foursquare: "\f180"; @fa-var-frown-o: "\f119"; @fa-var-futbol-o: "\f1e3"; @fa-var-gamepad: "\f11b"; @fa-var-gavel: "\f0e3"; @fa-var-gbp: "\f154"; @fa-var-ge: "\f1d1"; @fa-var-gear: "\f013"; @fa-var-gears: "\f085"; @fa-var-genderless: "\f22d"; @fa-var-get-pocket: "\f265"; @fa-var-gg: "\f260"; @fa-var-gg-circle: "\f261"; @fa-var-gift: "\f06b"; @fa-var-git: "\f1d3"; @fa-var-git-square: "\f1d2"; @fa-var-github: "\f09b"; @fa-var-github-alt: "\f113"; @fa-var-github-square: "\f092"; @fa-var-gittip: "\f184"; @fa-var-glass: "\f000"; @fa-var-globe: "\f0ac"; @fa-var-google: "\f1a0"; @fa-var-google-plus: "\f0d5"; @fa-var-google-plus-square: "\f0d4"; @fa-var-google-wallet: "\f1ee"; @fa-var-graduation-cap: "\f19d"; @fa-var-gratipay: "\f184"; @fa-var-group: "\f0c0"; @fa-var-h-square: "\f0fd"; @fa-var-hacker-news: "\f1d4"; @fa-var-hand-grab-o: "\f255"; @fa-var-hand-lizard-o: "\f258"; @fa-var-hand-o-down: "\f0a7"; @fa-var-hand-o-left: "\f0a5"; @fa-var-hand-o-right: "\f0a4"; @fa-var-hand-o-up: "\f0a6"; @fa-var-hand-paper-o: "\f256"; @fa-var-hand-peace-o: "\f25b"; @fa-var-hand-pointer-o: "\f25a"; @fa-var-hand-rock-o: "\f255"; @fa-var-hand-scissors-o: "\f257"; @fa-var-hand-spock-o: "\f259"; @fa-var-hand-stop-o: "\f256"; @fa-var-hdd-o: "\f0a0"; @fa-var-header: "\f1dc"; @fa-var-headphones: "\f025"; @fa-var-heart: "\f004"; @fa-var-heart-o: "\f08a"; @fa-var-heartbeat: "\f21e"; @fa-var-history: "\f1da"; @fa-var-home: "\f015"; @fa-var-hospital-o: "\f0f8"; @fa-var-hotel: "\f236"; @fa-var-hourglass: "\f254"; @fa-var-hourglass-1: "\f251"; @fa-var-hourglass-2: "\f252"; @fa-var-hourglass-3: "\f253"; @fa-var-hourglass-end: "\f253"; @fa-var-hourglass-half: "\f252"; @fa-var-hourglass-o: "\f250"; @fa-var-hourglass-start: "\f251"; @fa-var-houzz: "\f27c"; @fa-var-html5: "\f13b"; @fa-var-i-cursor: "\f246"; @fa-var-ils: "\f20b"; @fa-var-image: "\f03e"; @fa-var-inbox: "\f01c"; @fa-var-indent: "\f03c"; @fa-var-industry: "\f275"; @fa-var-info: "\f129"; @fa-var-info-circle: "\f05a"; @fa-var-inr: "\f156"; @fa-var-instagram: "\f16d"; @fa-var-institution: "\f19c"; @fa-var-internet-explorer: "\f26b"; @fa-var-intersex: "\f224"; @fa-var-ioxhost: "\f208"; @fa-var-italic: "\f033"; @fa-var-joomla: "\f1aa"; @fa-var-jpy: "\f157"; @fa-var-jsfiddle: "\f1cc"; @fa-var-key: "\f084"; @fa-var-keyboard-o: "\f11c"; @fa-var-krw: "\f159"; @fa-var-language: "\f1ab"; @fa-var-laptop: "\f109"; @fa-var-lastfm: "\f202"; @fa-var-lastfm-square: "\f203"; @fa-var-leaf: "\f06c"; @fa-var-leanpub: "\f212"; @fa-var-legal: "\f0e3"; @fa-var-lemon-o: "\f094"; @fa-var-level-down: "\f149"; @fa-var-level-up: "\f148"; @fa-var-life-bouy: "\f1cd"; @fa-var-life-buoy: "\f1cd"; @fa-var-life-ring: "\f1cd"; @fa-var-life-saver: "\f1cd"; @fa-var-lightbulb-o: "\f0eb"; @fa-var-line-chart: "\f201"; @fa-var-link: "\f0c1"; @fa-var-linkedin: "\f0e1"; @fa-var-linkedin-square: "\f08c"; @fa-var-linux: "\f17c"; @fa-var-list: "\f03a"; @fa-var-list-alt: "\f022"; @fa-var-list-ol: "\f0cb"; @fa-var-list-ul: "\f0ca"; @fa-var-location-arrow: "\f124"; @fa-var-lock: "\f023"; @fa-var-long-arrow-down: "\f175"; @fa-var-long-arrow-left: "\f177"; @fa-var-long-arrow-right: "\f178"; @fa-var-long-arrow-up: "\f176"; @fa-var-magic: "\f0d0"; @fa-var-magnet: "\f076"; @fa-var-mail-forward: "\f064"; @fa-var-mail-reply: "\f112"; @fa-var-mail-reply-all: "\f122"; @fa-var-male: "\f183"; @fa-var-map: "\f279"; @fa-var-map-marker: "\f041"; @fa-var-map-o: "\f278"; @fa-var-map-pin: "\f276"; @fa-var-map-signs: "\f277"; @fa-var-mars: "\f222"; @fa-var-mars-double: "\f227"; @fa-var-mars-stroke: "\f229"; @fa-var-mars-stroke-h: "\f22b"; @fa-var-mars-stroke-v: "\f22a"; @fa-var-maxcdn: "\f136"; @fa-var-meanpath: "\f20c"; @fa-var-medium: "\f23a"; @fa-var-medkit: "\f0fa"; @fa-var-meh-o: "\f11a"; @fa-var-mercury: "\f223"; @fa-var-microphone: "\f130"; @fa-var-microphone-slash: "\f131"; @fa-var-minus: "\f068"; @fa-var-minus-circle: "\f056"; @fa-var-minus-square: "\f146"; @fa-var-minus-square-o: "\f147"; @fa-var-mobile: "\f10b"; @fa-var-mobile-phone: "\f10b"; @fa-var-money: "\f0d6"; @fa-var-moon-o: "\f186"; @fa-var-mortar-board: "\f19d"; @fa-var-motorcycle: "\f21c"; @fa-var-mouse-pointer: "\f245"; @fa-var-music: "\f001"; @fa-var-navicon: "\f0c9"; @fa-var-neuter: "\f22c"; @fa-var-newspaper-o: "\f1ea"; @fa-var-object-group: "\f247"; @fa-var-object-ungroup: "\f248"; @fa-var-odnoklassniki: "\f263"; @fa-var-odnoklassniki-square: "\f264"; @fa-var-opencart: "\f23d"; @fa-var-openid: "\f19b"; @fa-var-opera: "\f26a"; @fa-var-optin-monster: "\f23c"; @fa-var-outdent: "\f03b"; @fa-var-pagelines: "\f18c"; @fa-var-paint-brush: "\f1fc"; @fa-var-paper-plane: "\f1d8"; @fa-var-paper-plane-o: "\f1d9"; @fa-var-paperclip: "\f0c6"; @fa-var-paragraph: "\f1dd"; @fa-var-paste: "\f0ea"; @fa-var-pause: "\f04c"; @fa-var-paw: "\f1b0"; @fa-var-paypal: "\f1ed"; @fa-var-pencil: "\f040"; @fa-var-pencil-square: "\f14b"; @fa-var-pencil-square-o: "\f044"; @fa-var-phone: "\f095"; @fa-var-phone-square: "\f098"; @fa-var-photo: "\f03e"; @fa-var-picture-o: "\f03e"; @fa-var-pie-chart: "\f200"; @fa-var-pied-piper: "\f1a7"; @fa-var-pied-piper-alt: "\f1a8"; @fa-var-pinterest: "\f0d2"; @fa-var-pinterest-p: "\f231"; @fa-var-pinterest-square: "\f0d3"; @fa-var-plane: "\f072"; @fa-var-play: "\f04b"; @fa-var-play-circle: "\f144"; @fa-var-play-circle-o: "\f01d"; @fa-var-plug: "\f1e6"; @fa-var-plus: "\f067"; @fa-var-plus-circle: "\f055"; @fa-var-plus-square: "\f0fe"; @fa-var-plus-square-o: "\f196"; @fa-var-power-off: "\f011"; @fa-var-print: "\f02f"; @fa-var-puzzle-piece: "\f12e"; @fa-var-qq: "\f1d6"; @fa-var-qrcode: "\f029"; @fa-var-question: "\f128"; @fa-var-question-circle: "\f059"; @fa-var-quote-left: "\f10d"; @fa-var-quote-right: "\f10e"; @fa-var-ra: "\f1d0"; @fa-var-random: "\f074"; @fa-var-rebel: "\f1d0"; @fa-var-recycle: "\f1b8"; @fa-var-reddit: "\f1a1"; @fa-var-reddit-square: "\f1a2"; @fa-var-refresh: "\f021"; @fa-var-registered: "\f25d"; @fa-var-remove: "\f00d"; @fa-var-renren: "\f18b"; @fa-var-reorder: "\f0c9"; @fa-var-repeat: "\f01e"; @fa-var-reply: "\f112"; @fa-var-reply-all: "\f122"; @fa-var-retweet: "\f079"; @fa-var-rmb: "\f157"; @fa-var-road: "\f018"; @fa-var-rocket: "\f135"; @fa-var-rotate-left: "\f0e2"; @fa-var-rotate-right: "\f01e"; @fa-var-rouble: "\f158"; @fa-var-rss: "\f09e"; @fa-var-rss-square: "\f143"; @fa-var-rub: "\f158"; @fa-var-ruble: "\f158"; @fa-var-rupee: "\f156"; @fa-var-safari: "\f267"; @fa-var-save: "\f0c7"; @fa-var-scissors: "\f0c4"; @fa-var-search: "\f002"; @fa-var-search-minus: "\f010"; @fa-var-search-plus: "\f00e"; @fa-var-sellsy: "\f213"; @fa-var-send: "\f1d8"; @fa-var-send-o: "\f1d9"; @fa-var-server: "\f233"; @fa-var-share: "\f064"; @fa-var-share-alt: "\f1e0"; @fa-var-share-alt-square: "\f1e1"; @fa-var-share-square: "\f14d"; @fa-var-share-square-o: "\f045"; @fa-var-shekel: "\f20b"; @fa-var-sheqel: "\f20b"; @fa-var-shield: "\f132"; @fa-var-ship: "\f21a"; @fa-var-shirtsinbulk: "\f214"; @fa-var-shopping-cart: "\f07a"; @fa-var-sign-in: "\f090"; @fa-var-sign-out: "\f08b"; @fa-var-signal: "\f012"; @fa-var-simplybuilt: "\f215"; @fa-var-sitemap: "\f0e8"; @fa-var-skyatlas: "\f216"; @fa-var-skype: "\f17e"; @fa-var-slack: "\f198"; @fa-var-sliders: "\f1de"; @fa-var-slideshare: "\f1e7"; @fa-var-smile-o: "\f118"; @fa-var-soccer-ball-o: "\f1e3"; @fa-var-sort: "\f0dc"; @fa-var-sort-alpha-asc: "\f15d"; @fa-var-sort-alpha-desc: "\f15e"; @fa-var-sort-amount-asc: "\f160"; @fa-var-sort-amount-desc: "\f161"; @fa-var-sort-asc: "\f0de"; @fa-var-sort-desc: "\f0dd"; @fa-var-sort-down: "\f0dd"; @fa-var-sort-numeric-asc: "\f162"; @fa-var-sort-numeric-desc: "\f163"; @fa-var-sort-up: "\f0de"; @fa-var-soundcloud: "\f1be"; @fa-var-space-shuttle: "\f197"; @fa-var-spinner: "\f110"; @fa-var-spoon: "\f1b1"; @fa-var-spotify: "\f1bc"; @fa-var-square: "\f0c8"; @fa-var-square-o: "\f096"; @fa-var-stack-exchange: "\f18d"; @fa-var-stack-overflow: "\f16c"; @fa-var-star: "\f005"; @fa-var-star-half: "\f089"; @fa-var-star-half-empty: "\f123"; @fa-var-star-half-full: "\f123"; @fa-var-star-half-o: "\f123"; @fa-var-star-o: "\f006"; @fa-var-steam: "\f1b6"; @fa-var-steam-square: "\f1b7"; @fa-var-step-backward: "\f048"; @fa-var-step-forward: "\f051"; @fa-var-stethoscope: "\f0f1"; @fa-var-sticky-note: "\f249"; @fa-var-sticky-note-o: "\f24a"; @fa-var-stop: "\f04d"; @fa-var-street-view: "\f21d"; @fa-var-strikethrough: "\f0cc"; @fa-var-stumbleupon: "\f1a4"; @fa-var-stumbleupon-circle: "\f1a3"; @fa-var-subscript: "\f12c"; @fa-var-subway: "\f239"; @fa-var-suitcase: "\f0f2"; @fa-var-sun-o: "\f185"; @fa-var-superscript: "\f12b"; @fa-var-support: "\f1cd"; @fa-var-table: "\f0ce"; @fa-var-tablet: "\f10a"; @fa-var-tachometer: "\f0e4"; @fa-var-tag: "\f02b"; @fa-var-tags: "\f02c"; @fa-var-tasks: "\f0ae"; @fa-var-taxi: "\f1ba"; @fa-var-television: "\f26c"; @fa-var-tencent-weibo: "\f1d5"; @fa-var-terminal: "\f120"; @fa-var-text-height: "\f034"; @fa-var-text-width: "\f035"; @fa-var-th: "\f00a"; @fa-var-th-large: "\f009"; @fa-var-th-list: "\f00b"; @fa-var-thumb-tack: "\f08d"; @fa-var-thumbs-down: "\f165"; @fa-var-thumbs-o-down: "\f088"; @fa-var-thumbs-o-up: "\f087"; @fa-var-thumbs-up: "\f164"; @fa-var-ticket: "\f145"; @fa-var-times: "\f00d"; @fa-var-times-circle: "\f057"; @fa-var-times-circle-o: "\f05c"; @fa-var-tint: "\f043"; @fa-var-toggle-down: "\f150"; @fa-var-toggle-left: "\f191"; @fa-var-toggle-off: "\f204"; @fa-var-toggle-on: "\f205"; @fa-var-toggle-right: "\f152"; @fa-var-toggle-up: "\f151"; @fa-var-trademark: "\f25c"; @fa-var-train: "\f238"; @fa-var-transgender: "\f224"; @fa-var-transgender-alt: "\f225"; @fa-var-trash: "\f1f8"; @fa-var-trash-o: "\f014"; @fa-var-tree: "\f1bb"; @fa-var-trello: "\f181"; @fa-var-tripadvisor: "\f262"; @fa-var-trophy: "\f091"; @fa-var-truck: "\f0d1"; @fa-var-try: "\f195"; @fa-var-tty: "\f1e4"; @fa-var-tumblr: "\f173"; @fa-var-tumblr-square: "\f174"; @fa-var-turkish-lira: "\f195"; @fa-var-tv: "\f26c"; @fa-var-twitch: "\f1e8"; @fa-var-twitter: "\f099"; @fa-var-twitter-square: "\f081"; @fa-var-umbrella: "\f0e9"; @fa-var-underline: "\f0cd"; @fa-var-undo: "\f0e2"; @fa-var-university: "\f19c"; @fa-var-unlink: "\f127"; @fa-var-unlock: "\f09c"; @fa-var-unlock-alt: "\f13e"; @fa-var-unsorted: "\f0dc"; @fa-var-upload: "\f093"; @fa-var-usd: "\f155"; @fa-var-user: "\f007"; @fa-var-user-md: "\f0f0"; @fa-var-user-plus: "\f234"; @fa-var-user-secret: "\f21b"; @fa-var-user-times: "\f235"; @fa-var-users: "\f0c0"; @fa-var-venus: "\f221"; @fa-var-venus-double: "\f226"; @fa-var-venus-mars: "\f228"; @fa-var-viacoin: "\f237"; @fa-var-video-camera: "\f03d"; @fa-var-vimeo: "\f27d"; @fa-var-vimeo-square: "\f194"; @fa-var-vine: "\f1ca"; @fa-var-vk: "\f189"; @fa-var-volume-down: "\f027"; @fa-var-volume-off: "\f026"; @fa-var-volume-up: "\f028"; @fa-var-warning: "\f071"; @fa-var-wechat: "\f1d7"; @fa-var-weibo: "\f18a"; @fa-var-weixin: "\f1d7"; @fa-var-whatsapp: "\f232"; @fa-var-wheelchair: "\f193"; @fa-var-wifi: "\f1eb"; @fa-var-wikipedia-w: "\f266"; @fa-var-windows: "\f17a"; @fa-var-won: "\f159"; @fa-var-wordpress: "\f19a"; @fa-var-wrench: "\f0ad"; @fa-var-xing: "\f168"; @fa-var-xing-square: "\f169"; @fa-var-y-combinator: "\f23b"; @fa-var-y-combinator-square: "\f1d4"; @fa-var-yahoo: "\f19e"; @fa-var-yc: "\f23b"; @fa-var-yc-square: "\f1d4"; @fa-var-yelp: "\f1e9"; @fa-var-yen: "\f157"; @fa-var-youtube: "\f167"; @fa-var-youtube-play: "\f16a"; @fa-var-youtube-square: "\f166"; PK!0[6abilian/web/resources/font-awesome/scss/_animated.scss// Spinning Icons // -------------------------- .#{$fa-css-prefix}-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .#{$fa-css-prefix}-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); } } PK!#PP=abilian/web/resources/font-awesome/scss/_bordered-pulled.scss// Bordered & Pulled // ------------------------- .#{$fa-css-prefix}-border { padding: .2em .25em .15em; border: solid .08em $fa-border-color; border-radius: .1em; } .#{$fa-css-prefix}-pull-left { float: left; } .#{$fa-css-prefix}-pull-right { float: right; } .#{$fa-css-prefix} { &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .#{$fa-css-prefix} { &.pull-left { margin-right: .3em; } &.pull-right { margin-left: .3em; } } PK!82abilian/web/resources/font-awesome/scss/_core.scss// Base Class Definition // ------------------------- .#{$fa-css-prefix} { display: inline-block; font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } PK!Pxx9abilian/web/resources/font-awesome/scss/_fixed-width.scss// Fixed Width Icons // ------------------------- .#{$fa-css-prefix}-fw { width: (18em / 14); text-align: center; } PK!d3abilian/web/resources/font-awesome/scss/_icons.scss/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } .#{$fa-css-prefix}-music:before { content: $fa-var-music; } .#{$fa-css-prefix}-search:before { content: $fa-var-search; } .#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } .#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } .#{$fa-css-prefix}-star:before { content: $fa-var-star; } .#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } .#{$fa-css-prefix}-user:before { content: $fa-var-user; } .#{$fa-css-prefix}-film:before { content: $fa-var-film; } .#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } .#{$fa-css-prefix}-th:before { content: $fa-var-th; } .#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } .#{$fa-css-prefix}-check:before { content: $fa-var-check; } .#{$fa-css-prefix}-remove:before, .#{$fa-css-prefix}-close:before, .#{$fa-css-prefix}-times:before { content: $fa-var-times; } .#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } .#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } .#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } .#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } .#{$fa-css-prefix}-gear:before, .#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } .#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } .#{$fa-css-prefix}-home:before { content: $fa-var-home; } .#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } .#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } .#{$fa-css-prefix}-road:before { content: $fa-var-road; } .#{$fa-css-prefix}-download:before { content: $fa-var-download; } .#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } .#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } .#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } .#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } .#{$fa-css-prefix}-rotate-right:before, .#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } .#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } .#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } .#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } .#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } .#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } .#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } .#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } .#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } .#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } .#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } .#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } .#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } .#{$fa-css-prefix}-book:before { content: $fa-var-book; } .#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } .#{$fa-css-prefix}-print:before { content: $fa-var-print; } .#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } .#{$fa-css-prefix}-font:before { content: $fa-var-font; } .#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } .#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } .#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } .#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } .#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } .#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } .#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } .#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } .#{$fa-css-prefix}-list:before { content: $fa-var-list; } .#{$fa-css-prefix}-dedent:before, .#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } .#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } .#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } .#{$fa-css-prefix}-photo:before, .#{$fa-css-prefix}-image:before, .#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } .#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } .#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } .#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } .#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } .#{$fa-css-prefix}-edit:before, .#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } .#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } .#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } .#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } .#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } .#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } .#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } .#{$fa-css-prefix}-play:before { content: $fa-var-play; } .#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } .#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } .#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } .#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } .#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } .#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } .#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } .#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } .#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } .#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } .#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } .#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } .#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } .#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } .#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } .#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } .#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } .#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } .#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } .#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } .#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } .#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } .#{$fa-css-prefix}-mail-forward:before, .#{$fa-css-prefix}-share:before { content: $fa-var-share; } .#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } .#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } .#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } .#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } .#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } .#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } .#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } .#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } .#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } .#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } .#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } .#{$fa-css-prefix}-warning:before, .#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } .#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } .#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } .#{$fa-css-prefix}-random:before { content: $fa-var-random; } .#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } .#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } .#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } .#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } .#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } .#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } .#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } .#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } .#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } .#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } .#{$fa-css-prefix}-bar-chart-o:before, .#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } .#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } .#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } .#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } .#{$fa-css-prefix}-key:before { content: $fa-var-key; } .#{$fa-css-prefix}-gears:before, .#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } .#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } .#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } .#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } .#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } .#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } .#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } .#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } .#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } .#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } .#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } .#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } .#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } .#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } .#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } .#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } .#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } .#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } .#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } .#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } .#{$fa-css-prefix}-facebook-f:before, .#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } .#{$fa-css-prefix}-github:before { content: $fa-var-github; } .#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } .#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } .#{$fa-css-prefix}-feed:before, .#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } .#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } .#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } .#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } .#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } .#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } .#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } .#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } .#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } .#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } .#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } .#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } .#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } .#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } .#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } .#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } .#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } .#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } .#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } .#{$fa-css-prefix}-group:before, .#{$fa-css-prefix}-users:before { content: $fa-var-users; } .#{$fa-css-prefix}-chain:before, .#{$fa-css-prefix}-link:before { content: $fa-var-link; } .#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } .#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } .#{$fa-css-prefix}-cut:before, .#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } .#{$fa-css-prefix}-copy:before, .#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } .#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } .#{$fa-css-prefix}-save:before, .#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } .#{$fa-css-prefix}-square:before { content: $fa-var-square; } .#{$fa-css-prefix}-navicon:before, .#{$fa-css-prefix}-reorder:before, .#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } .#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } .#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } .#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } .#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } .#{$fa-css-prefix}-table:before { content: $fa-var-table; } .#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } .#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } .#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } .#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } .#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } .#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } .#{$fa-css-prefix}-money:before { content: $fa-var-money; } .#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } .#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } .#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } .#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } .#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } .#{$fa-css-prefix}-unsorted:before, .#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } .#{$fa-css-prefix}-sort-down:before, .#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } .#{$fa-css-prefix}-sort-up:before, .#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } .#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } .#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } .#{$fa-css-prefix}-rotate-left:before, .#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } .#{$fa-css-prefix}-legal:before, .#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } .#{$fa-css-prefix}-dashboard:before, .#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } .#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } .#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } .#{$fa-css-prefix}-flash:before, .#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } .#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } .#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } .#{$fa-css-prefix}-paste:before, .#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } .#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } .#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } .#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } .#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } .#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } .#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } .#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } .#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } .#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } .#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } .#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } .#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } .#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } .#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } .#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } .#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } .#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } .#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } .#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } .#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } .#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } .#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } .#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } .#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } .#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } .#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } .#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } .#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } .#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } .#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } .#{$fa-css-prefix}-mobile-phone:before, .#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } .#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } .#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } .#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } .#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } .#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } .#{$fa-css-prefix}-mail-reply:before, .#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } .#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } .#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } .#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } .#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } .#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } .#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } .#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } .#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } .#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } .#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } .#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } .#{$fa-css-prefix}-code:before { content: $fa-var-code; } .#{$fa-css-prefix}-mail-reply-all:before, .#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } .#{$fa-css-prefix}-star-half-empty:before, .#{$fa-css-prefix}-star-half-full:before, .#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } .#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } .#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } .#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } .#{$fa-css-prefix}-unlink:before, .#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } .#{$fa-css-prefix}-question:before { content: $fa-var-question; } .#{$fa-css-prefix}-info:before { content: $fa-var-info; } .#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } .#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } .#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } .#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } .#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } .#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } .#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } .#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } .#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } .#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } .#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } .#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } .#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } .#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } .#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } .#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } .#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } .#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } .#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } .#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } .#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } .#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } .#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } .#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } .#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } .#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } .#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } .#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } .#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } .#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } .#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } .#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } .#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } .#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } .#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } .#{$fa-css-prefix}-toggle-down:before, .#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } .#{$fa-css-prefix}-toggle-up:before, .#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } .#{$fa-css-prefix}-toggle-right:before, .#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } .#{$fa-css-prefix}-euro:before, .#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } .#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } .#{$fa-css-prefix}-dollar:before, .#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } .#{$fa-css-prefix}-rupee:before, .#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } .#{$fa-css-prefix}-cny:before, .#{$fa-css-prefix}-rmb:before, .#{$fa-css-prefix}-yen:before, .#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } .#{$fa-css-prefix}-ruble:before, .#{$fa-css-prefix}-rouble:before, .#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } .#{$fa-css-prefix}-won:before, .#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } .#{$fa-css-prefix}-bitcoin:before, .#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } .#{$fa-css-prefix}-file:before { content: $fa-var-file; } .#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } .#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } .#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } .#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } .#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } .#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } .#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } .#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } .#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } .#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } .#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } .#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } .#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } .#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } .#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } .#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } .#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } .#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } .#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } .#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } .#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } .#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } .#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } .#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } .#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } .#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } .#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } .#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } .#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } .#{$fa-css-prefix}-android:before { content: $fa-var-android; } .#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } .#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } .#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } .#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } .#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } .#{$fa-css-prefix}-female:before { content: $fa-var-female; } .#{$fa-css-prefix}-male:before { content: $fa-var-male; } .#{$fa-css-prefix}-gittip:before, .#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } .#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } .#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } .#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } .#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } .#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } .#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } .#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } .#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } .#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } .#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } .#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } .#{$fa-css-prefix}-toggle-left:before, .#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } .#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } .#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } .#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } .#{$fa-css-prefix}-turkish-lira:before, .#{$fa-css-prefix}-try:before { content: $fa-var-try; } .#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } .#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } .#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } .#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } .#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } .#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } .#{$fa-css-prefix}-institution:before, .#{$fa-css-prefix}-bank:before, .#{$fa-css-prefix}-university:before { content: $fa-var-university; } .#{$fa-css-prefix}-mortar-board:before, .#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } .#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } .#{$fa-css-prefix}-google:before { content: $fa-var-google; } .#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } .#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } .#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } .#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } .#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } .#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } .#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } .#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } .#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } .#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } .#{$fa-css-prefix}-language:before { content: $fa-var-language; } .#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } .#{$fa-css-prefix}-building:before { content: $fa-var-building; } .#{$fa-css-prefix}-child:before { content: $fa-var-child; } .#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } .#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } .#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } .#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } .#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } .#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } .#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } .#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } .#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } .#{$fa-css-prefix}-automobile:before, .#{$fa-css-prefix}-car:before { content: $fa-var-car; } .#{$fa-css-prefix}-cab:before, .#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } .#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } .#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } .#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } .#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } .#{$fa-css-prefix}-database:before { content: $fa-var-database; } .#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } .#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } .#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } .#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } .#{$fa-css-prefix}-file-photo-o:before, .#{$fa-css-prefix}-file-picture-o:before, .#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } .#{$fa-css-prefix}-file-zip-o:before, .#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } .#{$fa-css-prefix}-file-sound-o:before, .#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } .#{$fa-css-prefix}-file-movie-o:before, .#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } .#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } .#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } .#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } .#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } .#{$fa-css-prefix}-life-bouy:before, .#{$fa-css-prefix}-life-buoy:before, .#{$fa-css-prefix}-life-saver:before, .#{$fa-css-prefix}-support:before, .#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } .#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } .#{$fa-css-prefix}-ra:before, .#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } .#{$fa-css-prefix}-ge:before, .#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } .#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } .#{$fa-css-prefix}-git:before { content: $fa-var-git; } .#{$fa-css-prefix}-y-combinator-square:before, .#{$fa-css-prefix}-yc-square:before, .#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } .#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } .#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } .#{$fa-css-prefix}-wechat:before, .#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } .#{$fa-css-prefix}-send:before, .#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } .#{$fa-css-prefix}-send-o:before, .#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } .#{$fa-css-prefix}-history:before { content: $fa-var-history; } .#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } .#{$fa-css-prefix}-header:before { content: $fa-var-header; } .#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } .#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } .#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } .#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } .#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } .#{$fa-css-prefix}-soccer-ball-o:before, .#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } .#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } .#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } .#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } .#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } .#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } .#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } .#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } .#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } .#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } .#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } .#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } .#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } .#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } .#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } .#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } .#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } .#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } .#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } .#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } .#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } .#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } .#{$fa-css-prefix}-at:before { content: $fa-var-at; } .#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } .#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } .#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } .#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } .#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } .#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } .#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } .#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } .#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } .#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } .#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } .#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } .#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } .#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } .#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } .#{$fa-css-prefix}-shekel:before, .#{$fa-css-prefix}-sheqel:before, .#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } .#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } .#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } .#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } .#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } .#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } .#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } .#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } .#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } .#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } .#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } .#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } .#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } .#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } .#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } .#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } .#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } .#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } .#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } .#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } .#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } .#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } .#{$fa-css-prefix}-intersex:before, .#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } .#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } .#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } .#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } .#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } .#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } .#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } .#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } .#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } .#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } .#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } .#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } .#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } .#{$fa-css-prefix}-server:before { content: $fa-var-server; } .#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } .#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } .#{$fa-css-prefix}-hotel:before, .#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } .#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } .#{$fa-css-prefix}-train:before { content: $fa-var-train; } .#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } .#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } .#{$fa-css-prefix}-yc:before, .#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } .#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } .#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } .#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } .#{$fa-css-prefix}-battery-4:before, .#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } .#{$fa-css-prefix}-battery-3:before, .#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } .#{$fa-css-prefix}-battery-2:before, .#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } .#{$fa-css-prefix}-battery-1:before, .#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } .#{$fa-css-prefix}-battery-0:before, .#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } .#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } .#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } .#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } .#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } .#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } .#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } .#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } .#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } .#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } .#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } .#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } .#{$fa-css-prefix}-hourglass-1:before, .#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } .#{$fa-css-prefix}-hourglass-2:before, .#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } .#{$fa-css-prefix}-hourglass-3:before, .#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } .#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } .#{$fa-css-prefix}-hand-grab-o:before, .#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } .#{$fa-css-prefix}-hand-stop-o:before, .#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } .#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } .#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } .#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } .#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } .#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } .#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } .#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } .#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } .#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } .#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } .#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } .#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } .#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } .#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } .#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } .#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } .#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } .#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } .#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } .#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } .#{$fa-css-prefix}-tv:before, .#{$fa-css-prefix}-television:before { content: $fa-var-television; } .#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } .#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } .#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } .#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } .#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } .#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } .#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } .#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } .#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } .#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } .#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } .#{$fa-css-prefix}-map:before { content: $fa-var-map; } .#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } .#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } .#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } .#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } .#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } .#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } PK!$6ww4abilian/web/resources/font-awesome/scss/_larger.scss// Icon Sizes // ------------------------- /* makes the font 33% larger relative to the icon container */ .#{$fa-css-prefix}-lg { font-size: (4em / 3); line-height: (3em / 4); vertical-align: -15%; } .#{$fa-css-prefix}-2x { font-size: 2em; } .#{$fa-css-prefix}-3x { font-size: 3em; } .#{$fa-css-prefix}-4x { font-size: 4em; } .#{$fa-css-prefix}-5x { font-size: 5em; } PK!┩zz2abilian/web/resources/font-awesome/scss/_list.scss// List Icons // ------------------------- .#{$fa-css-prefix}-ul { padding-left: 0; margin-left: $fa-li-width; list-style-type: none; > li { position: relative; } } .#{$fa-css-prefix}-li { position: absolute; left: -$fa-li-width; width: $fa-li-width; top: (2em / 14); text-align: center; &.#{$fa-css-prefix}-lg { left: -$fa-li-width + (4em / 14); } } PK!4abilian/web/resources/font-awesome/scss/_mixins.scss// Mixins // -------------------------- @mixin fa-icon() { display: inline-block; font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration font-size: inherit; // can't have font-size inherit on line above, so need to override text-rendering: auto; // optimizelegibility throws things off #1094 -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @mixin fa-icon-rotate($degrees, $rotation) { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); -webkit-transform: rotate($degrees); -ms-transform: rotate($degrees); transform: rotate($degrees); } @mixin fa-icon-flip($horiz, $vert, $rotation) { filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}); -webkit-transform: scale($horiz, $vert); -ms-transform: scale($horiz, $vert); transform: scale($horiz, $vert); } PK!,2abilian/web/resources/font-awesome/scss/_path.scss/* FONT PATH * -------------------------- */ @font-face { font-family: 'FontAwesome'; src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts font-weight: normal; font-style: normal; } PK! 鈅=abilian/web/resources/font-awesome/scss/_rotated-flipped.scss// Rotated & Flipped Icons // ------------------------- .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } // Hook for IE8-9 // ------------------------- :root .#{$fa-css-prefix}-rotate-90, :root .#{$fa-css-prefix}-rotate-180, :root .#{$fa-css-prefix}-rotate-270, :root .#{$fa-css-prefix}-flip-horizontal, :root .#{$fa-css-prefix}-flip-vertical { filter: none; } PK!\5abilian/web/resources/font-awesome/scss/_stacked.scss// Stacked Icons // ------------------------- .#{$fa-css-prefix}-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .#{$fa-css-prefix}-stack-1x { line-height: inherit; } .#{$fa-css-prefix}-stack-2x { font-size: 2em; } .#{$fa-css-prefix}-inverse { color: $fa-inverse; } PK! TKTK7abilian/web/resources/font-awesome/scss/_variables.scss// Variables // -------------------------- $fa-font-path: "../fonts" !default; $fa-font-size-base: 14px !default; $fa-line-height-base: 1 !default; //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.4.0/fonts" !default; // for referencing Bootstrap CDN font files directly $fa-css-prefix: fa !default; $fa-version: "4.4.0" !default; $fa-border-color: #eee !default; $fa-inverse: #fff !default; $fa-li-width: (30em / 14) !default; $fa-var-500px: "\f26e"; $fa-var-adjust: "\f042"; $fa-var-adn: "\f170"; $fa-var-align-center: "\f037"; $fa-var-align-justify: "\f039"; $fa-var-align-left: "\f036"; $fa-var-align-right: "\f038"; $fa-var-amazon: "\f270"; $fa-var-ambulance: "\f0f9"; $fa-var-anchor: "\f13d"; $fa-var-android: "\f17b"; $fa-var-angellist: "\f209"; $fa-var-angle-double-down: "\f103"; $fa-var-angle-double-left: "\f100"; $fa-var-angle-double-right: "\f101"; $fa-var-angle-double-up: "\f102"; $fa-var-angle-down: "\f107"; $fa-var-angle-left: "\f104"; $fa-var-angle-right: "\f105"; $fa-var-angle-up: "\f106"; $fa-var-apple: "\f179"; $fa-var-archive: "\f187"; $fa-var-area-chart: "\f1fe"; $fa-var-arrow-circle-down: "\f0ab"; $fa-var-arrow-circle-left: "\f0a8"; $fa-var-arrow-circle-o-down: "\f01a"; $fa-var-arrow-circle-o-left: "\f190"; $fa-var-arrow-circle-o-right: "\f18e"; $fa-var-arrow-circle-o-up: "\f01b"; $fa-var-arrow-circle-right: "\f0a9"; $fa-var-arrow-circle-up: "\f0aa"; $fa-var-arrow-down: "\f063"; $fa-var-arrow-left: "\f060"; $fa-var-arrow-right: "\f061"; $fa-var-arrow-up: "\f062"; $fa-var-arrows: "\f047"; $fa-var-arrows-alt: "\f0b2"; $fa-var-arrows-h: "\f07e"; $fa-var-arrows-v: "\f07d"; $fa-var-asterisk: "\f069"; $fa-var-at: "\f1fa"; $fa-var-automobile: "\f1b9"; $fa-var-backward: "\f04a"; $fa-var-balance-scale: "\f24e"; $fa-var-ban: "\f05e"; $fa-var-bank: "\f19c"; $fa-var-bar-chart: "\f080"; $fa-var-bar-chart-o: "\f080"; $fa-var-barcode: "\f02a"; $fa-var-bars: "\f0c9"; $fa-var-battery-0: "\f244"; $fa-var-battery-1: "\f243"; $fa-var-battery-2: "\f242"; $fa-var-battery-3: "\f241"; $fa-var-battery-4: "\f240"; $fa-var-battery-empty: "\f244"; $fa-var-battery-full: "\f240"; $fa-var-battery-half: "\f242"; $fa-var-battery-quarter: "\f243"; $fa-var-battery-three-quarters: "\f241"; $fa-var-bed: "\f236"; $fa-var-beer: "\f0fc"; $fa-var-behance: "\f1b4"; $fa-var-behance-square: "\f1b5"; $fa-var-bell: "\f0f3"; $fa-var-bell-o: "\f0a2"; $fa-var-bell-slash: "\f1f6"; $fa-var-bell-slash-o: "\f1f7"; $fa-var-bicycle: "\f206"; $fa-var-binoculars: "\f1e5"; $fa-var-birthday-cake: "\f1fd"; $fa-var-bitbucket: "\f171"; $fa-var-bitbucket-square: "\f172"; $fa-var-bitcoin: "\f15a"; $fa-var-black-tie: "\f27e"; $fa-var-bold: "\f032"; $fa-var-bolt: "\f0e7"; $fa-var-bomb: "\f1e2"; $fa-var-book: "\f02d"; $fa-var-bookmark: "\f02e"; $fa-var-bookmark-o: "\f097"; $fa-var-briefcase: "\f0b1"; $fa-var-btc: "\f15a"; $fa-var-bug: "\f188"; $fa-var-building: "\f1ad"; $fa-var-building-o: "\f0f7"; $fa-var-bullhorn: "\f0a1"; $fa-var-bullseye: "\f140"; $fa-var-bus: "\f207"; $fa-var-buysellads: "\f20d"; $fa-var-cab: "\f1ba"; $fa-var-calculator: "\f1ec"; $fa-var-calendar: "\f073"; $fa-var-calendar-check-o: "\f274"; $fa-var-calendar-minus-o: "\f272"; $fa-var-calendar-o: "\f133"; $fa-var-calendar-plus-o: "\f271"; $fa-var-calendar-times-o: "\f273"; $fa-var-camera: "\f030"; $fa-var-camera-retro: "\f083"; $fa-var-car: "\f1b9"; $fa-var-caret-down: "\f0d7"; $fa-var-caret-left: "\f0d9"; $fa-var-caret-right: "\f0da"; $fa-var-caret-square-o-down: "\f150"; $fa-var-caret-square-o-left: "\f191"; $fa-var-caret-square-o-right: "\f152"; $fa-var-caret-square-o-up: "\f151"; $fa-var-caret-up: "\f0d8"; $fa-var-cart-arrow-down: "\f218"; $fa-var-cart-plus: "\f217"; $fa-var-cc: "\f20a"; $fa-var-cc-amex: "\f1f3"; $fa-var-cc-diners-club: "\f24c"; $fa-var-cc-discover: "\f1f2"; $fa-var-cc-jcb: "\f24b"; $fa-var-cc-mastercard: "\f1f1"; $fa-var-cc-paypal: "\f1f4"; $fa-var-cc-stripe: "\f1f5"; $fa-var-cc-visa: "\f1f0"; $fa-var-certificate: "\f0a3"; $fa-var-chain: "\f0c1"; $fa-var-chain-broken: "\f127"; $fa-var-check: "\f00c"; $fa-var-check-circle: "\f058"; $fa-var-check-circle-o: "\f05d"; $fa-var-check-square: "\f14a"; $fa-var-check-square-o: "\f046"; $fa-var-chevron-circle-down: "\f13a"; $fa-var-chevron-circle-left: "\f137"; $fa-var-chevron-circle-right: "\f138"; $fa-var-chevron-circle-up: "\f139"; $fa-var-chevron-down: "\f078"; $fa-var-chevron-left: "\f053"; $fa-var-chevron-right: "\f054"; $fa-var-chevron-up: "\f077"; $fa-var-child: "\f1ae"; $fa-var-chrome: "\f268"; $fa-var-circle: "\f111"; $fa-var-circle-o: "\f10c"; $fa-var-circle-o-notch: "\f1ce"; $fa-var-circle-thin: "\f1db"; $fa-var-clipboard: "\f0ea"; $fa-var-clock-o: "\f017"; $fa-var-clone: "\f24d"; $fa-var-close: "\f00d"; $fa-var-cloud: "\f0c2"; $fa-var-cloud-download: "\f0ed"; $fa-var-cloud-upload: "\f0ee"; $fa-var-cny: "\f157"; $fa-var-code: "\f121"; $fa-var-code-fork: "\f126"; $fa-var-codepen: "\f1cb"; $fa-var-coffee: "\f0f4"; $fa-var-cog: "\f013"; $fa-var-cogs: "\f085"; $fa-var-columns: "\f0db"; $fa-var-comment: "\f075"; $fa-var-comment-o: "\f0e5"; $fa-var-commenting: "\f27a"; $fa-var-commenting-o: "\f27b"; $fa-var-comments: "\f086"; $fa-var-comments-o: "\f0e6"; $fa-var-compass: "\f14e"; $fa-var-compress: "\f066"; $fa-var-connectdevelop: "\f20e"; $fa-var-contao: "\f26d"; $fa-var-copy: "\f0c5"; $fa-var-copyright: "\f1f9"; $fa-var-creative-commons: "\f25e"; $fa-var-credit-card: "\f09d"; $fa-var-crop: "\f125"; $fa-var-crosshairs: "\f05b"; $fa-var-css3: "\f13c"; $fa-var-cube: "\f1b2"; $fa-var-cubes: "\f1b3"; $fa-var-cut: "\f0c4"; $fa-var-cutlery: "\f0f5"; $fa-var-dashboard: "\f0e4"; $fa-var-dashcube: "\f210"; $fa-var-database: "\f1c0"; $fa-var-dedent: "\f03b"; $fa-var-delicious: "\f1a5"; $fa-var-desktop: "\f108"; $fa-var-deviantart: "\f1bd"; $fa-var-diamond: "\f219"; $fa-var-digg: "\f1a6"; $fa-var-dollar: "\f155"; $fa-var-dot-circle-o: "\f192"; $fa-var-download: "\f019"; $fa-var-dribbble: "\f17d"; $fa-var-dropbox: "\f16b"; $fa-var-drupal: "\f1a9"; $fa-var-edit: "\f044"; $fa-var-eject: "\f052"; $fa-var-ellipsis-h: "\f141"; $fa-var-ellipsis-v: "\f142"; $fa-var-empire: "\f1d1"; $fa-var-envelope: "\f0e0"; $fa-var-envelope-o: "\f003"; $fa-var-envelope-square: "\f199"; $fa-var-eraser: "\f12d"; $fa-var-eur: "\f153"; $fa-var-euro: "\f153"; $fa-var-exchange: "\f0ec"; $fa-var-exclamation: "\f12a"; $fa-var-exclamation-circle: "\f06a"; $fa-var-exclamation-triangle: "\f071"; $fa-var-expand: "\f065"; $fa-var-expeditedssl: "\f23e"; $fa-var-external-link: "\f08e"; $fa-var-external-link-square: "\f14c"; $fa-var-eye: "\f06e"; $fa-var-eye-slash: "\f070"; $fa-var-eyedropper: "\f1fb"; $fa-var-facebook: "\f09a"; $fa-var-facebook-f: "\f09a"; $fa-var-facebook-official: "\f230"; $fa-var-facebook-square: "\f082"; $fa-var-fast-backward: "\f049"; $fa-var-fast-forward: "\f050"; $fa-var-fax: "\f1ac"; $fa-var-feed: "\f09e"; $fa-var-female: "\f182"; $fa-var-fighter-jet: "\f0fb"; $fa-var-file: "\f15b"; $fa-var-file-archive-o: "\f1c6"; $fa-var-file-audio-o: "\f1c7"; $fa-var-file-code-o: "\f1c9"; $fa-var-file-excel-o: "\f1c3"; $fa-var-file-image-o: "\f1c5"; $fa-var-file-movie-o: "\f1c8"; $fa-var-file-o: "\f016"; $fa-var-file-pdf-o: "\f1c1"; $fa-var-file-photo-o: "\f1c5"; $fa-var-file-picture-o: "\f1c5"; $fa-var-file-powerpoint-o: "\f1c4"; $fa-var-file-sound-o: "\f1c7"; $fa-var-file-text: "\f15c"; $fa-var-file-text-o: "\f0f6"; $fa-var-file-video-o: "\f1c8"; $fa-var-file-word-o: "\f1c2"; $fa-var-file-zip-o: "\f1c6"; $fa-var-files-o: "\f0c5"; $fa-var-film: "\f008"; $fa-var-filter: "\f0b0"; $fa-var-fire: "\f06d"; $fa-var-fire-extinguisher: "\f134"; $fa-var-firefox: "\f269"; $fa-var-flag: "\f024"; $fa-var-flag-checkered: "\f11e"; $fa-var-flag-o: "\f11d"; $fa-var-flash: "\f0e7"; $fa-var-flask: "\f0c3"; $fa-var-flickr: "\f16e"; $fa-var-floppy-o: "\f0c7"; $fa-var-folder: "\f07b"; $fa-var-folder-o: "\f114"; $fa-var-folder-open: "\f07c"; $fa-var-folder-open-o: "\f115"; $fa-var-font: "\f031"; $fa-var-fonticons: "\f280"; $fa-var-forumbee: "\f211"; $fa-var-forward: "\f04e"; $fa-var-foursquare: "\f180"; $fa-var-frown-o: "\f119"; $fa-var-futbol-o: "\f1e3"; $fa-var-gamepad: "\f11b"; $fa-var-gavel: "\f0e3"; $fa-var-gbp: "\f154"; $fa-var-ge: "\f1d1"; $fa-var-gear: "\f013"; $fa-var-gears: "\f085"; $fa-var-genderless: "\f22d"; $fa-var-get-pocket: "\f265"; $fa-var-gg: "\f260"; $fa-var-gg-circle: "\f261"; $fa-var-gift: "\f06b"; $fa-var-git: "\f1d3"; $fa-var-git-square: "\f1d2"; $fa-var-github: "\f09b"; $fa-var-github-alt: "\f113"; $fa-var-github-square: "\f092"; $fa-var-gittip: "\f184"; $fa-var-glass: "\f000"; $fa-var-globe: "\f0ac"; $fa-var-google: "\f1a0"; $fa-var-google-plus: "\f0d5"; $fa-var-google-plus-square: "\f0d4"; $fa-var-google-wallet: "\f1ee"; $fa-var-graduation-cap: "\f19d"; $fa-var-gratipay: "\f184"; $fa-var-group: "\f0c0"; $fa-var-h-square: "\f0fd"; $fa-var-hacker-news: "\f1d4"; $fa-var-hand-grab-o: "\f255"; $fa-var-hand-lizard-o: "\f258"; $fa-var-hand-o-down: "\f0a7"; $fa-var-hand-o-left: "\f0a5"; $fa-var-hand-o-right: "\f0a4"; $fa-var-hand-o-up: "\f0a6"; $fa-var-hand-paper-o: "\f256"; $fa-var-hand-peace-o: "\f25b"; $fa-var-hand-pointer-o: "\f25a"; $fa-var-hand-rock-o: "\f255"; $fa-var-hand-scissors-o: "\f257"; $fa-var-hand-spock-o: "\f259"; $fa-var-hand-stop-o: "\f256"; $fa-var-hdd-o: "\f0a0"; $fa-var-header: "\f1dc"; $fa-var-headphones: "\f025"; $fa-var-heart: "\f004"; $fa-var-heart-o: "\f08a"; $fa-var-heartbeat: "\f21e"; $fa-var-history: "\f1da"; $fa-var-home: "\f015"; $fa-var-hospital-o: "\f0f8"; $fa-var-hotel: "\f236"; $fa-var-hourglass: "\f254"; $fa-var-hourglass-1: "\f251"; $fa-var-hourglass-2: "\f252"; $fa-var-hourglass-3: "\f253"; $fa-var-hourglass-end: "\f253"; $fa-var-hourglass-half: "\f252"; $fa-var-hourglass-o: "\f250"; $fa-var-hourglass-start: "\f251"; $fa-var-houzz: "\f27c"; $fa-var-html5: "\f13b"; $fa-var-i-cursor: "\f246"; $fa-var-ils: "\f20b"; $fa-var-image: "\f03e"; $fa-var-inbox: "\f01c"; $fa-var-indent: "\f03c"; $fa-var-industry: "\f275"; $fa-var-info: "\f129"; $fa-var-info-circle: "\f05a"; $fa-var-inr: "\f156"; $fa-var-instagram: "\f16d"; $fa-var-institution: "\f19c"; $fa-var-internet-explorer: "\f26b"; $fa-var-intersex: "\f224"; $fa-var-ioxhost: "\f208"; $fa-var-italic: "\f033"; $fa-var-joomla: "\f1aa"; $fa-var-jpy: "\f157"; $fa-var-jsfiddle: "\f1cc"; $fa-var-key: "\f084"; $fa-var-keyboard-o: "\f11c"; $fa-var-krw: "\f159"; $fa-var-language: "\f1ab"; $fa-var-laptop: "\f109"; $fa-var-lastfm: "\f202"; $fa-var-lastfm-square: "\f203"; $fa-var-leaf: "\f06c"; $fa-var-leanpub: "\f212"; $fa-var-legal: "\f0e3"; $fa-var-lemon-o: "\f094"; $fa-var-level-down: "\f149"; $fa-var-level-up: "\f148"; $fa-var-life-bouy: "\f1cd"; $fa-var-life-buoy: "\f1cd"; $fa-var-life-ring: "\f1cd"; $fa-var-life-saver: "\f1cd"; $fa-var-lightbulb-o: "\f0eb"; $fa-var-line-chart: "\f201"; $fa-var-link: "\f0c1"; $fa-var-linkedin: "\f0e1"; $fa-var-linkedin-square: "\f08c"; $fa-var-linux: "\f17c"; $fa-var-list: "\f03a"; $fa-var-list-alt: "\f022"; $fa-var-list-ol: "\f0cb"; $fa-var-list-ul: "\f0ca"; $fa-var-location-arrow: "\f124"; $fa-var-lock: "\f023"; $fa-var-long-arrow-down: "\f175"; $fa-var-long-arrow-left: "\f177"; $fa-var-long-arrow-right: "\f178"; $fa-var-long-arrow-up: "\f176"; $fa-var-magic: "\f0d0"; $fa-var-magnet: "\f076"; $fa-var-mail-forward: "\f064"; $fa-var-mail-reply: "\f112"; $fa-var-mail-reply-all: "\f122"; $fa-var-male: "\f183"; $fa-var-map: "\f279"; $fa-var-map-marker: "\f041"; $fa-var-map-o: "\f278"; $fa-var-map-pin: "\f276"; $fa-var-map-signs: "\f277"; $fa-var-mars: "\f222"; $fa-var-mars-double: "\f227"; $fa-var-mars-stroke: "\f229"; $fa-var-mars-stroke-h: "\f22b"; $fa-var-mars-stroke-v: "\f22a"; $fa-var-maxcdn: "\f136"; $fa-var-meanpath: "\f20c"; $fa-var-medium: "\f23a"; $fa-var-medkit: "\f0fa"; $fa-var-meh-o: "\f11a"; $fa-var-mercury: "\f223"; $fa-var-microphone: "\f130"; $fa-var-microphone-slash: "\f131"; $fa-var-minus: "\f068"; $fa-var-minus-circle: "\f056"; $fa-var-minus-square: "\f146"; $fa-var-minus-square-o: "\f147"; $fa-var-mobile: "\f10b"; $fa-var-mobile-phone: "\f10b"; $fa-var-money: "\f0d6"; $fa-var-moon-o: "\f186"; $fa-var-mortar-board: "\f19d"; $fa-var-motorcycle: "\f21c"; $fa-var-mouse-pointer: "\f245"; $fa-var-music: "\f001"; $fa-var-navicon: "\f0c9"; $fa-var-neuter: "\f22c"; $fa-var-newspaper-o: "\f1ea"; $fa-var-object-group: "\f247"; $fa-var-object-ungroup: "\f248"; $fa-var-odnoklassniki: "\f263"; $fa-var-odnoklassniki-square: "\f264"; $fa-var-opencart: "\f23d"; $fa-var-openid: "\f19b"; $fa-var-opera: "\f26a"; $fa-var-optin-monster: "\f23c"; $fa-var-outdent: "\f03b"; $fa-var-pagelines: "\f18c"; $fa-var-paint-brush: "\f1fc"; $fa-var-paper-plane: "\f1d8"; $fa-var-paper-plane-o: "\f1d9"; $fa-var-paperclip: "\f0c6"; $fa-var-paragraph: "\f1dd"; $fa-var-paste: "\f0ea"; $fa-var-pause: "\f04c"; $fa-var-paw: "\f1b0"; $fa-var-paypal: "\f1ed"; $fa-var-pencil: "\f040"; $fa-var-pencil-square: "\f14b"; $fa-var-pencil-square-o: "\f044"; $fa-var-phone: "\f095"; $fa-var-phone-square: "\f098"; $fa-var-photo: "\f03e"; $fa-var-picture-o: "\f03e"; $fa-var-pie-chart: "\f200"; $fa-var-pied-piper: "\f1a7"; $fa-var-pied-piper-alt: "\f1a8"; $fa-var-pinterest: "\f0d2"; $fa-var-pinterest-p: "\f231"; $fa-var-pinterest-square: "\f0d3"; $fa-var-plane: "\f072"; $fa-var-play: "\f04b"; $fa-var-play-circle: "\f144"; $fa-var-play-circle-o: "\f01d"; $fa-var-plug: "\f1e6"; $fa-var-plus: "\f067"; $fa-var-plus-circle: "\f055"; $fa-var-plus-square: "\f0fe"; $fa-var-plus-square-o: "\f196"; $fa-var-power-off: "\f011"; $fa-var-print: "\f02f"; $fa-var-puzzle-piece: "\f12e"; $fa-var-qq: "\f1d6"; $fa-var-qrcode: "\f029"; $fa-var-question: "\f128"; $fa-var-question-circle: "\f059"; $fa-var-quote-left: "\f10d"; $fa-var-quote-right: "\f10e"; $fa-var-ra: "\f1d0"; $fa-var-random: "\f074"; $fa-var-rebel: "\f1d0"; $fa-var-recycle: "\f1b8"; $fa-var-reddit: "\f1a1"; $fa-var-reddit-square: "\f1a2"; $fa-var-refresh: "\f021"; $fa-var-registered: "\f25d"; $fa-var-remove: "\f00d"; $fa-var-renren: "\f18b"; $fa-var-reorder: "\f0c9"; $fa-var-repeat: "\f01e"; $fa-var-reply: "\f112"; $fa-var-reply-all: "\f122"; $fa-var-retweet: "\f079"; $fa-var-rmb: "\f157"; $fa-var-road: "\f018"; $fa-var-rocket: "\f135"; $fa-var-rotate-left: "\f0e2"; $fa-var-rotate-right: "\f01e"; $fa-var-rouble: "\f158"; $fa-var-rss: "\f09e"; $fa-var-rss-square: "\f143"; $fa-var-rub: "\f158"; $fa-var-ruble: "\f158"; $fa-var-rupee: "\f156"; $fa-var-safari: "\f267"; $fa-var-save: "\f0c7"; $fa-var-scissors: "\f0c4"; $fa-var-search: "\f002"; $fa-var-search-minus: "\f010"; $fa-var-search-plus: "\f00e"; $fa-var-sellsy: "\f213"; $fa-var-send: "\f1d8"; $fa-var-send-o: "\f1d9"; $fa-var-server: "\f233"; $fa-var-share: "\f064"; $fa-var-share-alt: "\f1e0"; $fa-var-share-alt-square: "\f1e1"; $fa-var-share-square: "\f14d"; $fa-var-share-square-o: "\f045"; $fa-var-shekel: "\f20b"; $fa-var-sheqel: "\f20b"; $fa-var-shield: "\f132"; $fa-var-ship: "\f21a"; $fa-var-shirtsinbulk: "\f214"; $fa-var-shopping-cart: "\f07a"; $fa-var-sign-in: "\f090"; $fa-var-sign-out: "\f08b"; $fa-var-signal: "\f012"; $fa-var-simplybuilt: "\f215"; $fa-var-sitemap: "\f0e8"; $fa-var-skyatlas: "\f216"; $fa-var-skype: "\f17e"; $fa-var-slack: "\f198"; $fa-var-sliders: "\f1de"; $fa-var-slideshare: "\f1e7"; $fa-var-smile-o: "\f118"; $fa-var-soccer-ball-o: "\f1e3"; $fa-var-sort: "\f0dc"; $fa-var-sort-alpha-asc: "\f15d"; $fa-var-sort-alpha-desc: "\f15e"; $fa-var-sort-amount-asc: "\f160"; $fa-var-sort-amount-desc: "\f161"; $fa-var-sort-asc: "\f0de"; $fa-var-sort-desc: "\f0dd"; $fa-var-sort-down: "\f0dd"; $fa-var-sort-numeric-asc: "\f162"; $fa-var-sort-numeric-desc: "\f163"; $fa-var-sort-up: "\f0de"; $fa-var-soundcloud: "\f1be"; $fa-var-space-shuttle: "\f197"; $fa-var-spinner: "\f110"; $fa-var-spoon: "\f1b1"; $fa-var-spotify: "\f1bc"; $fa-var-square: "\f0c8"; $fa-var-square-o: "\f096"; $fa-var-stack-exchange: "\f18d"; $fa-var-stack-overflow: "\f16c"; $fa-var-star: "\f005"; $fa-var-star-half: "\f089"; $fa-var-star-half-empty: "\f123"; $fa-var-star-half-full: "\f123"; $fa-var-star-half-o: "\f123"; $fa-var-star-o: "\f006"; $fa-var-steam: "\f1b6"; $fa-var-steam-square: "\f1b7"; $fa-var-step-backward: "\f048"; $fa-var-step-forward: "\f051"; $fa-var-stethoscope: "\f0f1"; $fa-var-sticky-note: "\f249"; $fa-var-sticky-note-o: "\f24a"; $fa-var-stop: "\f04d"; $fa-var-street-view: "\f21d"; $fa-var-strikethrough: "\f0cc"; $fa-var-stumbleupon: "\f1a4"; $fa-var-stumbleupon-circle: "\f1a3"; $fa-var-subscript: "\f12c"; $fa-var-subway: "\f239"; $fa-var-suitcase: "\f0f2"; $fa-var-sun-o: "\f185"; $fa-var-superscript: "\f12b"; $fa-var-support: "\f1cd"; $fa-var-table: "\f0ce"; $fa-var-tablet: "\f10a"; $fa-var-tachometer: "\f0e4"; $fa-var-tag: "\f02b"; $fa-var-tags: "\f02c"; $fa-var-tasks: "\f0ae"; $fa-var-taxi: "\f1ba"; $fa-var-television: "\f26c"; $fa-var-tencent-weibo: "\f1d5"; $fa-var-terminal: "\f120"; $fa-var-text-height: "\f034"; $fa-var-text-width: "\f035"; $fa-var-th: "\f00a"; $fa-var-th-large: "\f009"; $fa-var-th-list: "\f00b"; $fa-var-thumb-tack: "\f08d"; $fa-var-thumbs-down: "\f165"; $fa-var-thumbs-o-down: "\f088"; $fa-var-thumbs-o-up: "\f087"; $fa-var-thumbs-up: "\f164"; $fa-var-ticket: "\f145"; $fa-var-times: "\f00d"; $fa-var-times-circle: "\f057"; $fa-var-times-circle-o: "\f05c"; $fa-var-tint: "\f043"; $fa-var-toggle-down: "\f150"; $fa-var-toggle-left: "\f191"; $fa-var-toggle-off: "\f204"; $fa-var-toggle-on: "\f205"; $fa-var-toggle-right: "\f152"; $fa-var-toggle-up: "\f151"; $fa-var-trademark: "\f25c"; $fa-var-train: "\f238"; $fa-var-transgender: "\f224"; $fa-var-transgender-alt: "\f225"; $fa-var-trash: "\f1f8"; $fa-var-trash-o: "\f014"; $fa-var-tree: "\f1bb"; $fa-var-trello: "\f181"; $fa-var-tripadvisor: "\f262"; $fa-var-trophy: "\f091"; $fa-var-truck: "\f0d1"; $fa-var-try: "\f195"; $fa-var-tty: "\f1e4"; $fa-var-tumblr: "\f173"; $fa-var-tumblr-square: "\f174"; $fa-var-turkish-lira: "\f195"; $fa-var-tv: "\f26c"; $fa-var-twitch: "\f1e8"; $fa-var-twitter: "\f099"; $fa-var-twitter-square: "\f081"; $fa-var-umbrella: "\f0e9"; $fa-var-underline: "\f0cd"; $fa-var-undo: "\f0e2"; $fa-var-university: "\f19c"; $fa-var-unlink: "\f127"; $fa-var-unlock: "\f09c"; $fa-var-unlock-alt: "\f13e"; $fa-var-unsorted: "\f0dc"; $fa-var-upload: "\f093"; $fa-var-usd: "\f155"; $fa-var-user: "\f007"; $fa-var-user-md: "\f0f0"; $fa-var-user-plus: "\f234"; $fa-var-user-secret: "\f21b"; $fa-var-user-times: "\f235"; $fa-var-users: "\f0c0"; $fa-var-venus: "\f221"; $fa-var-venus-double: "\f226"; $fa-var-venus-mars: "\f228"; $fa-var-viacoin: "\f237"; $fa-var-video-camera: "\f03d"; $fa-var-vimeo: "\f27d"; $fa-var-vimeo-square: "\f194"; $fa-var-vine: "\f1ca"; $fa-var-vk: "\f189"; $fa-var-volume-down: "\f027"; $fa-var-volume-off: "\f026"; $fa-var-volume-up: "\f028"; $fa-var-warning: "\f071"; $fa-var-wechat: "\f1d7"; $fa-var-weibo: "\f18a"; $fa-var-weixin: "\f1d7"; $fa-var-whatsapp: "\f232"; $fa-var-wheelchair: "\f193"; $fa-var-wifi: "\f1eb"; $fa-var-wikipedia-w: "\f266"; $fa-var-windows: "\f17a"; $fa-var-won: "\f159"; $fa-var-wordpress: "\f19a"; $fa-var-wrench: "\f0ad"; $fa-var-xing: "\f168"; $fa-var-xing-square: "\f169"; $fa-var-y-combinator: "\f23b"; $fa-var-y-combinator-square: "\f1d4"; $fa-var-yahoo: "\f19e"; $fa-var-yc: "\f23b"; $fa-var-yc-square: "\f1d4"; $fa-var-yelp: "\f1e9"; $fa-var-yen: "\f157"; $fa-var-youtube: "\f167"; $fa-var-youtube-play: "\f16a"; $fa-var-youtube-square: "\f166"; PK!Pd$9abilian/web/resources/font-awesome/scss/font-awesome.scss/*! * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ @import "variables"; @import "mixins"; @import "path"; @import "core"; @import "larger"; @import "fixed-width"; @import "list"; @import "bordered-pulled"; @import "animated"; @import "rotated-flipped"; @import "stacked"; @import "icons"; PK!\p1abilian/web/resources/highlightjs/default.min.css.hljs{display:block;overflow-x:auto;padding:.5em;background:#f0f0f0}.hljs,.hljs-subst,.hljs-tag .hljs-title,.lisp .hljs-title,.clojure .hljs-built_in,.nginx .hljs-title{color:black}.hljs-string,.hljs-title,.hljs-constant,.hljs-parent,.hljs-tag .hljs-value,.hljs-rules .hljs-value,.hljs-preprocessor,.hljs-pragma,.haml .hljs-symbol,.ruby .hljs-symbol,.ruby .hljs-symbol .hljs-string,.hljs-template_tag,.django .hljs-variable,.smalltalk .hljs-class,.hljs-addition,.hljs-flow,.hljs-stream,.bash .hljs-variable,.apache .hljs-tag,.apache .hljs-cbracket,.tex .hljs-command,.tex .hljs-special,.erlang_repl .hljs-function_or_atom,.asciidoc .hljs-header,.markdown .hljs-header,.coffeescript .hljs-attribute{color:#800}.smartquote,.hljs-comment,.hljs-annotation,.hljs-template_comment,.diff .hljs-header,.hljs-chunk,.asciidoc .hljs-blockquote,.markdown .hljs-blockquote{color:#888}.hljs-number,.hljs-date,.hljs-regexp,.hljs-literal,.hljs-hexcolor,.smalltalk .hljs-symbol,.smalltalk .hljs-char,.go .hljs-constant,.hljs-change,.lasso .hljs-variable,.makefile .hljs-variable,.asciidoc .hljs-bullet,.markdown .hljs-bullet,.asciidoc .hljs-link_url,.markdown .hljs-link_url{color:#080}.hljs-label,.hljs-javadoc,.ruby .hljs-string,.hljs-decorator,.hljs-filter .hljs-argument,.hljs-localvars,.hljs-array,.hljs-attr_selector,.hljs-important,.hljs-pseudo,.hljs-pi,.haml .hljs-bullet,.hljs-doctype,.hljs-deletion,.hljs-envvar,.hljs-shebang,.apache .hljs-sqbracket,.nginx .hljs-built_in,.tex .hljs-formula,.erlang_repl .hljs-reserved,.hljs-prompt,.asciidoc .hljs-link_label,.markdown .hljs-link_label,.vhdl .hljs-attribute,.clojure .hljs-attribute,.asciidoc .hljs-attribute,.lasso .hljs-attribute,.coffeescript .hljs-property,.hljs-phony{color:#88f}.hljs-keyword,.hljs-id,.hljs-title,.hljs-built_in,.css .hljs-tag,.hljs-javadoctag,.hljs-phpdoc,.hljs-yardoctag,.smalltalk .hljs-class,.hljs-winutils,.bash .hljs-variable,.apache .hljs-tag,.go .hljs-typename,.tex .hljs-command,.asciidoc .hljs-strong,.markdown .hljs-strong,.hljs-request,.hljs-status{font-weight:bold}.asciidoc .hljs-emphasis,.markdown .hljs-emphasis{font-style:italic}.nginx .hljs-built_in{font-weight:normal}.coffeescript .javascript,.javascript .xml,.lasso .markup,.tex .hljs-formula,.xml .javascript,.xml .vbscript,.xml .css,.xml .hljs-cdata{opacity:.5}PK!"qq2abilian/web/resources/highlightjs/highlight.min.jsvar hljs=new function(){function j(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function h(w,x){var v=w&&w.exec(x);return v&&v.index==0}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^lang(uage)?-/,"")});return v.filter(function(x){return i(x)||x=="no-highlight"})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(t(A)=="br"){z+=1}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=j(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+j(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};var E=function(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})};if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b="\\b("+D.bK.split(" ").join("|")+")\\b"}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?("+F.b+")\\.?":F.b}).concat([D.tE,D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}};D.continuation={}}x(y)}function c(S,L,J,R){function v(U,V){for(var T=0;T";U+=Z+'">';return U+X+Y}function N(){if(!I.k){return j(C)}var T="";var W=0;I.lR.lastIndex=0;var U=I.lR.exec(C);while(U){T+=j(C.substr(W,U.index-W));var V=E(I,U);if(V){H+=V[1];T+=w(V[0],j(U[0]))}else{T+=j(U[0])}W=I.lR.lastIndex;U=I.lR.exec(C)}return T+j(C.substr(W))}function F(){if(I.sL&&!f[I.sL]){return j(C)}var T=I.sL?c(I.sL,C,true,I.continuation.top):e(C);if(I.r>0){H+=T.r}if(I.subLanguageMode=="continuous"){I.continuation.top=T.top}return w(T.language,T.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(V,U){var T=V.cN?w(V.cN,"",true):"";if(V.rB){D+=T;C=""}else{if(V.eB){D+=j(U)+T;C=""}else{D+=T;C=U}}I=Object.create(V,{parent:{value:I}})}function G(T,X){C+=T;if(X===undefined){D+=Q();return 0}var V=v(X,I);if(V){D+=Q();P(V,X);return V.rB?0:X.length}var W=z(I,X);if(W){var U=I;if(!(U.rE||U.eE)){C+=X}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=W.parent);if(U.eE){D+=j(X)}C="";if(W.starts){P(W.starts,"")}return U.rE?0:X.length}if(A(X,I)){throw new Error('Illegal lexeme "'+X+'" for mode "'+(I.cN||"")+'"')}C+=X;return X.length||1}var M=i(S);if(!M){throw new Error('Unknown language: "'+S+'"')}m(M);var I=R||M;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D+=w(K.cN,D,true)}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:S,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:j(L)}}else{throw O}}}function e(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:j(y)};var w=v;x.forEach(function(z){if(!i(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function g(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"
    ")}return v}function p(z){var y=b.useBR?z.innerHTML.replace(/\n/g,"").replace(/
    |
    ]*>/g,"\n").replace(/<[^>]*>/g,""):z.textContent;var A=r(z);if(A=="no-highlight"){return}var v=A?c(A,y,true):e(y);var w=u(z);if(w.length){var x=document.createElementNS("http://www.w3.org/1999/xhtml","pre");x.innerHTML=v.value;v.value=q(w,u(x),y)}v.value=g(v.value);z.innerHTML=v.value;z.className+=" hljs "+(!A&&v.language||"");z.result={language:v.language,re:v.r};if(v.second_best){z.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function d(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function k(){return Object.keys(f)}function i(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=e;this.fixMarkup=g;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=d;this.listLanguages=k;this.getLanguage=i;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/};this.CLCM={cN:"comment",b:"//",e:"$",c:[this.PWM]};this.CBCM={cN:"comment",b:"/\\*",e:"\\*/",c:[this.PWM]};this.HCM={cN:"comment",b:"#",e:"$",c:[this.PWM]};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.CSSNM={cN:"number",b:this.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0};this.RM={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:"/\\S(\\\\.|[^\\n])*?/[gim]*(?=\\s|\\W|$)"}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{aliases:["coffee","cson","iced"],k:b,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\(",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{aliases:["nginxconf"],c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[{cN:"title",b:c.UIR,starts:a}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("json",function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}});hljs.registerLanguage("http",function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}});hljs.registerLanguage("javascript",function(a){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document"},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBCM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBCM,a.RM,{b:/;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:true,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBCM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("sql",function(a){var b={cN:"comment",b:"--",e:"$"};return{cI:true,i:/[<>]/,c:[{cN:"operator",bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate savepoint release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup",e:/;/,eW:true,k:{keyword:"abs absolute acos action add adddate addtime aes_decrypt aes_encrypt after aggregate all allocate alter analyze and any are as asc ascii asin assertion at atan atan2 atn2 authorization authors avg backup before begin benchmark between bin binlog bit_and bit_count bit_length bit_or bit_xor both by cache call cascade cascaded case cast catalog ceil ceiling chain change changed char_length character_length charindex charset check checksum checksum_agg choose close coalesce coercibility collate collation collationproperty column columns columns_updated commit compress concat concat_ws concurrent connect connection connection_id consistent constraint constraints continue contributors conv convert convert_tz corresponding cos cot count count_big crc32 create cross cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime data database databases datalength date_add date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts datetimeoffsetfromparts day dayname dayofmonth dayofweek dayofyear deallocate declare decode default deferrable deferred degrees delayed delete des_decrypt des_encrypt des_key_file desc describe descriptor diagnostics difference disconnect distinct distinctrow div do domain double drop dumpfile each else elt enclosed encode encrypt end end-exec engine engines eomonth errors escape escaped event eventdata events except exception exec execute exists exp explain export_set extended external extract fast fetch field fields find_in_set first first_value floor flush for force foreign format found found_rows from from_base64 from_days from_unixtime full function get get_format get_lock getdate getutcdate global go goto grant grants greatest group group_concat grouping grouping_id gtid_subset gtid_subtract handler having help hex high_priority hosts hour ident_current ident_incr ident_seed identified identity if ifnull ignore iif ilike immediate in index indicator inet6_aton inet6_ntoa inet_aton inet_ntoa infile initially inner innodb input insert install instr intersect into is is_free_lock is_ipv4 is_ipv4_compat is_ipv4_mapped is_not is_not_null is_used_lock isdate isnull isolation join key kill language last last_day last_insert_id last_value lcase lead leading least leaves left len lenght level like limit lines ln load load_file local localtime localtimestamp locate lock log log10 log2 logfile logs low_priority lower lpad ltrim make_set makedate maketime master master_pos_wait match matched max md5 medium merge microsecond mid min minute mod mode module month monthname mutex name_const names national natural nchar next no no_write_to_binlog not now nullif nvarchar oct octet_length of old_password on only open optimize option optionally or ord order outer outfile output pad parse partial partition password patindex percent_rank percentile_cont percentile_disc period_add period_diff pi plugin position pow power pragma precision prepare preserve primary prior privileges procedure procedure_analyze processlist profile profiles public publishingservername purge quarter query quick quote quotename radians rand read references regexp relative relaylog release release_lock rename repair repeat replace replicate reset restore restrict return returns reverse revoke right rlike rollback rollup round row row_count rows rpad rtrim savepoint schema scroll sec_to_time second section select serializable server session session_user set sha sha1 sha2 share show sign sin size slave sleep smalldatetimefromparts snapshot some soname soundex sounds_like space sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sql_variant_property sqlstate sqrt square start starting status std stddev stddev_pop stddev_samp stdev stdevp stop str str_to_date straight_join strcmp string stuff subdate substr substring subtime subtring_index sum switchoffset sysdate sysdatetime sysdatetimeoffset system_user sysutcdatetime table tables tablespace tan temporary terminated tertiary_weights then time time_format time_to_sec timediff timefromparts timestamp timestampadd timestampdiff timezone_hour timezone_minute to to_base64 to_days to_seconds todatetimeoffset trailing transaction translation trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse ucase uncompress uncompressed_length unhex unicode uninstall union unique unix_timestamp unknown unlock update upgrade upped upper usage use user user_resources using utc_date utc_time utc_timestamp uuid uuid_short validate_password_strength value values var var_pop var_samp variables variance varp version view warnings week weekday weekofyear weight_string when whenever where with work write xml xor year yearweek zon",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int integer interval number numeric real serial smallint varchar varying int8 serial8 text"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM,a.CBCM,b]},a.CBCM,b]}});hljs.registerLanguage("php",function(b){var e={cN:"variable",b:"(\\$|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var a={cN:"preprocessor",b:/<\?(php)?|\?>/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{aliases:["php3","php4","php5","php6"],cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,eE:true,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBCM,c,d]}]},{cN:"class",bK:"class interface",e:"{",eE:true,i:/[:\(\$"]/,c:[{bK:"extends implements",r:10},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{aliases:["mk","mak"],c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b]}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,c:[a.QSM,b]}]}});hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c","h","c++","h++"],k:b,i:""]',k:"include",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,c:["self"]},{b:a.IR+"::"}]}});hljs.registerLanguage("perl",function(c){var d="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var f={cN:"subst",b:"[$@]\\{",e:"\\}",k:d};var g={b:"->{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{aliases:["pl"],k:d,c:b}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("apache",function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:true,c:[a.HCM,{cN:"tag",b:""},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("java",function(b){var a="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws";return{aliases:["jsp"],k:a,i:/<\//,c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}],r:10},b.CLCM,b.CBCM,b.ASM,b.QSM,{bK:"protected public private",e:/[{;=]/,k:a,c:[{cN:"class",bK:"class interface",eW:true,eE:true,i:/[:"\[\]]/,c:[{bK:"extends implements",r:10},b.UTM]},{b:b.UIR+"\\s*\\(",rB:true,c:[b.UTM]}]},b.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xsl","plist"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"title",b:"[^ /><]+",r:0},b]}]}});hljs.registerLanguage("markdown",function(a){return{aliases:["md","mkdown","mkd"],c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].+?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true}],r:10},{b:"^\\[.+\\]:",e:"$",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]",eB:true,eE:true},{cN:"link_url",b:"\\s",e:"$"}]}]}});hljs.registerLanguage("cs",function(b){var a="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await ascending descending from get group into join let orderby partial select set value var where yield";return{aliases:["csharp"],k:a,i:/::/,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",v:[{b:"///",r:0},{b:""},{b:""}]}]},b.CLCM,b.CBCM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},b.ASM,b.QSM,b.CNM,{bK:"protected public private internal",e:/[{;=]/,k:a,c:[{bK:"class namespace interface",starts:{c:[b.TM]}},{b:b.IR+"\\s*\\(",rB:true,c:[b.TM]}]}]}});hljs.registerLanguage("ruby",function(f){var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var i="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var b={cN:"yardoctag",b:"@[A-Za-z]+"};var c={cN:"value",b:"#<",e:">"};var k={cN:"comment",v:[{b:"#",e:"$",c:[b]},{b:"^\\=begin",e:"^\\=end",c:[b],r:10},{b:"^__END__",e:"\\n$"}]};var d={cN:"subst",b:"#\\{",e:"}",k:i};var e={cN:"string",c:[f.BE,d],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">"},{b:"%[qw]?/",e:"/"},{b:"%[qw]?%",e:"%"},{b:"%[qw]?-",e:"-"},{b:"%[qw]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var a={cN:"params",b:"\\(",e:"\\)",k:i};var h=[e,c,k,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[f.inherit(f.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+f.IR+"::)?"+f.IR}]},k]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[f.inherit(f.TM,{b:j}),a,k]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:[e,{b:j}],r:0},{cN:"symbol",b:f.UIR+"(\\!|\\?)?:",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+f.RSR+")\\s*",c:[c,k,{cN:"regexp",c:[f.BE,d],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];d.c=h;a.c=h;var g=[{r:1,cN:"output",b:"^\\s*=> ",e:"$",rB:true,c:[{cN:"status",b:"^\\s*=>"},{b:" ",e:"$",c:h}]},{r:1,cN:"input",b:"^[^ ][^=>]*>+ ",e:"$",rB:true,c:[{cN:"prompt",b:"^[^ ][^=>]*>+"},{b:" ",e:"$",c:h}]}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:i,c:g.concat(h)}});hljs.registerLanguage("diff",function(a){return{aliases:["patch"],c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("objectivec",function(a){var d={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView NSView NSViewController NSWindow NSWindowController NSSet NSUUID NSIndexSet UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection UIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b="@interface @class @protocol @implementation";return{aliases:["m","mm","objc","obj-c"],k:d,l:c,i:""}]}]},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",eE:true,k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("css",function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",rB:true,eE:true,e:"\\("};return{cI:true,i:"[=/|']",c:[a.CBCM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.CSSNM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBCM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.CSSNM,a.QSM,a.ASM,a.CBCM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{aliases:["py","gyp"],k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}});PK!# # %abilian/web/resources/img/abilian.pngPNG  IHDRaj.hsRGB pHYs.#.#x?v)iTXtXML:com.adobe.xmp 2 0 300 1 300 1500 1 353 2018-10-10T18:10:51 Pixelmator 3.7.4 9@IDATxEǟݷ\ڕBI5Hr %RB *?&\@DTO,FB]4)IR}ݙ3{9 !彻[>ޝy;g(#lW!H!LR|:{d'ߤ1cqZ|          MT%и&B 5Zk%HҺbq"!n,OKD{~@g~_²#KS{&LZI`gJk#<@KʣYL?Uk} {P<.e'v:ڻ`u,݈H&_ jo8@a^ԴXuOaA|');zLow6⻹9RoU*u71tA:!hEkqڎz·ftx'&o#ڙz9L5&dcdGZ2{73^F|O>nW.͢q^fn @@@@@@@@@A{ iFƖK)b_٥}d={wޡtdՖ=-A@@@@@@@@H{f5E+h_YȎRlxfpPYj_ѣw          ܃ؖ ƭXS:u``=ܵνtR`+A@@@@@@@@@`GDWh˪b`n6sM֧yk`Qzf`Uւ ;(#6{̝89ݏl4n{;g&XDV`K%֚>KRJ#R6i)s("GH/y^Иק]|B|?KVIs}ݝ&{4Flt;vûw@@kI˞-]E$eb;_mnVIpg5ޛ:g^Ȳ\{a#] 8~=%WAsC!wBplwR, ߫m[Z) E-Y&=ш'Uީ$#ƛ׷.xI&6 +vT!:bԛ]+:>=eC%F%;fo}0k>2\KBNQ/Z!#q{ߡ{|Yz3lUe*f#󦪤eo;ҖY̊w}QKKo+f $GɄnpeKRIҎ,KW.۫@         [w ~e"/ t?AK;>SY" mٗ뢢h<[3^YoWe8         A&2Al=/Hj)YCIlbnWԕT] sa֒u,6o놧as Ѥ:bī5 ݿms&odN۽4a9&ˍ>DZ KպU+9r7s@2E\咈DO1IkqKA@@@@@@@@ T 9Uqw"р֠ f9[#ޅÕ4 Mz{jkh^@_ϗ)(@@@@@@@@DZ+o^JM,fL&D{ˈd/hxW!ddeY}uDZ/dcˇ1        %P Jmw:ϔJ]A69l麒ҖO2h` !}aY}?3eQh1@◔L梢@ӄ4aow'Hm=I-$~OǴIqtt&}?-[̃-         + gBQ*y YR&H.P3R -llM母ӣ} Xt"ϴTJ        Y#~2k2Eֵӽg`,21M\Tj\NTebE/y5r8~_X8oD4:j_̈́]  'o2^y J)#̹mMI@ 0R0!RC~t_ U9$Ex"V 0좡}.`5(o\ū\i4Q@@p6_ԸBH1[DcLؕ>98dI2Ld<<=,Ea 4Hwwk+G  *& QRm+g0IN`Tgށ,Xq7G.|$6-l]u[w2$+;~o# I[fQ6~UxBJ~ԕ~5k&'OΨ @h*L5*Ԏl֋-rS1^q[8I<~OiS[t*aCRGK',ɂkb|[[]Vc>䃀ДЊ7E0TbEY\ bh,1}geg港r_xxY^*{!_[97Muy-ggT|yx3ʸcVAdusx%A'v;񾤭O-.4P@@ '='s\To>\u]0G{;*yzP{_c0M"-#ҢU_ Ѱ@@@Mry,`.1ZFd'#]9$7YfŕK*g|+ -@IuWD2H3O#S^R\Q? ȋՎ3?m?:|ݍJ!ƻZP?x|K!4祾+8plpZ7Aqn `)@>}ϒ۵yvhDQ*ڳ;~W]Yr|;#Ч=U͸sn~zVnɠe9$Pwkg9t@huoX({F'ڡ4WVz[ֱΥ9+8xW"=0^i MtԾU6\V@ @@@@ XV]pOja} ߔ)s{ &_Og٩>> ;|AtSiVψ; @w@p]sfyRqi & C$htfM[ Z}޷䥻/D'N#+Ջ%- Ɓ@vEd՞5R {OE(#+f~Ίǹi?`˦+}.a=@pSkdwLţJ;ljdI**bϓYgbK&jiνi,cn`}1?I#^LA^cgλdkZ}9ㅰvtEIuTLgWp.Y;yݾDL=CxL΂oۢx/-{aNiG^Lަ9*6ktX]̊V20peǯ}UĢ{̈́qY!]EB B?]~VYLA@BMwQU iqڈ&TL./$˫s"՟JjۃcGq/n(w<=~L7Q"y=Aj-g7zwͅ    PX$ dJ&}I@;$P!tdi?~@:;9xI;ױ>U^ lS./3qW3&83t a]8dÈib2^FjG|RY SֲsQt@(*3v?{h7qxtrbAq͌Oє͂yǙxMXz4Mn\?N"MӴME?J*$^y$:9|Im"bSe馫Q7E"Fa.T w-֒'2-N@Jp/5AZ}%w6٬UKbm(?1%BײqerɪwASUT)erRυ"%*aϦeLŃNS[k՞Ak@H $-.#,`s1jw=9Eeҝv3nJ;g"EC3|gMhnllΒÆS-_dPIxJdiQ>b c@@@@ o̞"ot;_ x#B"OJOi!uR@2@ /L#-y ǜ}-3*@#1#Ddg(N$wk똊t{y2Z|n ;$/&i)>&NǞA@@@ x+^ qKa2Q.p\Li=T;p-  ]#HfZG|9jZm@N8eN/㭪طU씉Nc+n8 EΘ} -n#0@@@rNw42ޱbk^2R!P)Oc:C  #8=b?@r%p; F,$1OZ͞ʡ(\2kVd$2ZrΡҖ-B6liYWeX   %%fpn ji㷓s7wR>מ߅ D?t|S  &(f9,U樻kI28b.i 6?*_t719rNdqs3]U@'OP,{I.m}@JݡUjupnr, Km(ީujWcxt  >$AO4uA?2 ԂM898y"k3Y2߲/Wۥ@@@BByNj߼=Jy+f75V}i?uoikå  N{ɘH~ݧrLwOtO".^[6FϐaqWF̢dr.Ecs9;9Tnvp@ ]zz-4VPa{^[rn[ᣂi[7pi!e~6*i~՚v%@@v@w{YZIxz0~uA#ݥ:\6;{ll" 6KtbcSnyMTAO7۴H   !$~Mىi oN&{"&[ׯqi1J=$`B(r's6H5O~JT݆9KzX%\  +f;#Vˏ*[X3zT)˯ׄbΝ5~Zx!<]kCq@@@K`u49]xfpNڙsԺ7-Tȧp51ԓsB;͖lSseBkg .j   +ykNdl7rVG6sr~/GVܨΥ( p0kv9WD/ԝy9>΀KnY4hHvvByfwfuS;xÁL`/ +~P HQ,h{~ֺ֕:znF) WcJxς@@ijiu4! D;{ﯾiw^=0x|: :I՛uʚJkɐ NhK A@@@ ֯uM'rI9嫦!#[tmgy;֯i o[y#l6EI`Zn(]u{Q?Ef>j3Ksg Ƌd@^Qu4yOH ʙn W3]5yDI ӿ6h)MbѩRr/}mޔWNQzc2_CxZ-|nC(PV^U_oeV*5T$C}Y<n{h;p+v׆e76Xjk?-}(2Tk8S(Mk!˱O;xaòO? dO(>-YlgpvoO!d6bz"["L,z0T*dl  rv}|1R9,&rC? zG6Ro z)6e/KxL!5)C-Bv˞~:G[v enm\JhR# j˺1ydvX2RtL۲7\yyRE"Ѿ(ԞXZc;HC[/X(@@@@@@@@ 2,7H_#=1&|/H]\ÊV]|Rɗ(ɳ1Y,sFΑ-3XJF⹧Rz u;q\TNdTp/$ eډd3Zͻŷn _|iFW 亭eҝx.bO;YD{b9E,6$)6Y)>5 %ӾUXC6 B*{!d(ɡrZ;yZ볳_ |nmr?^2$|ZPhjo?ERf|Op8@@@@@@@@@ {z9>GKٛ7͞ !_eI|A7U;*8wS,oSW~7QNSg&[d._qG xfj\@@@@@@@@@`z*fCHq!dܿGP ,zH,mLu]+Mc3]0quJ&Mm9 9%Y72z$L;c5|ENz!dD !I!&WO&'f>5fxK q -}rWM_o_y        P-P2d]Ǯ 텐zBf\v1W#W %} _JŋJ'+ܸOr}|5%SdI'lOۂ{J9nv.TBnżǶI%SWpȣ)9Z4ٟU*\'ϝckLe @@@@@@@@G[{CkBF02 ;~霗9gJ^Bϝw'fq-g7ÌY]rɭTB{9ܬol@@@@@@@@O[Lfٷ0%HXh {Nn]1ߺ!Ţ M;ڴ3U !^֯wh~_L7Q39qє:!3. kbLBQBF7+9+ GQZMauYDJZFGʮ]nm]~5+m:w$ D>({krRc7,:DHV4r/%i{V a{;e?wxn9j?-w"lރIk[jnIB^UU 2_P2&Vm9J'jٔLܒM; Ąs2.V8 E8LzdJΞb#DrzjTŪۍ @@@@@@@@@$h5=bx89UTCHb_,Q~[+(I#$2\&3<ù9GL]dA)ǝ^@Gv         . WOa0v"!dreOB$ &ϴBב o\p(M%G8&v?#/q:嗍҉Jd4IcsRJ|VMǸX{-ߒjOM8I=E%7IQ(mck1_6|_$h"Zz@To\rpQ -k7 mUm[8/eOP:^h}VbjqܺN!VլcJIFRԽbBWR3=Tpc USӅ2(gC>ۑL_7?쎫x0՛0 i-5g";]}IїIr5ܒ/јCzH!.{~;a-%mK>^-o!ұgb!AlcsuogZdAϋ׶O++WK/(IYyR44+DDKy--[F/+󟬼̀,oepMťZeVB}(-x爘z2%ߥQzх_-X UuR^ZEJ$yݛ{?0yHc!\EmݢD[>.@ ~it 7i@@@w<:戍%N̎{0bcD)=z rvLtwuX_Zֻs7.(o.ǢNTt ,d_-A]yJkZZHF:ۍmX%tdGeOt/_:YPmuVb Meu),Mya:]Na^gOYAUS4SJw[!Lw Uu{'\SBO -I~ 9R^1?Oa-"#_Yg_pNZUX&N[\F+*n{S RoMS0XG[yru_n;UB֦Y;?hc{rOW}y֏n E%`f+OY޽_D;_'=Hkxe[nI~-kwR@ pk;/=`|?1$9۞`Ӈ >>Z~Bj҇{ߵӽv{iB*{a'/&]kbW`Z+ڕϫ(ޫ-Re IXΧ,W~F Ugq6x`ksΌ(vZsn(h?a)-ǖomXvSZ!QZKx/J$mW7AEy^uKt:iqސ͗U~sr]ۺh`gaj-}D?xf:?\C {iaR-4_vF=5/ÃͪGs]녒֟xѼ$)eVǼˣXp|?AEds! @1I!ww|VQj(㷝xBK;`sߙ,壗Ov2g~K{I+^I'S˹T@1M|T܃r;̳oC29apa1o?ZU=ͭIg$ON[ Za}W0oXֶA|@-x"ȼbZ'f;t\ݑ&(֮\LV+Fbmy"ouiQzkX4.qJro^3*.;=~#;^z傺nX;OkW]t\2$ /%ۓg,[dƣu9po! !0p#bqhLUa4Wno_)ʼ|LF~83ϯqM3,{?zUօR5qh[_Yjx5|p TQ*ĭ\ﻎ(O+o";ZˤO6%=mCBCÔn<`NϻQ#;3?,|>rc2A,i8F5"syǶu!;_/Rv妖iVz?})wH'KZcIZx< {X&oJ;ֳϟ-y;9+/>2!߱[6_U\l@0nrhs=Ƀ u; dcl#^'[H# pȯ(=5<^{K\'Vwֳ~]zw^S}zm,H^Q]~|yêCpDd}+v7}?Wn7 aBr8<\!Z(r"?篇J^y5/V=G7;7YZ K4~ް=3'E{NGEd ;= $7)p)tX4kwrwa0rXY=m\^xM:^|#T`Dʙ5SZ|Ձh|_.jaI/L2I:^t8dS+@ Ac'O8JhU68Zo,{["Dtl늫cpEzFN;в3rOudOߎ1??~╨i~"H(B32bђ_=#!@wY_{Cpvƻ~NA⢐xy?$:QW̸Ã݃ذ=_2-M1}0,`3nu66O<WXպ^* YQ垓Fv;> uvyYw{>`Ro4fާҏYd^̟ m,_\}O;bgxsyR/>;o,!<|iU3J޺w~!΀@3JiXi<;8Uʛ+ ~{i/O`R\1罥+HiA@"ž(6EC2&Mѹ'oR^do™n72Qos,[3SN1Əb,Uey4UQML'clLkZfJl/iw^R|'x%FA;'чw ?7r1zx|c(e)LV]K+VM(@dqE^B|"A]9)x*,jLf i~R;vtؖabBVzۋüaQ&_  ~'з~|=qeqov, :fP7Id_cW#s;gv跴&獟ªZ=RR9qͯLؒ}GLױ߽cy<ᅏ~a*cҞRf\Ӷr\"- 0 7u?. ?$޾@~10lv*J<VR}g[UT#sv(vLV׌((ǹ#^eؒ#mwϲd)qUSy׮Fݣ؞ryY58ʯ[2bVFt _S=rGEc9L2u[(C U7z >oM'ٻ &22E 5 6/M1 rMd̉"[9\6ZF3&>c.GY%` 8j?IzƛCyO^W}&DOOs  !g#7Qd!G_Yl$!F.ΚNtieMKbϪGr{DŽ<β#OJsP'޺V'rƫ]-O/<1/QR3<]DN R-R?Dd3 {^^@Z RV&#f gyf健\v[A,\O']\zSqb.˽u(uylkN' %U3Ǟ-Ch #|qv#:/N²&e?UZ9L@@El+g\kI/1r}[rp7eJZ׳G%#GTSK WKAҸI2Ds9Vg(紲nr\k?c.Nd0خZB,[>VmKz',D­ڻ^G֠ě5m| -NIB,[DI@ ]Uxث]G9^REnXwqxb<{Yisv}R6.9Tn#{L֚>#<Ьg>8OB(osdt]V#}؁%U3n;jf@^WLvRcPy'ʋV֍UYS;N[7~' okEd}|G?Lfu`ث݄e]F&a R\U-#C´ wfحm2Xub}3^2 ^Uu{:zxjCXڄ-=wO:gjy@@:vL//xi;]gGUθO=nSdU߱͞^tBc'rn}ڻ݅5k}Q)ٯX'}5-M.vgsa `={;]FT_*eQᜌ@@!Я|J亙s.; m*3d5CJ\]oòZ2׿{ *~1;d'{xBwKp77S(UyouO78}k!MLl~_Jn/`}ޭ^O(5m).dy;fݫX<ڪ)2S)-CwU *}ewO;=Z4"Wh)vґ'؋ocAxex&7@P(*f{8Xs0LR,؎/FS|1C"CL0!D<{OXɅf:ƛr,p8I{Dž_2щ#{ԇřyU9tn ƤKnY۶|޷jvghgQu~_ÝkOwKO2r%KNGS2QѺ|Եnk^r3)/UMnYY^qI\ݧS_M #Ҷ,aI5'z=즑+{7_Kb_!}}/ 尔ǻ$t؎^ɧl^& \{ Y%P\Q`0>!y ;}}v.PyCȄL^~%3gAcӫ;NlOM6po{-KKY;hd*|{לW PtoӐ/6?wSϻ!1zX7RvFDؑkIٿ"'ro +2 5SŃS9g2%)0Uubm_I?j))0aa!<3^8 KB[kqnv28U%#O]2-X;@@ 8^{=\7l "b[N1i]VA~ gzW cķqď oUAϲ9#`Dw.LWLWmͳ3ٺ!|j]6ec.zbbOqӽ/LV`cRSYPwV=L)lUO^RsF'fTl7My ^tɺt?&!wb9%߽plnVځI>|Grwm8o:t@]Mouedb衒_?w&Рi#l+4yO^&{w!Jj_Iޫ<^NJ\šֆnUF/H}.jdz&NoJzC1_ @Ի~b= w xp#$us-5mڸd9 Atk+.{qQIUyhb(!#$$zȞ5 #`Ee Ve~8&2ӯȤ-ܻIs@}JʒWxR$a2vcQWovuɞFDBvti<^*-%!NWc.{gmihbZ y#J=a>lm<>҂tQ`=3R>0`~  y Gy}d]Z_UFtiCtt/f? >=YTR1}rl %UuHdv#O niVmfS"Dol!H|D9݊^+FduŊaafe@oۓAG ,'eB֨^V Lq,*kd |7߲t 6G ~{3Rr ?8~Sʔȳ#fDweƎ[9LT{(6Қxo0=x;R8ձ#6 )̰ᗷV8sg.xk`n Y}K?ATF#IO<q9`A tq;$i/f %`d [r LCX32&)/oXt.{א8BFZd.vHO+=M^\V2'QƱ*Mp&K!_M"s6P,?z ]>3Zm_BP>Ӽ qGg;{O,{-&x?N0~Cm8YPF-A ̽Ă; e2O9N),y2ƛAnnڮY2s_`-Fo2%9RZBb&#{Ri+[7L8UvެGW" o8yw\ Vv4k(`%X8(&KlFTKl)h "\}3ϼݖ7}'9}yS}Oq--,,\:mj&؃mh7h(lV?mQf" +XѱdnfƅjGP8^?9/.uR%G [>Ge>2!@4@[˻6Tn#7eO#H({ K=3xf ̅\32)g@4QXCF:="1l M?3 ͗#`z4UC"=,y?~7?CxgQ' &7 Q`oN\7/mMS,=!f7үG@d1#!$LCZ(mo8kAEHZE/gB ZJX,9(6nB9&e̚d{=Yk$BYL#a/ o9 E7@RT7@x 9&-*4s *[t#9ʺ"VH^BоLkWv/1fJ\8]Xk+1{%?`埢FMُI'փA8m AQ1TYR>qcUi(jk$ Z0rQ8!O=ŭ}S{ pƓ]]~\'uC{a qۊ׆MNAZB G}mB-HV+fOe%;R۟<b*c*܎uS!Q̸ G6l^UgEIյktB1As1iõQp/-1%.5Dx ]1[.dLi5B D {s`j@{RE݉LdB9N}ϝ4&*vYBq6rm$*m,^-}hиeі.22|8jf%5|ʝKu4- gJ~,tcHncbѓ6g9PZb3w *yƻ6 VS?ƆMG`pU6Q!B_3y.w8)!a^iqw /#c\wRIeuBKà1]wp8Nqn)tt_C t2kf6H TwTM C/^F> qSqgb <@΀H(fSBwrXsV윌MPp'<˱$u}DP*&}LFK={U=,mgKUKJBk*,M`j 1bD&-K5FN;B#- |jPC$PIihtS!bF@q.=91z4zƭ3O4!@P1!0=y2i:?TZ"5_t?B`70&ǗvlnK{hHI"x1Ȫe$IUp9+ߟ4GVgn9 _,>huڍYp* oK LxPfaZ'}26ڙS1B 6y+w CƎJ⯘1EUm vHVk6rV36mv)MΘImFR+ć}w!"^DVϵhW_%rwgwB0%ˬls]T!@.@ ?$% :t߄&?&JS6 )||b6"w`$ P\WwBe3WcYmKзϰ5,hP>)ThxjDaWftFi^]UKWD$9w鬹T p5gCRUBŐJ^>檎~&o -=t㜧:L)Eჱߴn4ؔuOQ^vIPT7ʸn)ѣРo0``M NS ҹ#0-KW.\.Wzགྷ!K[h_hI}|&Ǻ֊sz9FRPXG!i)( ]{?(y(+Ha AVgfۣ@>%<?(0ɫn"}"B<ώ}~~ك [zN"[Eq9 `k<[ō55U7Ec s\Gέ+ ~hp hK ^94;'yQ!LzH/.DF~ =s1հ }gs]BkIR+G%OR*tCu:V!cUpWcqQQXuLT1"Xxͱ- B?YnB.Y.|SqGOg%O[:ޝ%da]h>>wGJ_aD<?(ӜXHm$+;>~urw/}dDf3zAh DtUn p![{ !J\Ges,| S=kN~[STbF -aRtukk;{yq]@tU]n K W0׾PPݑXE;MWu=Z(#ӛE67^qsDO& V~Am2sҹ 7ji_gWUPġҒrOHLᠫqGO7XSSޔ9Rm(lXk4zo GK- ApQdi V)YlQ駾'^ / P;Ndb}Ckԛm#$b(PsGP_Hۊt&"$]Y9YȵaREu0*Eci}A+7~dRY 7myn &_n@Y+ϵߛwhc'O[a+bʳ#,fC?y f.T~a U4 $ YTL{ pήz_+OxtBҼq625]_Yg;HrKfl㗺<,[E+R Eu5-q݅CZ:",qOPՈFA> Uw 5Z ^' jv7@PnN2;R %m]dҦwke<’]rls=oZgۊ\&{j/~`jJ)K-jO^%e-G;z;.F´_=et胁9M@|׳T!@A 8NL.U ZMڕ=ɺ|ͼ58x%%[n1mۺyQ~z;­vRat5GIŮ%y'-6R=%m]Üo f;8އ$"z״輔m,hIlq‚c٘I`-\&y|{XI/63\k3~,-vW upTh;*l a^8V+ZUhA_ve؞{⤙3ppQv3[dׇ"mV/:餲cVoJ6,qoe,` ոWSZ:b˛ٱ>7/wAgsm"{=۷ D׼v/E&U~|l*[;VFM"m^<$ӟ9.M=`o:&cMg* ~[bBنM*,k-Ht 4xTVK cEE_ctk!@xP1!l~b2]|Q_LKKӯuU%ET# d\ozpW%~Ξh*xDlO7)yY䲒qFӡ^R^tQau.6VG)'+NtX݊1k,jsw6|і|Oҕ ܺj[mmj웙VʒR u(9kdS~WgNGXYCr,ף܍L D::ol,ލpIZ0.oOؐ>99 Qۨk!=JEe E[oˈT%C+Qa\R1РՖ0XPz :8cǔ\0,"L!ҥŻ uB 4pP`X Zjc N02",er\^g/Z ӭ"}_=;s#[ox\Ꜳu ?swS7}{JA};׿LFF\'6AksQ{&J-:!@'uTtXϾg(^畭+Zg>C-`?m*m'B>i' c֎w'jcԠV7Vhʚſȭ4L*3B02p5"a{]A*넏J~8n[=ß~OG+У/Ӕ 7c[!4ZOG]L7rZ0 FIez.̧[j9$.Ňԑz.rq(L]5ܴ n$@8۟jD{|IC+U ^]s9>|@IDAT汪A3\ϫã8YzJ"{H)CnKhUgjvm]zRE-1.lFG~t3jXب<P#fIڃنlw*~{n4%N0c]֡,,+)򽢨읢7rHMܝ~J nDuc=Bp*kg(ѭ??g=XL.16%}WN'CMojnͩX7';*Knqذ-_"ڵX-5\gNC~>Қ6`in(ߞ3"82f{CvlA-5v$l? qd#Rܺb> C= ٖ7t}%/zCL4n|*_pL&m8r[3=Uؼؙ=Hmh+.ow@nɹ 4hڅfnLj#LȐLt # <kLBYN̾%@i 2ԡ ՙL''uY霟`5o[Loںkwr%owdraWɡco 놭/Dےu?ӿWP#g zNVF~V^iBAvBfcKYGg䕱[74Xk{c#8aJR' O57Q@,Rii϶;ƥ"'s2 IyeN7@8+L(*L=ɠ*6q,`EQr=4d\?` ^D5]͘&uܲK<!^PQ=f#FL?uadjA[&H>/CQ\Tτo0P(6eGIw3ҷ[xסel\t ЄDB@[@qK%.҇(̭_w8 \Ay~ѓG !>:yƻ%BsĻjɸ3s7tԝ tK3؛q/Bk%kVz> D#D?` M7%ecG\GױqjcYnّ*ϖ/79uy;}:cyP<a{'-uw׶gax~̒a6D.޶vrpuک}{i$BgP"TYúk$s[Kѿ#P^R)3~~z\s(7qO#JK_L +.;Rk#s.2$Jkk1vo2#YA<:7"F8^7,Mr#1҄=YzȂ]6o.476Lt1J e%Ηd(e</;J&sO: w !@@`ذfQ}ZnYۙ(9>yDClC9Q&SRiᘴ e-Kd)mҒYA4s>k!bQbWs\ (kPHrZ;t^sQJĆbOg?wPS/z%64n?ÈfHo丒V&Di׮i êy[Сd|dr%a(aL,8P)6s&RO4ytzojSV3$S w#wNߴ`\߷\3ؓ..dew^ CUJ<^bhx5,}fWUbR/UB5|:\LVAv'Sò}x骅36To"fӋ\v7Q@Xh~_nD3qnlȣ*Yj&mCcalh$/ÀR xzy70<Ʊ'G8LF"af Wu,˺6T]3wgZCY9HdeCr}oK -g} K˷xrߔ 3_gGcBX+ӱGcyв)e%o$B 3 ڳ;1XfxIخCy!pctZ^aϪs> Lnlu`Ceg3x䟈͂KJ[ڲ71z_ <#ToB!_I.Ho$m@?apqP\3i5ِ7HJ7Ŗ;o70s\K>V`܂~,[b9ה,ǒԨ)19l.evC㕢gvd3  |AJg·ڹY&zja3.X^X;~5 /ycy%{ǿ&%V kJTztou\e*!@$ v$030Pl鶒+{ļXz)rC(6ʙNJY/ԍ@VļG !|وU kN-]Y_~D@ڛb9ރ@ #C|V2MBGK.M$|VGnR(&kCZ&? έAK*5r+WEݾv IZ |72/a*c_T, c$ w=OsŎO Nb/hLTKUĨ\N-K$ 5b0f Z'$c8-Im`vc)6šlj amrޖfnC:!ǥ$$GhcOUX)B Ѓ8\nV^]!L0 9 bB}N/f'||lݽ_E06 -}a3М₤[) 7Y ,5GIp qKa;6\p(?|‰05j%P=ES7ОF(/XĞ‹egOPO6/&%_=ny$4\=faQAbZR)hFrvޭiIoDSɖ/7hvh˔7wKqvh lHѦi E[FjR씲U nKm,!` j y2LtFAyM3|I`ܺZQ11}S@<*LZz/v'sҚbC8rf%^d/<-$Ӧ ܝCSa ?B 1SasG*O`N^QZF?؊? Ay&ա)(4c# "9aBl3&E5xaRbHeh]=73 ?^E@61ʵ!/Ubfm5/ ?ף"-8*!^ g&*1!٩웘R;kaN=" ={9B!Vߞs !-S:(79!dL;׊YҪG>o"Wù`@t$/{WUiԺf"\DH>biQ\E DSB%dvBYVxeG$KT!@셀ߞi~l@`]hiZT:)Zl~HY.8 M:oG+ѣ-O v/rF骅"z05CY drԺkdRg-L,<c C侾ЭuIWLtG%Tw zuk>Ér+ B4 aGZ _" ġHXMuU3Nu}MÎ::N=So!z\C%v苎Ğd v6,ە:xMEBcSOa*:,c2`;(^d] !$|-]$ M!vMBKkWj[Mz_ ;E-5Sqvw7D!@WҸ(l(sSpQae߄/ءWaZ< 9{ߘ #0{hȸ+hΫmO+[m+ !mtru =\Z854!o,qrԡmܠ]<ҝ-A lE>i0 c#J,=(4Aeľ{^`7G1D!V"KӊEhv;7=Ȩ]Lے*|JatM6{N~Ҡ6|U; 9|u]D%@@ FθYe!Yw{''n{JV~n8 йnQ7maA *!Pbxx(#mox_L%0 }N%ly{N9*!ǔxZ.w ׻H Bh3LΆBo*oJZHkC vC`Kun" 9"A%TUݘIae ?'*5,qv4+-G'|qkغvAĴP#rã!d6`̅׳^y{v ȟd>o[ [91CPg| KA|fZxF&9|]ƫZp3UD A~MFgB Bh?ZCΐ0 !@ ;p21[Ży;2ֱo/^Z2Bmѣ-5b LgQvzti#_ʑ%u,_vmC&LBLh>2vD|lT{t yxt!@#c+l)6艪@gv!^Z< vt[꫔W*McDYPgL*{pPwBHޗQ`F(gR^02/] #ޓu>?غbn۷&pJ6Z 1ۈbB9N2v0'(uBuTZ%Y-V ][)H{.snCvC٪SJ 5N$U˂ULۑ-#=軯mZ[ =G@~b8qEPnB42;Pe{!a'6,t #%)LK\([cEBy wp nPiC=UÎMjMUcǻK_{:i#j4HEE{*'P>8HUVOnZgC:|+ U.W6H@4)pgLz!C-l笔+[W.zU1@PXUfLb qYrye3X*}$ڌ x̲NBf橂&6#H@ŭ$^%֥s~AWRh<].:'dRܬuB k6Q9$V@w"O6˲N ##}q/5p]"F@>CKpD yd^;-exkqc^`+)h{]$Ⱥ%9?6r̔vǏܷgí~8jwy&:E {ƞ% %" \> χ^PfIi!V ШFD uU%8pdꢭ+Nw\[p&9[q@Wǟtrɾwg{'A&XgUӐ`2ο*_Q\F_ Ug 93"qHgif eA~:Jq;v+Gޮ^Cȧ6goxA jU߂XCDsC@5O%$l }#Jml{SX"(A8"AU"Ug " ƨ XER894S^s,\OPIC7f[">^B C@VɪSk~K:EߤՎnfu3!PPhP.u69PvY){aV[{ FR%+bX{]16XxpdkٟWX!GeՈMV{F l{DWↀU]쌝zn[HFt\v3ފ[9MƙJ/UD`K4iX#%im Ob:rc,JU ۥ| k=%l/T폺SkU`S; hsoڋ{tZK4ϐxAނY՚'S ;9~P/SEۅJ 6KqƿߖU~!B 2aq[OAjR[r #Z<=$Pg,/~$T"s58vO"ۣG@NjČyP>FQ=OpC@ϴ`!8\WTj"J,]-=>6] $6z4u|+G:)iِ B@Z[6Rz`A&%ծ,~ だ&n 3%p6!sMqjnؓjŏͅnR"F: o_I}O v5|, VXQ&v!>+Had~J+i)Ke5\ؙi{#R0YeeLqx?'SӒ"[ݬs-"fNFl#vDHaYXXT 0>LN %&=c3$gSGZ;3. mܡ[A[aq I-CRۢf͟t4dvC/Bp=0w;-\O.J^vƎSAYk u: UjoP# DǙ%^TG% ̡wd0*lB=4&#mK>}cșk;fJp<d:_;FYC[ wF#-uE#S_B s7c5wP|X9\X(_;X6莶er1ZS6Ffբ|Dy 8xҢG8HfSL)-l\ 9!*Äu1ԂⴷpS;mt !X6ى3JaZ]!ٹ;&PN&d>} |#ph$$NF[pJX+1}GCn$@h}v_ `BCԨ QR#-=yJ-lWʉ KwR#(3qBL2z_#2F3BFm/"48ff̖cچ= .i3 lK BH$[n"OT BwXJ06;*N7F*=MxG.=܀rm.ul_~z[NaV5ăl d$Q^3YAp5=.6V@qf](!j BR .f5'VB xGV;:9\s  $,rNWZ $VW"Il8"t: exRPR5ͰH?!&W0߸LZ^s>y [D@4W!{"!@ U 8h"&U d[s:$ImKExV @4VhcǢ}w1a0Mj # ]J};gvbBXiXT  -sU+Yc9U#boJ_x -+]* Z=Ggz;QSz8&d"P1EbߑffIl8š2_VJ=ͼ.b؅n(v)#.z| 6U;P`ss'w>lu# 3bc×4 Ӗy[leKem%-V+PzV; 6/duԂADTF0")ٿ!KH+0R(yVH-IizK[te%k62" <@ ⸳woNA<K޶?{V(-"%ciWX2B i[pwZa.g2bl[9oKIbC?e O%GܡK"LmJ ~9dVW;v-:qm_ynUDOGLUF[2~q'/H>zf_03q w Y\OmꜯU~KDSک3aHyy j<_68HUIG@qW׭1ؚ?Y݇ʚ@(>R6Q/mذ'qUErhp5 +[vSK; T]2W:廁Y50\ hP2Ùӷ~ 6CnI%B[t5aeH`(L3g Ʈ rE ! `,U7Zcc24ys H2ojXa&gϋZ7t]  ӏ?gg>ӳt3!2;%SN܅c! 'SC'fG t-nw.LZŅ7`)1a۽a=pd@qNXlfVG8cV:m63m~ Yti>ݹ,13eىgrT]ak_mOܺ625qMN&5S!6hGf;@0A|#n8|FX(i`:&_B x#wSj,Wƀm# l<2Fz]"Vmϡ0T*!l46tٖ#@OL1k3El&2]b| ,j'S-s Hs,s 0SmNn"0T}WaZ<4P5 S#DBgZ!-0>-vf<8F?xwFHH 'x)9DJj˚RFGj6^r^wA0 i$9JX J~?tR'=nJ+^E( [feUVB.a!99~v-lW nJ"~A;X?@!OK{UNN~߄#Fށ' _#9.B$V4Eʼn9&o._Qj(fۂ-gI R[u2>BbH:+W/vꡧpB'jMk&nOНk^2Z؎02M88q<ƟyXjnZ塌?9.ΞR7o2+?O`򦨢՟ۓqǧa^e|zpjK,y.7z?y#Bh/=L*l.}8 =jXb Ƃ&FDcB<.Vk آE;Ab"wwOiW{;y{32|'9kI?űWX  X3{R7IXޕZwx@hUSD:CO62 *" $ XUz *x@l_i5)!x z`6r9IpRld|6Emz ؝^7 Uxn (3 ϻPO״Ԗ'n9/zّ5wn;+=#*r!j/f=P-u[H~k o\zEj~H=ڶqfnA+&A#A$@> `Yc.czN&E[G?d␙8Ǝ ܫ8^8feA%`mL,G_Q6Pq - (ֲ ކ%f7z!ujvwK}ZguOI冞gonKa#P2'Cw]r}xMo@9tYP_y+h+r4(@X3ϒG$V2#e^NQArhy"y?G5b|f{"J~j|։)㎖=Iz)L$@4n7 V*hYG[wWAcEؘz k| Z-e ]B'3VM"Pmڸϵ2KZ8m*301|WfQ,疠 K$l%*90%<#͵ef϶z!A].Ef_@g3h-@ $wdI^ǰt'(y;Y $LDc-Ivj9Po\ۢGfMlT{ z|yj}$Gnݧm9;vGBtN%/b{{{ !Zc\ H {T$nω8xg$jDU3BCP!gG\ڭLε()+u to˲f$*iZ) ϑx<|CYeyfj]EZ>Y'K/(֐FQx4~7ڐluE6%(/̐  ԙڢ{eɏ6uVtw$"z־mii[G^_]|׊:ëdžS֑g`] _≄۹c#ȉ@i媧&Gel V֯m/MA30~ڒk ӳHy#Py(<{)?Q{y3 %R2h(QPR(TFb("bP%)puǛcSrߥ:`ŷXd3KԬ*]?}q>w8!;;ڌe:O\VzoJ~Q=7WE0˕rz9gi7hQj7,W̏ Q Ij4yU?^zz/EƮfMUy\'g?vDW򳻙j7LMҀ>:& X36]D ?x/j4rJ:ZfF|+~ lٖ- ?дZ-÷a`B3w^3["Hj${FwJ“~p1&I\;ߛX2\}aM"jsΖ?~g.T]TbY=~jexD≫O~.XygIy-Da:ONܭ&#/MPYb%Nн>[͸ͭ/H@N"H95#6 FgP2Hj SU\W.GO$K$^v xÔU{S­8R#GZJT'<:mZB:RE f$z3d7J",< @(m3mV>ibYcozF+؅_Y+<+55eHIq!"~H$ՊZrגw]ոl[ܱ'n^O^˵V`u,k6R 㲺F YM.16PJTK TSVX0w8aa"=lZ^oE#^ 7r>C8+ ?,7=MbWV]iF?/H?m5nFmۿu44Ys6udYz㵴'cp.r,4 X5}+Xlg$?>4}O>#xҳ$?k?hw^Rr@eU*Q2gŪKafHr]2+9rC*fz/YF R_V!KF{?5w 6>SO|U<6/:|jk^}ZlfO Ĺ; }YCH4=GHSzѕ3\*ѷ^8Md3-ڛ!z,0g!ΤFh] 3ߎvĆh_o؜@<OnPosN,z#/-c0phyx2! 0h݇0Tu  آM~0m$2;ӵiHn"{갻Srwq%"*!>Ja 6!~3ߒ+wynfo"(n,d;KՌq7YB1Р{,ycy̰yi04R=oq^||k9 ԁ@{>w\VM l iTK[ 2RT5 @lEpO`휩ϕ8 Kq$hxnSVԇcH 8ֵap58fI}F4| @7y*8Qd3 Lf=PQ*a~H`VL%GٮЭgEt~|jaQ.kG?!;u%k\NƛVqoQVϏ+l\[2rnBrM3U:TPXNww5$.ڲhެ]'lInw,+ ԕ@Io'>=3~Z nG$@Y@`YPUmqPF?g;}DHzybD䟈NsxtOEc#[D_-yNV/GlН{j Zdri+W<,\wn;MO`]߾D\o"A `">0""D$@$pGpDzR$@$y3|G(}#,XVq֗ b ?Ƞ[;uO'R/V,|Xˬ&vc`~S3ݣOSTvDπ_YM/bDI)6&U:Dfh ԃC{{=e٦ -ESfYY] ,'PVTiY~$@' 00t/bs5,+JaK2VTzFM=?,_ [\fN:(ZNg~(zGcB]wKv IK_ cU E'P( _F#ay· ,L2M|@`%y%`-GطY5\J}nvKU!lk oBD]jf8_&)On% @ɼ)J h(˛Li\|ViN,D5& @8sVu d @n!Q+>"2 r5Sވ[ ; }O۵>s4LO̟QL$F%œԒuf2Fxꛖ2FR+).ypz霂WBH2O`쩋!Ws6X$@&@=kqx? a:ݕ\a ǿ+UYf<{b!<)=U=?nV֧:> Qwa? E&5Czi}p1W>dH N{[ݿg_yޚ^Aͬ! $P2oqDw4e[$@";jsaLUi%Cy"@FPTpz4ɦ"W&}BOqHsqd7ی qI$5s#jV,޺W| j`3L s1sf3@Wi}DѽQ,svHFgD4?jXO@f|Ohcǩc%9TLk6> s۴TcD?%PR^D^h/Eoڈnl" FdI2Fûf93P&xH tRL[EIsλXbblڊ4˕ת V:Zr4xk2:y2 [NV=ۀRݯ?y_u&c!,-b]Wttxk~r,Sb9&~?/>.bY"89ũ@I[tR|=#vq/P\k6&{D]/;K[t̚jDžISXDz"F2s%o=utg7A` fI kFp8Z$-w=ghmɆxB8FVtT SkˮT畸AC<%;s SA~F!O$ g!B8;8ÿmߕUTD,.>m88*Mh\Ի܁Chcmtnx'g*L/AM?;i{hSVaP}:YB3D[K gIYM H wjۥ_mۏ!i7S5=$kav:W뜱̕O {1[W_77MD{ <ܓ:'\Yi !_AP PQX2f?XTroR9 ;b(V Q0ac>2qwx`~f]jdkF\}Yqh<`V(-mX0.D왌fɊd`mAes'Ҧ۠`t2v$8U cIKN)GzXahe\yF|ps*ūaHIx:<#;pѳjbkKۦ%Zd|C݇"e% v3 '-mڬT1Fz{{c#A8 $w y~F}«^06{f*~곯^th~sYlʻgqL>uMueqK>L^~EtIP I J b UZ4yL]Df)/v#q@۪6{GJ .>?._/ 4H?hG_ 뭑녏 V O{؇*L}aE"ckk>݇/g&ÿIiNw-/#2?GE# -~meP}o7jE8p7,Oj >H¡}L`G㽯Փ[@ <+xGz4]~`\nK)-UȪ [ڄ5mGju'lcW΁tJYqCuߓ[ ԅٓJ[zr1a*߬ 4m?~Q8x-8Mi-g$9z;0N=a:D]R>kϕG}2 ;ҮUr7&>p&3 ʖl%[=AsS[cS돥eت$)+ m@{ν8ױc)0pG))47Y6w꣮rzEiĺ>W^6Q7晋ю3OL  ̊%0{u%ݷ%?L'vOGm0uy."H #2Jз޹ƃ=ho~vc*Y12`8ˁN7G](Q^;ekP)i5=E;5@iQ4JbvC>bZ5^~ڧ7ya]^7w;NЮ7@BQ.2>_V9[t|2VA;>}fJ*DosHl}YIq  H-'7qg%I-ۢ~qiO'fݯAH?AA&{?TRLGoL#Gyd[u-l⛏VJ8)VJ bu/Mi̬Cְ^k.8#5T8 Bt`1ǻaJ/ֻq}z ~g KDX艺lLNƦ>I;8ƺdhwu'5~g]%ܞ_ b/@}G-e-B\*'7(LqD R~$PNa3jGѺֶVs)qV]#m[[9tXD|ޘEkߊ@p p7H9)ODαc+.h^tG>Lnt`maۖHD$PSv/.oi} nyfRIxyyVA\c0x`j;[  L0^nNrGc&0)wK3Nۢ^ -p'k6,81R1 * 돟}|Bxn-̿C ஬pN^-Qn2 *׊q=7ɩپNgNjc /u7 OO,).x653  t0k dm磿 KAϾ VrfQް2;Ϝ e_f{= 4\9]Ei-VES.E@= dX1QL~%%fCۚ6\& 7c54 G -47o5s6K} uE9*-, ?ⶩЈsE t#Z[zr[3{Rhtps=Fb{㘚H3}?u1S.ņFIH2E_es Xd,cskDNRVV8y6HW8J9kg$I%^EP D#M-1倉MGCk>TΕ#Z&s|*!~ll/9һ_RWN+DsofwrQX ~TfyD-:a"oC pGNW:w&cQ%$Tսh䢝xOޔMe7E݊ k Dk9aB`U nĽjm=s$@$@>!`Xdr#qob%=هIPuSkAi7HDOM,ʭ毇mDז!Ovٗ-~N#[fjwX=({K"}cm0gvWа0`QV ;/lu%̣m3X9& NvWJ Tb57 7`џ4ngp8h%tݼERh'Vnu}+H!#j?rOi! /#*Lm(k  (p S<bpspZx,[}M "m Y[ɰ$]z+bfi3D&y~u7JAS/*GƆ6tcrp:w+(qRUp/QgF[9L22@[ي@ )rW9Eh {0찎nj#a ^$rH9k\[޻ff>,ډU/K J)DS!VL~ `*"ޛWvWnXJUVfnjWFyᘵ7ƥ  MWKזgq-+rˊ!jSFOզ&L$@u&7M&٬H;,'d_vTNqC}zQCt7stkwo'L`57k Y#k j}]UiX<v|t_pΝvϼUL腘Q3v_ٶHH J'/Gн_=ar>ެ~Eh-}q٘W=hHK~, i&՟UQV ̻A$fcN M|+ŗZƫ_fmK,րr$UaA1gҀ|Qqb0u>CznڨFĂij157 @uF(ҙP{+(*<񂐀> /`I~Oe"=zӦqxi=0W'o3$/Am$essv>6%N 56QdVsX}6'7kڕ5=ZU5"F0f>3T]qm;}bE9LH]$@D3q#A(g%B1_Gu800I xSsx𼟁v Rʿ zo`GgDF,drلur1 ?Ɛm>;92}O/" IK'(_G4V@ ^[H ou8g~l\zpĆ~ڄ('4=ZvjA'_xV]- )ʉg/mrk!x)xvQV4+98mn>Uu '"W˫V9o}^8[t~g J뮴#ake5 E[m+z@{ n8|x0Gi)9q5Cso]2`Z;/*h*w テuB -aDÃNtx2Li"{=@0S`M3y։";MT) d%ݻkQrxo|a^줰k^j !21:x~c*[V~BׯTMP|qV :ЎjeƋEW0yXnJ7h?v׬w1RpԐ2GgR`x/6ZeÒ*,w>G߾^UAn+ }n%}\|o))3 t,&A݌8>CY(*f~4>Y HFwՖtuA:ݻaڟQ=Q᧎]X#C"F:~m(_9aZWlH;qŞx{j0`2ƗD>F&Xϴh90{0v/p~mM+n.sq5g:Hf:su.B2~ 0Eܹ-͗P`Om07   5&x.onx'Q=MI|݄Ǜ7l6bOZ-r(Җ*\PY·~MjxGogosOd},"GcN{D$)+#ݧ.tcиކpTUѾ=VV=/aRd m(KoA\fZ%S8Z #clhǛ^ !T5c<& LUaAl~Lj{CK* k|J6VNrAd2P%U9Nܱ9qhm](L=/6뭈}Ԛٓv9lnU~x?3: 2vjv ,/c$q#.L,l /&Ac->1QkWc,8ܵ^a{{  H]߮Ҳvji3e-MK`ubK恨0Q3ߟXC(^\{%V.krI u@ a@nK#1H%9@60kߥQM "[PemB0sP6&q_+$@n{>wBl?RҺt\ꞿ/w7R3Ǿ2P$$߳r6QὥɲK[XU剰zבDZ63vo cUi93M =GҪղVYg)m%\嶆 oXes)D2|0|툽*-_Q8mvv$@$@$/\.|#lԭ:/sֵl*^p͆0 ٖ;sBq|)wQs].zj{eL2ypum;ѧCK| M: 6ur|&8հ!Yp$k9ҭBT;9 _@$@$@$@$@$@$@$@$@u!KA[ȷpXԼRƳhHNyM_mO#ڄl3Kc9g+O&OؑIz"W؞Y @ RpPo0.1~YeoL&zOSXN8ZzbFl STp.S3ݗ UfIHHHHHHHRGqY*LA5$mRrw֩kTxŪ+t\EFÚL@p #ƿ>LeinE'X^␜RS.S/LxQyqg        $K}VL%'Alc-ãN,ByS cj 4Ƌ`/eeʖ]vk{\:xd]X᾿q~h HHHHHHHH x|)Wc$Mq}a2~{PH(O3?ήG{A}mlJYFfƄSΔ d  ?HL geb^3ŕ^qʻ.@ȡ9QE͉^CbzDyoeX?Ivz62amf֋HHHHHHH2Eb_'LHqw%Ͱh=SsZZ<\#ny?rZ4G_I)ri+9z7g[e"       tZ[HG9f*QWcVKڸg; ݫYnp*+.w!y~UX662ڬ# #/cIDAT dowCq@ t*)cwhi+[f݌k:qRSHW3S2"%Y)7dE$@$@$@$@$@$@$@$1Vp Q%=p[i8c--Vr# < 8&[Eepermx+Z6(u|Vx] ldՁ7!        :l>vk %wy1euSǑ`&좻n?;ї]V>%v$'Aҫ~qiɌIHHHHHHHw*"A yA~-bA0؅kX9&׺ms9]o!^Xʺ 4 Up"Q9Gv9=9-1PÚ =3v)Dw}5y}ڶ^l,HjC]WVHHHHHHHHI ^p7t>@KVIYfU6Q#%9d$duJxG%Gt u]kWN[mFZ;Olw?b{$@$@$@$@$@$@$@$@ uqudu:/0Z_FMiJExg4ges-k?%mұaL6Ȇ?'cY'        n}<\-%^F%/()Xq aNW;ے;nj3g|lwϊ뜩^E!       1 P zY0zNKXgaLw,+"4zSTyQM_Hn L- I?0N!qφal6։HHHHHHHH%2,/!,։(X1?OKtZQ'q0fU9~b,Io92`IHHHHHHHL p+US%A0eʽ~.}4L} K[E]!O0Nm]U(WZU^f',8 @wC2Y\bu6-Cl$%;}^>ň_]c/ g/Ow*ՈSBlw$@$@$@$@$@$@$@$@$N ECBוAtdq*9CM4l%Cջʕ3Hto'ϛų&׮%T/{*5`IHHHHHHHBD i%|{zg"rE1rn- Wo2 $ "ZN,q>q[o.FlvyKĩ; L$@$@$@$@$@$@$@$:Mk,"GjD&vl[8T- ,wE] JR`E]66(pJt5E>(@$@$@$@$@$@$@$@$@ Aj)1+'1ĉ'FF\GA u&ro3䎣[2`TG `/}Qh׽M򺝯^mMH$@$@$@$@$@$@$@$@!&6Α<%]Z2L}Qc%)-Q;%u߸˗PPYk_Ķ1۟1QZo4kՌYHHHHHHHHH Fp7x`LɑY<޲M#z.:FtW6Dw-QcYJKI3$ @* j/p, $ R1?,W΀[ 7ɋԷe?W3ݤBWVc @f@?Q Q@lE0rdClw!D7‚ l@ŸUjH5aƗ zCčHNnD=pg? Ww; v< mMsE-mcܲmz.&WIT-jO.TiG'        mLbA T?hzГqy޵ܥCԺ 'eL4U+V*쳡4m2ӮYhؑ,G2|uJq$G4Mb!7(ZKs        Pu#1_i qXpp蒡Q 8V_ h/F7mUeaLIyOOÁR_tH$@$@$@$@$@$@$@$@5B/ynުB%و<~2-f \KϢ!AP^x6?A)xi G/GftX{A?w7{gFk1I~T:>vVMv rgWWDOvh͓1x͖5q &VɈ1!HmƲ @F`X2TrHwUҧ^A` :7h7 ow 2m3yQzeĽHHHHHHHHH@ wG^FxrdFy 8ߋg>,f00i )?"          dz^ >og#2khIDvyYu l^Xx63ALˍAL\%Cp4Xs3        / t)hۃydΫ 6b7.*> c1{-[v7~N*R.x$ueHHHHHHHHHគƙ?Q/#$Dk3]mvo5q)N(03v\N/h&jle'q9=݇b$@$@$@$@$@$@$@$@$@['@}l X!' *Dj*#X ~vN39z:;,N-*4x̃ubcDV&M̪ -e@Α\ڤa@7)HḞЮl-CP+Smhh?FmY2 ,dPvfT"Luc]HHHHHHHHH ((f͚Koەӵ%= Hd"<%-9 XW-KF:fWk-%`$CŋO;4*A$@$@$@$@$@$@$@$83dֻ&"romlg6ٝ!QF\oO`weز>o@zPyU`-qX`t$$)uД5"q-l HHHHHHHH PpoOG/D\າ'=B;wK|* WZ>d#_}SMTPGLGVJ? ^ 罽A_!,ȒP5+C$@$@$@$@$@$@$@$@"@=@Ţ@/ CAxooL;b@V&        FdOh}~'c̒f(X>        `{[7buN hw^ V2N\&-$+# D$@$@$@$@$@$@$@$@YD{56Z?߬93 lbw-)t哒@$@$@$@$@$@$@$@$@MC{pQD`n#~!'fyL'(#|\hz$eHHHHHHHHHLS،" 9:Xع4{zw\Qʗ# HHHHHHHHH&CV/"PowC{KO7^qSDW"oDq{Df yxZef"         j&hjC7rkaGD^wƊU\׫Q)XKĒl}4LzHHHHHHHHH(XP-6زVʑ*!@|?뉟W_ֶ|"= A9)HHHHHHHHOՂQ~IENDB`PK!DQ,abilian/web/resources/img/avatar-default.pngPNG  IHDR{`IDATxs`\ۢaHmPܞ/eăӉ &29D4>'Gets **1 kʳN f޴PLf!N$eDH'=elLd 3Y*Vۥ+VCLOBi@Z+V{ [(PONL=8XH- znkg=Z =mө@[k>9(p/P8.N^v\v1,vpJSq°܈m_8 %-}b]P+WF8+}Po @ ۗ_X @?nc("PWE $ ܊]_x%BaF'ewSo^v'ȰCo G|f7R7Z XN# VYDXޤh5X /&X(c^ `%c⊀=(l̥7 ,*b( "VqEŠ L_ Z[4PŽD 4ȕ+vT&?J<竣u>''G$V2D$8`0GNd:*_q$~N~J/ As}gqy, ?;G`!(.T71ٿEEg z~T<0MV{=y?إLM;7%jPLk7ӎ7R&̧Db0|K6~7os#>67Bf4~ʱ^P oBi1 |p&/m(@v X*A`?'#Q@w4i/H6By @ލ9b1ЂP,c8}8D`c2X8>}9LahMvC(ݝȓ7V.'&{)]0qJJE~!^)\̮W.b3e ff"{ep_N-JmD-W *j.#2ej_F%ʀU\*._*k%+UӉ34 Dd Fs_v& #WAO?/b|wAuLK_;M5=8XF3B+qrw3j|'fj?ij/ij N^SR`&t`F.R ^a^ '~6;a`,\ݍsue'su2 oҁ!y"   t    @!   X{pm PMdX#3 iң K0.?=T#lیT`U\B6.`b 1 L'Y~IDATX V{lVҖ,JfA--˒Zb2Md,t, 8\tjFZq$nP)9c0 7.gz9%=9<{!?'``W[oĜeOs\>D2XG ί}rܢmR*iڦ5ˋ~uBTZƘ#s(b|ENu6y[="Kjd]/ZK+X{h̥Tr+%$Ӑ#,y%_)XaWV'Rti fݡC^.1֗6C) c5P^#\}N}ˉpV:߿.=ג%ih(vJr 7F+I dn#q]CԺ~)g.= +xg[JP]%GiLR93e#mn#[Z% >q:yFk1_R״\{We✬tJfFi`GHʞ~g?lP-4eb_9;r:G{ܧZ-^Y.Ջ2FM9hdؕZLj+*e7gSP fA]<'>w5 gܘv*q %j]K×Lψٶ筓={ʗ+kàq0[flw/yVn2` ^pDs_֞'iҀ\doMnT >ly,3%)hcS0I^tm] E´ A署E&?n䣚|'  rD\/D_QZ?x+fwpƕd WC&!襁%F)^ *S8|#qpahqRc2&9ͼ &SQk]_Q2\;T6tA47p`StB0~TvBD0)jtȁvX׸S^B?7`m;Cʡqw!s ;%7w$jպqh3Йw0r Sړ1ЊJ 9<)B(@]ߦMxΊ$\ZF E3}p| AxxOmoZ/ \'J~vgIHTb3-ZZ7^]:xM.iDcg҆( G7b.7ЉM[9w:BQիfUO܃r+>6Q(K0 'Xq4')@tm3T$qR,zJcgXo`.#4=`N_vKF۰bpզAxLI^'*zaJyOBOē 99N/@KX")EDq䓪]ABv±𢡊r& MsD7o_(\ՊbHJ'wJP֦@ͥ2P~-vN \X r1z̛:LHP)9k5(TڅeMhzd^?2M:Dip(JE|?)dVU*r Eizu@Dۃ-JRQs+ob[S! 1 L'YIDATX V{lVҖ,JfA--˒Zb5cLn176Y(vq(KɌSF挌$ໜsЖZ$ﹿxY]#omsf!#f۞Nٓ+_[@: d=PlsMWe}R:\-xaLO}aX{4 iL.]~AʦYb76<ᙒұqJk$WCQS/~bЮa´ w (l.d(k.& /CCƁl,>t0WW9ajq8Ji2҆īA79D^]ָDX(k!PR}J}U<. -Nj [\$Wī>`nA^٥_XH,lXk*o@47Ayv=U(fZ4tr'X emJd\* bgZD("ʅp+ǼÔ%(aJ+Ny^Bj.]/kB+ ;I͕dl!zOӇCQ*:][VTkȉ|!d2ndv(1JE \x[#tx!4l(z \!= 0 && j < len ? [ this[j] ] : [] ); }, end: function() { return this.prevObject || this.constructor(null); }, // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, sort: deletedIds.sort, splice: deletedIds.splice }; jQuery.extend = jQuery.fn.extend = function() { var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation if ( typeof target === "boolean" ) { deep = target; // skip the boolean and the target target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) if ( typeof target !== "object" && !jQuery.isFunction(target) ) { target = {}; } // extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; } for ( ; i < length; i++ ) { // Only deal with non-null/undefined values if ( (options = arguments[ i ]) != null ) { // Extend the base object for ( name in options ) { src = target[ name ]; copy = options[ name ]; // Prevent never-ending loop if ( target === copy ) { continue; } // Recurse if we're merging plain objects or arrays if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { if ( copyIsArray ) { copyIsArray = false; clone = src && jQuery.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; } // Never move original objects, clone them target[ name ] = jQuery.extend( deep, clone, copy ); // Don't bring in undefined values } else if ( copy !== undefined ) { target[ name ] = copy; } } } } // Return the modified object return target; }; jQuery.extend({ // Unique for each copy of jQuery on the page expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), // Assume jQuery is ready without the ready module isReady: true, error: function( msg ) { throw new Error( msg ); }, noop: function() {}, // See test/unit/core.js for details concerning isFunction. // Since version 1.3, DOM methods and functions like alert // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, isArray: Array.isArray || function( obj ) { return jQuery.type(obj) === "array"; }, isWindow: function( obj ) { /* jshint eqeqeq: false */ return obj != null && obj == obj.window; }, isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN // adding 1 corrects loss of precision from parseFloat (#15100) return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; }, isEmptyObject: function( obj ) { var name; for ( name in obj ) { return false; } return true; }, isPlainObject: function( obj ) { var key; // Must be an Object. // Because of IE, we also have to check the presence of the constructor property. // Make sure that DOM nodes and window objects don't pass through, as well if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } try { // Not own constructor property must be Object if ( obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { return false; } } catch ( e ) { // IE8,9 Will throw exceptions on certain host objects #9897 return false; } // Support: IE<9 // Handle iteration over inherited properties before own properties. if ( support.ownLast ) { for ( key in obj ) { return hasOwn.call( obj, key ); } } // Own properties are enumerated firstly, so to speed up, // if last one is own, then all properties are own. for ( key in obj ) {} return key === undefined || hasOwn.call( obj, key ); }, type: function( obj ) { if ( obj == null ) { return obj + ""; } return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ] || "object" : typeof obj; }, // Evaluates a script in a global context // Workarounds based on findings by Jim Driscoll // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context globalEval: function( data ) { if ( data && jQuery.trim( data ) ) { // We use execScript on Internet Explorer // We use an anonymous function so that context is window // rather than jQuery in Firefox ( window.execScript || function( data ) { window[ "eval" ].call( window, data ); } )( data ); } }, // Convert dashed to camelCase; used by the css and data modules // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); }, nodeName: function( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }, // args is for internal usage only each: function( obj, callback, args ) { var value, i = 0, length = obj.length, isArray = isArraylike( obj ); if ( args ) { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } // A special, fast, case for the most common use of each } else { if ( isArray ) { for ( ; i < length; i++ ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } } return obj; }, // Support: Android<4.1, IE<9 trim: function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); }, // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; if ( arr != null ) { if ( isArraylike( Object(arr) ) ) { jQuery.merge( ret, typeof arr === "string" ? [ arr ] : arr ); } else { push.call( ret, arr ); } } return ret; }, inArray: function( elem, arr, i ) { var len; if ( arr ) { if ( indexOf ) { return indexOf.call( arr, elem, i ); } len = arr.length; i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; for ( ; i < len; i++ ) { // Skip accessing in sparse arrays if ( i in arr && arr[ i ] === elem ) { return i; } } } return -1; }, merge: function( first, second ) { var len = +second.length, j = 0, i = first.length; while ( j < len ) { first[ i++ ] = second[ j++ ]; } // Support: IE<9 // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) if ( len !== len ) { while ( second[j] !== undefined ) { first[ i++ ] = second[ j++ ]; } } first.length = i; return first; }, grep: function( elems, callback, invert ) { var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert; // Go through the array, only saving the items // that pass the validator function for ( ; i < length; i++ ) { callbackInverse = !callback( elems[ i ], i ); if ( callbackInverse !== callbackExpect ) { matches.push( elems[ i ] ); } } return matches; }, // arg is for internal usage only map: function( elems, callback, arg ) { var value, i = 0, length = elems.length, isArray = isArraylike( elems ), ret = []; // Go through the array, translating each of the items to their new values if ( isArray ) { for ( ; i < length; i++ ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } // Go through every key on the object, } else { for ( i in elems ) { value = callback( elems[ i ], i, arg ); if ( value != null ) { ret.push( value ); } } } // Flatten any nested arrays return concat.apply( [], ret ); }, // A global GUID counter for objects guid: 1, // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { var args, proxy, tmp; if ( typeof context === "string" ) { tmp = fn[ context ]; context = fn; fn = tmp; } // Quick check to determine if target is callable, in the spec // this throws a TypeError, but we will just return undefined. if ( !jQuery.isFunction( fn ) ) { return undefined; } // Simulated bind args = slice.call( arguments, 2 ); proxy = function() { return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); }; // Set the guid of unique handler to the same of original handler, so it can be removed proxy.guid = fn.guid = fn.guid || jQuery.guid++; return proxy; }, now: function() { return +( new Date() ); }, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. support: support }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); function isArraylike( obj ) { // Support: iOS 8.2 (not reproducible in simulator) // `in` check used to prevent JIT error (gh-2145) // hasOwn isn't used here due to false negatives // regarding Nodelist length in IE var length = "length" in obj && obj.length, type = jQuery.type( obj ); if ( type === "function" || jQuery.isWindow( obj ) ) { return false; } if ( obj.nodeType === 1 && length ) { return true; } return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } var Sizzle = /*! * Sizzle CSS Selector Engine v2.2.0-pre * http://sizzlejs.com/ * * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * * Date: 2014-12-16 */ (function( window ) { var i, support, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, // Local document vars setDocument, document, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains, // Instance-specific data expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), sortOrder = function( a, b ) { if ( a === b ) { hasDuplicate = true; } return 0; }, // General-purpose constants MAX_NEGATIVE = 1 << 31, // Instance methods hasOwn = ({}).hasOwnProperty, arr = [], pop = arr.pop, push_native = arr.push, push = arr.push, slice = arr.slice, // Use a stripped-down indexOf as it's faster than native // http://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { if ( list[i] === elem ) { return i; } } return -1; }, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", // http://www.w3.org/TR/css3-syntax/#characters characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", // Loosely modeled on CSS identifier characters // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier identifier = characterEncoding.replace( "w", "w#" ), // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + characterEncoding + ")(?:\\((" + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { "ID": new RegExp( "^#(" + characterEncoding + ")" ), "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, rescape = /'|\\/g, // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), funescape = function( _, escaped, escapedWhitespace ) { var high = "0x" + escaped - 0x10000; // NaN means non-codepoint // Support: Firefox<24 // Workaround erroneous numeric interpretation of +"0x" return high !== high || escapedWhitespace ? escaped : high < 0 ? // BMP codepoint String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, // Used for iframes // See setDocument() // Removing the function wrapper causes a "Permission Denied" // error in IE unloadHandler = function() { setDocument(); }; // Optimize for push.apply( _, NodeList ) try { push.apply( (arr = slice.call( preferredDoc.childNodes )), preferredDoc.childNodes ); // Support: Android<4.0 // Detect silently failing push.apply arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { push_native.apply( target, slice.call(els) ); } : // Support: IE<9 // Otherwise append directly function( target, els ) { var j = target.length, i = 0; // Can't trust NodeList.length while ( (target[j++] = els[i++]) ) {} target.length = j - 1; } }; } function Sizzle( selector, context, results, seed ) { var match, elem, m, nodeType, // QSA vars i, groups, old, nid, newContext, newSelector; if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context ); } context = context || document; results = results || []; nodeType = context.nodeType; if ( typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { return results; } if ( !seed && documentIsHTML ) { // Try to shortcut find operations when possible (e.g., not under DocumentFragment) if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { // Speed-up: Sizzle("#ID") if ( (m = match[1]) ) { if ( nodeType === 9 ) { elem = context.getElementById( m ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document (jQuery #6963) if ( elem && elem.parentNode ) { // Handle the case where IE, Opera, and Webkit return items // by name instead of ID if ( elem.id === m ) { results.push( elem ); return results; } } else { return results; } } else { // Context is not a document if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && contains( context, elem ) && elem.id === m ) { results.push( elem ); return results; } } // Speed-up: Sizzle("TAG") } else if ( match[2] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Speed-up: Sizzle(".CLASS") } else if ( (m = match[3]) && support.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // QSA path if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { nid = old = expando; newContext = context; newSelector = nodeType !== 1 && selector; // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root // and working up from there (Thanks to Andrew Dupont for the technique) // IE 8 doesn't work on object elements if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { groups = tokenize( selector ); if ( (old = context.getAttribute("id")) ) { nid = old.replace( rescape, "\\$&" ); } else { context.setAttribute( "id", nid ); } nid = "[id='" + nid + "'] "; i = groups.length; while ( i-- ) { groups[i] = nid + toSelector( groups[i] ); } newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; newSelector = groups.join(","); } if ( newSelector ) { try { push.apply( results, newContext.querySelectorAll( newSelector ) ); return results; } catch(qsaError) { } finally { if ( !old ) { context.removeAttribute("id"); } } } } } // All others return select( selector.replace( rtrim, "$1" ), context, results, seed ); } /** * Create key-value caches of limited size * @returns {Function(string, Object)} Returns the Object data after storing it on itself with * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) * deleting the oldest entry */ function createCache() { var keys = []; function cache( key, value ) { // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries delete cache[ keys.shift() ]; } return (cache[ key + " " ] = value); } return cache; } /** * Mark a function for special use by Sizzle * @param {Function} fn The function to mark */ function markFunction( fn ) { fn[ expando ] = true; return fn; } /** * Support testing using an element * @param {Function} fn Passed the created div and expects a boolean result */ function assert( fn ) { var div = document.createElement("div"); try { return !!fn( div ); } catch (e) { return false; } finally { // Remove from its parent by default if ( div.parentNode ) { div.parentNode.removeChild( div ); } // release memory in IE div = null; } } /** * Adds the same handler for all of the specified attrs * @param {String} attrs Pipe-separated list of attributes * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { var arr = attrs.split("|"), i = attrs.length; while ( i-- ) { Expr.attrHandle[ arr[i] ] = handler; } } /** * Checks document order of two siblings * @param {Element} a * @param {Element} b * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b */ function siblingCheck( a, b ) { var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE ); // Use IE sourceIndex if available on both nodes if ( diff ) { return diff; } // Check if b follows a if ( cur ) { while ( (cur = cur.nextSibling) ) { if ( cur === b ) { return -1; } } } return a ? 1 : -1; } /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === type; }; } /** * Returns a function to use in pseudos for buttons * @param {String} type */ function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); return (name === "input" || name === "button") && elem.type === type; }; } /** * Returns a function to use in pseudos for positionals * @param {Function} fn */ function createPositionalPseudo( fn ) { return markFunction(function( argument ) { argument = +argument; return markFunction(function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { if ( seed[ (j = matchIndexes[i]) ] ) { seed[j] = !(matches[j] = seed[j]); } } }); }); } /** * Checks a node for validity as a Sizzle context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience support = Sizzle.support = {}; /** * Detects XML nodes * @param {Element|Object} elem An element or a document * @returns {Boolean} True iff elem is a non-HTML XML node */ isXML = Sizzle.isXML = function( elem ) { // documentElement is verified for cases where it doesn't yet exist // (such as loading iframes in IE - #4833) var documentElement = elem && (elem.ownerDocument || elem).documentElement; return documentElement ? documentElement.nodeName !== "HTML" : false; }; /** * Sets document-related variables once based on the current document * @param {Element|Object} [doc] An element or document object to use to set the document * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { var hasCompare, parent, doc = node ? node.ownerDocument || node : preferredDoc; // If no document and documentElement is available, return if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } // Set our document document = doc; docElem = doc.documentElement; parent = doc.defaultView; // Support: IE>8 // If iframe document is assigned to "document" variable and if iframe has been reloaded, // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 // IE6-8 do not support the defaultView property so parent will be undefined if ( parent && parent !== parent.top ) { // IE11 does not have attachEvent, so all must suffer if ( parent.addEventListener ) { parent.addEventListener( "unload", unloadHandler, false ); } else if ( parent.attachEvent ) { parent.attachEvent( "onunload", unloadHandler ); } } /* Support tests ---------------------------------------------------------------------- */ documentIsHTML = !isXML( doc ); /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) support.attributes = assert(function( div ) { div.className = "i"; return !div.getAttribute("className"); }); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements support.getElementsByTagName = assert(function( div ) { div.appendChild( doc.createComment("") ); return !div.getElementsByTagName("*").length; }); // Support: IE<9 support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programatically-set names, // so use a roundabout getElementsByName test support.getById = assert(function( div ) { docElem.appendChild( div ).id = expando; return !doc.getElementsByName || !doc.getElementsByName( expando ).length; }); // ID find and filter if ( support.getById ) { Expr.find["ID"] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var m = context.getElementById( id ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 return m && m.parentNode ? [ m ] : []; } }; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute("id") === attrId; }; }; } else { // Support: IE6/7 // getElementById is not reliable as a find shortcut delete Expr.find["ID"]; Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; } // Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); // DocumentFragment nodes don't have gEBTN } else if ( support.qsa ) { return context.querySelectorAll( tag ); } } : function( tag, context ) { var elem, tmp = [], i = 0, // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { while ( (elem = results[i++]) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } } return tmp; } return results; }; // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { if ( documentIsHTML ) { return context.getElementsByClassName( className ); } }; /* QSA/matchesSelector ---------------------------------------------------------------------- */ // QSA and matchesSelector support // matchesSelector(:active) reports false when true (IE9/Opera 11.5) rbuggyMatches = []; // qSa(:focus) reports false when true (Chrome 21) // We allow this because of a bug in IE8/9 that throws an error // whenever `document.activeElement` is accessed on an iframe // So, we allow :focus to pass through QSA all the time to avoid the IE error // See http://bugs.jquery.com/ticket/13378 rbuggyQSA = []; if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { // Build QSA regex // Regex strategy adopted from Diego Perini assert(function( div ) { // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, // since its presence should be enough // http://bugs.jquery.com/ticket/12359 docElem.appendChild( div ).innerHTML = "
    " + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section if ( div.querySelectorAll("[msallowcapture^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly if ( !div.querySelectorAll("[selected]").length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { rbuggyQSA.push("~="); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibing-combinator selector` fails if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { rbuggyQSA.push(".#.+[+~]"); } }); assert(function( div ) { // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment var input = doc.createElement("input"); input.setAttribute( "type", "hidden" ); div.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute if ( div.querySelectorAll("[name=d]").length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":enabled").length ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Opera 10-11 does not throw on post-comma invalid pseudos div.querySelectorAll("*,:x"); rbuggyQSA.push(",.*:"); }); } if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector) )) ) { assert(function( div ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( div, "div" ); // This should fail with an exception // Gecko does not error, returns false instead matches.call( div, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); }); } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); /* Contains ---------------------------------------------------------------------- */ hasCompare = rnative.test( docElem.compareDocumentPosition ); // Element contains another // Purposefully does not implement inclusive descendent // As in, an element does not contain itself contains = hasCompare || rnative.test( docElem.contains ) ? function( a, b ) { var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode; return a === bup || !!( bup && bup.nodeType === 1 && ( adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 )); } : function( a, b ) { if ( b ) { while ( (b = b.parentNode) ) { if ( b === a ) { return true; } } } return false; }; /* Sorting ---------------------------------------------------------------------- */ // Document order sorting sortOrder = hasCompare ? function( a, b ) { // Flag for duplicate removal if ( a === b ) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; if ( compare ) { return compare; } // Calculate position if both inputs belong to the same document compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected 1; // Disconnected nodes if ( compare & 1 || (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { // Choose the first element that is related to our preferred document if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { return -1; } if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { return 1; } // Maintain original order return sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } return compare & 4 ? -1 : 1; } : function( a, b ) { // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; return 0; } var cur, i = 0, aup = a.parentNode, bup = b.parentNode, ap = [ a ], bp = [ b ]; // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { return a === doc ? -1 : b === doc ? 1 : aup ? -1 : bup ? 1 : sortInput ? ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check } else if ( aup === bup ) { return siblingCheck( a, b ); } // Otherwise we need full lists of their ancestors for comparison cur = a; while ( (cur = cur.parentNode) ) { ap.unshift( cur ); } cur = b; while ( (cur = cur.parentNode) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy while ( ap[i] === bp[i] ) { i++; } return i ? // Do a sibling check if the nodes have a common ancestor siblingCheck( ap[i], bp[i] ) : // Otherwise nodes in our document sort first ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; }; return doc; }; Sizzle.matches = function( expr, elements ) { return Sizzle( expr, null, null, elements ); }; Sizzle.matchesSelector = function( elem, expr ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } // Make sure that attribute selectors are quoted expr = expr.replace( rattributeQuotes, "='$1']" ); if ( support.matchesSelector && documentIsHTML && ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { try { var ret = matches.call( elem, expr ); // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || // As well, disconnected nodes are said to be in a document // fragment in IE 9 elem.document && elem.document.nodeType !== 11 ) { return ret; } } catch (e) {} } return Sizzle( expr, document, null, [ elem ] ).length > 0; }; Sizzle.contains = function( context, elem ) { // Set document vars if needed if ( ( context.ownerDocument || context ) !== document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { // Set document vars if needed if ( ( elem.ownerDocument || elem ) !== document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : undefined; return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; }; Sizzle.error = function( msg ) { throw new Error( "Syntax error, unrecognized expression: " + msg ); }; /** * Document sorting and removing duplicates * @param {ArrayLike} results */ Sizzle.uniqueSort = function( results ) { var elem, duplicates = [], j = 0, i = 0; // Unless we *know* we can detect duplicates, assume their presence hasDuplicate = !support.detectDuplicates; sortInput = !support.sortStable && results.slice( 0 ); results.sort( sortOrder ); if ( hasDuplicate ) { while ( (elem = results[i++]) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } } while ( j-- ) { results.splice( duplicates[ j ], 1 ); } } // Clear input after sorting to release objects // See https://github.com/jquery/sizzle/pull/225 sortInput = null; return results; }; /** * Utility function for retrieving the text value of an array of DOM nodes * @param {Array|Element} elem */ getText = Sizzle.getText = function( elem ) { var node, ret = "", i = 0, nodeType = elem.nodeType; if ( !nodeType ) { // If no nodeType, this is expected to be an array while ( (node = elem[i++]) ) { // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); } } } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } // Do not include comment or processing instruction nodes return ret; }; Expr = Sizzle.selectors = { // Can be adjusted by the user cacheLength: 50, createPseudo: markFunction, match: matchExpr, attrHandle: {}, find: {}, relative: { ">": { dir: "parentNode", first: true }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: true }, "~": { dir: "previousSibling" } }, preFilter: { "ATTR": function( match ) { match[1] = match[1].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); if ( match[2] === "~=" ) { match[3] = " " + match[3] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 4 xn-component of xn+y argument ([+-]?\d*n|) 5 sign of xn-component 6 x of xn-component 7 sign of y-component 8 y of y-component */ match[1] = match[1].toLowerCase(); if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument if ( !match[3] ) { Sizzle.error( match[0] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); // other types prohibit arguments } else if ( match[3] ) { Sizzle.error( match[0] ); } return match; }, "PSEUDO": function( match ) { var excess, unquoted = !match[6] && match[2]; if ( matchExpr["CHILD"].test( match[0] ) ) { return null; } // Accept quoted arguments as-is if ( match[3] ) { match[2] = match[4] || match[5] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && // Get excess from tokenize (recursively) (excess = tokenize( unquoted, true )) && // advance to the next closing parenthesis (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { // excess is a negative index match[0] = match[0].slice( 0, excess ); match[2] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) return match.slice( 0, 3 ); } }, filter: { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? function() { return true; } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; }, "CLASS": function( className ) { var pattern = classCache[ className + " " ]; return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); }); }, "ATTR": function( name, operator, check ) { return function( elem ) { var result = Sizzle.attr( elem, name ); if ( result == null ) { return operator === "!="; } if ( !operator ) { return true; } result += ""; return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; }, "CHILD": function( type, what, argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; return first === 1 && last === 0 ? // Shortcut for :nth-*(n) function( elem ) { return !!elem.parentNode; } : function( elem, context, xml ) { var cache, outerCache, node, diff, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType; if ( parent ) { // :(first|last|only)-(child|of-type) if ( simple ) { while ( dir ) { node = elem; while ( (node = node[ dir ]) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } return true; } start = [ forward ? parent.firstChild : parent.lastChild ]; // non-xml :nth-child(...) stores cache data on `parent` if ( forward && useCache ) { // Seek `elem` from a previously-cached index outerCache = parent[ expando ] || (parent[ expando ] = {}); cache = outerCache[ type ] || []; nodeIndex = cache[0] === dirruns && cache[1]; diff = cache[0] === dirruns && cache[2]; node = nodeIndex && parent.childNodes[ nodeIndex ]; while ( (node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start (diff = nodeIndex = 0) || start.pop()) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { outerCache[ type ] = [ dirruns, nodeIndex, diff ]; break; } } // Use previously-cached element index if available } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { diff = cache[1]; // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) } else { // Use the same loop as above to seek `elem` from the start while ( (node = ++nodeIndex && node && node[ dir ] || (diff = nodeIndex = 0) || start.pop()) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { // Cache the index of each encountered element if ( useCache ) { (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; } if ( node === elem ) { break; } } } } // Incorporate the offset, then check against cycle size diff -= last; return diff === first || ( diff % first === 0 && diff / first >= 0 ); } }; }, "PSEUDO": function( pseudo, argument ) { // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos var args, fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || Sizzle.error( "unsupported pseudo: " + pseudo ); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as Sizzle does if ( fn[ expando ] ) { return fn( argument ); } // But maintain support for old signatures if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? markFunction(function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { idx = indexOf( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : function( elem ) { return fn( elem, 0, args ); }; } return fn; } }, pseudos: { // Potentially complex pseudos "not": markFunction(function( selector ) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? markFunction(function( seed, matches, context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { if ( (elem = unmatched[i]) ) { seed[i] = !(matches[i] = elem); } } }) : function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); // Don't keep the element (issue #299) input[0] = null; return !results.pop(); }; }), "has": markFunction(function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; }), "contains": markFunction(function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; }), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value // being equal to the identifier C, // or beginning with the identifier C immediately followed by "-". // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { // lang value must be a valid identifier if ( !ridentifier.test(lang || "") ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { if ( (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); return false; }; }), // Miscellaneous "target": function( elem ) { var hash = window.location && window.location.hash; return hash && hash.slice( 1 ) === elem.id; }, "root": function( elem ) { return elem === docElem; }, "focus": function( elem ) { return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); }, // Boolean properties "enabled": function( elem ) { return elem.disabled === false; }, "disabled": function( elem ) { return elem.disabled === true; }, "checked": function( elem ) { // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); }, "selected": function( elem ) { // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { elem.parentNode.selectedIndex; } return elem.selected === true; }, // Contents "empty": function( elem ) { // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { if ( elem.nodeType < 6 ) { return false; } } return true; }, "parent": function( elem ) { return !Expr.pseudos["empty"]( elem ); }, // Element/input types "header": function( elem ) { return rheader.test( elem.nodeName ); }, "input": function( elem ) { return rinputs.test( elem.nodeName ); }, "button": function( elem ) { var name = elem.nodeName.toLowerCase(); return name === "input" && elem.type === "button" || name === "button"; }, "text": function( elem ) { var attr; return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); }, // Position-in-collection "first": createPositionalPseudo(function() { return [ 0 ]; }), "last": createPositionalPseudo(function( matchIndexes, length ) { return [ length - 1 ]; }), "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; }), "even": createPositionalPseudo(function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "odd": createPositionalPseudo(function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; }), "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; --i >= 0; ) { matchIndexes.push( i ); } return matchIndexes; }), "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; }) } }; Expr.pseudos["nth"] = Expr.pseudos["eq"]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { Expr.pseudos[ i ] = createInputPseudo( i ); } for ( i in { submit: true, reset: true } ) { Expr.pseudos[ i ] = createButtonPseudo( i ); } // Easy API for creating new setFilters function setFilters() {} setFilters.prototype = Expr.filters = Expr.pseudos; Expr.setFilters = new setFilters(); tokenize = Sizzle.tokenize = function( selector, parseOnly ) { var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[ selector + " " ]; if ( cached ) { return parseOnly ? 0 : cached.slice( 0 ); } soFar = selector; groups = []; preFilters = Expr.preFilter; while ( soFar ) { // Comma and first run if ( !matched || (match = rcomma.exec( soFar )) ) { if ( match ) { // Don't consume trailing commas as valid soFar = soFar.slice( match[0].length ) || soFar; } groups.push( (tokens = []) ); } matched = false; // Combinators if ( (match = rcombinators.exec( soFar )) ) { matched = match.shift(); tokens.push({ value: matched, // Cast descendant combinators to space type: match[0].replace( rtrim, " " ) }); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matched = match.shift(); tokens.push({ value: matched, type: type, matches: match }); soFar = soFar.slice( matched.length ); } } if ( !matched ) { break; } } // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens return parseOnly ? soFar.length : soFar ? Sizzle.error( selector ) : // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; function toSelector( tokens ) { var i = 0, len = tokens.length, selector = ""; for ( ; i < len; i++ ) { selector += tokens[i].value; } return selector; } function addCombinator( matcher, combinator, base ) { var dir = combinator.dir, checkNonElements = base && dir === "parentNode", doneName = done++; return combinator.first ? // Check against closest ancestor/preceding element function( elem, context, xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } } } : // Check against all ancestor/preceding elements function( elem, context, xml ) { var oldCache, outerCache, newCache = [ dirruns, doneName ]; // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching if ( xml ) { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; } } } } else { while ( (elem = elem[ dir ]) ) { if ( elem.nodeType === 1 || checkNonElements ) { outerCache = elem[ expando ] || (elem[ expando ] = {}); if ( (oldCache = outerCache[ dir ]) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements return (newCache[ 2 ] = oldCache[ 2 ]); } else { // Reuse newcache so results back-propagate to previous elements outerCache[ dir ] = newCache; // A match means we're done; a fail means we have to keep checking if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { return true; } } } } } }; } function elementMatcher( matchers ) { return matchers.length > 1 ? function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { if ( !matchers[i]( elem, context, xml ) ) { return false; } } return true; } : matchers[0]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { Sizzle( selector, contexts[i], results ); } return results; } function condense( unmatched, map, filter, context, xml ) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; for ( ; i < len; i++ ) { if ( (elem = unmatched[i]) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { map.push( i ); } } } } return newUnmatched; } function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { if ( postFilter && !postFilter[ expando ] ) { postFilter = setMatcher( postFilter ); } if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } return markFunction(function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? condense( elems, preMap, preFilter, context, xml ) : elems, matcherOut = matcher ? // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? // ...intermediate processing is necessary [] : // ...otherwise use results directly results : matcherIn; // Find primary matches if ( matcher ) { matcher( matcherIn, matcherOut, context, xml ); } // Apply postFilter if ( postFilter ) { temp = condense( matcherOut, postMap ); postFilter( temp, [], context, xml ); // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { if ( (elem = temp[i]) ) { matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); } } } if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) ) { // Restore matcherIn since elem is not yet a final match temp.push( (matcherIn[i] = elem) ); } } postFinder( null, (matcherOut = []), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } } } // Add elements to results, through postFinder if defined } else { matcherOut = condense( matcherOut === results ? matcherOut.splice( preexisting, matcherOut.length ) : matcherOut ); if ( postFinder ) { postFinder( null, results, matcherOut, xml ); } else { push.apply( results, matcherOut ); } } }); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[ tokens[0].type ], implicitRelative = leadingRelative || Expr.relative[" "], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) matchContext = addCombinator( function( elem ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { if ( (matcher = Expr.relative[ tokens[i].type ]) ) { matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; } else { matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { if ( Expr.relative[ tokens[j].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( // If the preceding token was a descendant combinator, insert an implicit any-element `*` tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), j < len && toSelector( tokens ) ); } matchers.push( matcher ); } } return elementMatcher( matchers ); } function matcherFromGroupMatchers( elementMatchers, setMatchers ) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function( seed, context, xml, results, outermost ) { var elem, j, matcher, matchedCount = 0, i = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, // We must always have either seed elements or outermost context elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), // Use integer dirruns iff this is the outermost matcher dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), len = elems.length; if ( outermost ) { outermostContext = context !== document && context; } // Add elements passing elementMatchers directly to results // Keep `i` a string if there are no elements so `matchedCount` will be "00" below // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id for ( ; i !== len && (elem = elems[i]) != null; i++ ) { if ( byElement && elem ) { j = 0; while ( (matcher = elementMatchers[j++]) ) { if ( matcher( elem, context, xml ) ) { results.push( elem ); break; } } if ( outermost ) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters if ( bySet ) { // They will have gone through all possible matchers if ( (elem = !matcher && elem) ) { matchedCount--; } // Lengthen the array for every element, matched or not if ( seed ) { unmatched.push( elem ); } } } // Apply set filters to unmatched elements matchedCount += i; if ( bySet && i !== matchedCount ) { j = 0; while ( (matcher = setMatchers[j++]) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { if ( !(unmatched[i] || setMatched[i]) ) { setMatched[i] = pop.call( results ); } } } // Discard index placeholder values to get only actual matches setMatched = condense( setMatched ); } // Add matches to results push.apply( results, setMatched ); // Seedless set matches succeeding multiple successful matchers stipulate sorting if ( outermost && !seed && setMatched.length > 0 && ( matchedCount + setMatchers.length ) > 1 ) { Sizzle.uniqueSort( results ); } } // Override manipulation of globals by nested matchers if ( outermost ) { dirruns = dirrunsUnique; outermostContext = contextBackup; } return unmatched; }; return bySet ? markFunction( superMatcher ) : superMatcher; } compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { var i, setMatchers = [], elementMatchers = [], cached = compilerCache[ selector + " " ]; if ( !cached ) { // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { cached = matcherFromTokens( match[i] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { elementMatchers.push( cached ); } } // Cache the compiled function cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); // Save selector and tokenization cached.selector = selector; } return cached; }; /** * A low-level selection function that works with Sizzle's compiled * selector functions * @param {String|Function} selector A selector or a pre-compiled * selector function built with Sizzle.compile * @param {Element} context * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize( (selector = compiled.selector || selector) ); results = results || []; // Try to minimize operations if there is no seed and only one group if ( match.length === 1 ) { // Take a shortcut and set the context if the root selector is an ID tokens = match[0] = match[0].slice( 0 ); if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; if ( !context ) { return results; // Precompiled matchers will still verify ancestry, so step up a level } else if ( compiled ) { context = context.parentNode; } selector = selector.slice( tokens.shift().value.length ); } // Fetch a seed set for right-to-left matching i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; while ( i-- ) { token = tokens[i]; // Abort if we hit a combinator if ( Expr.relative[ (type = token.type) ] ) { break; } if ( (find = Expr.find[ type ]) ) { // Search, expanding context for leading sibling combinators if ( (seed = find( token.matches[0].replace( runescape, funescape ), rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context )) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); selector = seed.length && toSelector( tokens ); if ( !selector ) { push.apply( results, seed ); return results; } break; } } } } // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above ( compiled || compile( selector, match ) )( seed, context, !documentIsHTML, results, rsibling.test( selector ) && testContext( context.parentNode ) || context ); return results; }; // One-time assignments // Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; // Initialize against the default document setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* support.sortDetached = assert(function( div1 ) { // Should return 1, but returns 4 (following) return div1.compareDocumentPosition( document.createElement("div") ) & 1; }); // Support: IE<8 // Prevent attribute/property "interpolation" // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx if ( !assert(function( div ) { div.innerHTML = ""; return div.firstChild.getAttribute("href") === "#" ; }) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } }); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") if ( !support.attributes || !assert(function( div ) { div.innerHTML = ""; div.firstChild.setAttribute( "value", "" ); return div.firstChild.getAttribute( "value" ) === ""; }) ) { addHandle( "value", function( elem, name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } }); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies if ( !assert(function( div ) { return div.getAttribute("disabled") == null; }) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : (val = elem.getAttributeNode( name )) && val.specified ? val.value : null; } }); } return Sizzle; })( window ); jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.pseudos; jQuery.unique = Sizzle.uniqueSort; jQuery.text = Sizzle.getText; jQuery.isXMLDoc = Sizzle.isXML; jQuery.contains = Sizzle.contains; var rneedsContext = jQuery.expr.match.needsContext; var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); var risSimple = /^.[^:#\[\.,]*$/; // Implement the identical functionality for filter and not function winnow( elements, qualifier, not ) { if ( jQuery.isFunction( qualifier ) ) { return jQuery.grep( elements, function( elem, i ) { /* jshint -W018 */ return !!qualifier.call( elem, i, elem ) !== not; }); } if ( qualifier.nodeType ) { return jQuery.grep( elements, function( elem ) { return ( elem === qualifier ) !== not; }); } if ( typeof qualifier === "string" ) { if ( risSimple.test( qualifier ) ) { return jQuery.filter( qualifier, elements, not ); } qualifier = jQuery.filter( qualifier, elements ); } return jQuery.grep( elements, function( elem ) { return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; }); } jQuery.filter = function( expr, elems, not ) { var elem = elems[ 0 ]; if ( not ) { expr = ":not(" + expr + ")"; } return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { return elem.nodeType === 1; })); }; jQuery.fn.extend({ find: function( selector ) { var i, ret = [], self = this, len = self.length; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter(function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( self[ i ], this ) ) { return true; } } }) ); } for ( i = 0; i < len; i++ ) { jQuery.find( selector, self[ i ], ret ); } // Needed because $( selector, context ) becomes $( context ).find( selector ) ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); ret.selector = this.selector ? this.selector + " " + selector : selector; return ret; }, filter: function( selector ) { return this.pushStack( winnow(this, selector || [], false) ); }, not: function( selector ) { return this.pushStack( winnow(this, selector || [], true) ); }, is: function( selector ) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". typeof selector === "string" && rneedsContext.test( selector ) ? jQuery( selector ) : selector || [], false ).length; } }); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, // Use the correct document accordingly with window argument (sandbox) document = window.document, // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, init = jQuery.fn.init = function( selector, context ) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) if ( !selector ) { return this; } // Handle HTML strings if ( typeof selector === "string" ) { if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; } else { match = rquickExpr.exec( selector ); } // Match html or make sure no context is specified for #id if ( match && (match[1] || !context) ) { // HANDLE: $(html) -> $(array) if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; // scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[1], context && context.nodeType ? context.ownerDocument || context : document, true ) ); // HANDLE: $(html, props) if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { for ( match in context ) { // Properties of context are called as methods if possible if ( jQuery.isFunction( this[ match ] ) ) { this[ match ]( context[ match ] ); // ...and otherwise set as attributes } else { this.attr( match, context[ match ] ); } } } return this; // HANDLE: $(#id) } else { elem = document.getElementById( match[2] ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 if ( elem && elem.parentNode ) { // Handle the case where IE and Opera return items // by name instead of ID if ( elem.id !== match[2] ) { return rootjQuery.find( selector ); } // Otherwise, we inject the element directly into the jQuery object this.length = 1; this[0] = elem; } this.context = document; this.selector = selector; return this; } // HANDLE: $(expr, $(...)) } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { return this.constructor( context ).find( selector ); } // HANDLE: $(DOMElement) } else if ( selector.nodeType ) { this.context = this[0] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready } else if ( jQuery.isFunction( selector ) ) { return typeof rootjQuery.ready !== "undefined" ? rootjQuery.ready( selector ) : // Execute immediately if ready is not present selector( jQuery ); } if ( selector.selector !== undefined ) { this.selector = selector.selector; this.context = selector.context; } return jQuery.makeArray( selector, this ); }; // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, // methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, next: true, prev: true }; jQuery.extend({ dir: function( elem, dir, until ) { var matched = [], cur = elem[ dir ]; while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { if ( cur.nodeType === 1 ) { matched.push( cur ); } cur = cur[dir]; } return matched; }, sibling: function( n, elem ) { var r = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { r.push( n ); } } return r; } }); jQuery.fn.extend({ has: function( target ) { var i, targets = jQuery( target, this ), len = targets.length; return this.filter(function() { for ( i = 0; i < len; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } } }); }, closest: function( selectors, context ) { var cur, i = 0, l = this.length, matched = [], pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? jQuery( selectors, context || this.context ) : 0; for ( ; i < l; i++ ) { for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { // Always skip document fragments if ( cur.nodeType < 11 && (pos ? pos.index(cur) > -1 : // Don't pass non-elements to Sizzle cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors)) ) { matched.push( cur ); break; } } } return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); }, // Determine the position of an element within // the matched set of elements index: function( elem ) { // No argument, return index in parent if ( !elem ) { return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; } // index in selector if ( typeof elem === "string" ) { return jQuery.inArray( this[0], jQuery( elem ) ); } // Locate the position of the desired element return jQuery.inArray( // If it receives a jQuery object, the first element is used elem.jquery ? elem[0] : elem, this ); }, add: function( selector, context ) { return this.pushStack( jQuery.unique( jQuery.merge( this.get(), jQuery( selector, context ) ) ) ); }, addBack: function( selector ) { return this.add( selector == null ? this.prevObject : this.prevObject.filter(selector) ); } }); function sibling( cur, dir ) { do { cur = cur[ dir ]; } while ( cur && cur.nodeType !== 1 ); return cur; } jQuery.each({ parent: function( elem ) { var parent = elem.parentNode; return parent && parent.nodeType !== 11 ? parent : null; }, parents: function( elem ) { return jQuery.dir( elem, "parentNode" ); }, parentsUntil: function( elem, i, until ) { return jQuery.dir( elem, "parentNode", until ); }, next: function( elem ) { return sibling( elem, "nextSibling" ); }, prev: function( elem ) { return sibling( elem, "previousSibling" ); }, nextAll: function( elem ) { return jQuery.dir( elem, "nextSibling" ); }, prevAll: function( elem ) { return jQuery.dir( elem, "previousSibling" ); }, nextUntil: function( elem, i, until ) { return jQuery.dir( elem, "nextSibling", until ); }, prevUntil: function( elem, i, until ) { return jQuery.dir( elem, "previousSibling", until ); }, siblings: function( elem ) { return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); }, children: function( elem ) { return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { return jQuery.nodeName( elem, "iframe" ) ? elem.contentDocument || elem.contentWindow.document : jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { var ret = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { ret = jQuery.filter( selector, ret ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { ret = jQuery.unique( ret ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { ret = ret.reverse(); } } return this.pushStack( ret ); }; }); var rnotwhite = (/\S+/g); // String to Object options format cache var optionsCache = {}; // Convert String-formatted options into Object-formatted ones and store in cache function createOptions( options ) { var object = optionsCache[ options ] = {}; jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { object[ flag ] = true; }); return object; } /* * Create a callback list using the following parameters: * * options: an optional list of space-separated options that will change how * the callback list behaves or a more traditional option object * * By default a callback list will act like an event callback list and can be * "fired" multiple times. * * Possible options: * * once: will ensure the callback list can only be fired once (like a Deferred) * * memory: will keep track of previous values and will call any callback added * after the list has been fired right away with the latest "memorized" * values (like a Deferred) * * unique: will ensure a callback can only be added once (no duplicate in the list) * * stopOnFalse: interrupt callings when a callback returns false * */ jQuery.Callbacks = function( options ) { // Convert options from String-formatted to Object-formatted if needed // (we check in cache first) options = typeof options === "string" ? ( optionsCache[ options ] || createOptions( options ) ) : jQuery.extend( {}, options ); var // Flag to know if list is currently firing firing, // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, // First callback to fire (used internally by add and fireWith) firingStart, // Actual callback list list = [], // Stack of fire calls for repeatable lists stack = !options.once && [], // Fire callbacks fire = function( data ) { memory = options.memory && data; fired = true; firingIndex = firingStart || 0; firingStart = 0; firingLength = list.length; firing = true; for ( ; list && firingIndex < firingLength; firingIndex++ ) { if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { memory = false; // To prevent further calls using add break; } } firing = false; if ( list ) { if ( stack ) { if ( stack.length ) { fire( stack.shift() ); } } else if ( memory ) { list = []; } else { self.disable(); } } }, // Actual Callbacks object self = { // Add a callback or a collection of callbacks to the list add: function() { if ( list ) { // First, we save the current length var start = list.length; (function add( args ) { jQuery.each( args, function( _, arg ) { var type = jQuery.type( arg ); if ( type === "function" ) { if ( !options.unique || !self.has( arg ) ) { list.push( arg ); } } else if ( arg && arg.length && type !== "string" ) { // Inspect recursively add( arg ); } }); })( arguments ); // Do we need to add the callbacks to the // current firing batch? if ( firing ) { firingLength = list.length; // With memory, if we're not firing then // we should call right away } else if ( memory ) { firingStart = start; fire( memory ); } } return this; }, // Remove a callback from the list remove: function() { if ( list ) { jQuery.each( arguments, function( _, arg ) { var index; while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { list.splice( index, 1 ); // Handle firing indexes if ( firing ) { if ( index <= firingLength ) { firingLength--; } if ( index <= firingIndex ) { firingIndex--; } } } }); } return this; }, // Check if a given callback is in the list. // If no argument is given, return whether or not list has callbacks attached. has: function( fn ) { return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); }, // Remove all callbacks from the list empty: function() { list = []; firingLength = 0; return this; }, // Have the list do nothing anymore disable: function() { list = stack = memory = undefined; return this; }, // Is it disabled? disabled: function() { return !list; }, // Lock the list in its current state lock: function() { stack = undefined; if ( !memory ) { self.disable(); } return this; }, // Is it locked? locked: function() { return !stack; }, // Call all callbacks with the given context and arguments fireWith: function( context, args ) { if ( list && ( !fired || stack ) ) { args = args || []; args = [ context, args.slice ? args.slice() : args ]; if ( firing ) { stack.push( args ); } else { fire( args ); } } return this; }, // Call all the callbacks with the given arguments fire: function() { self.fireWith( this, arguments ); return this; }, // To know if the callbacks have already been called at least once fired: function() { return !!fired; } }; return self; }; jQuery.extend({ Deferred: function( func ) { var tuples = [ // action, add listener, listener list, final state [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], [ "notify", "progress", jQuery.Callbacks("memory") ] ], state = "pending", promise = { state: function() { return state; }, always: function() { deferred.done( arguments ).fail( arguments ); return this; }, then: function( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred(function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; // deferred[ done | fail | progress ] for forwarding actions to newDefer deferred[ tuple[1] ](function() { var returned = fn && fn.apply( this, arguments ); if ( returned && jQuery.isFunction( returned.promise ) ) { returned.promise() .done( newDefer.resolve ) .fail( newDefer.reject ) .progress( newDefer.notify ); } else { newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); } }); }); fns = null; }).promise(); }, // Get a promise for this deferred // If obj is provided, the promise aspect is added to the object promise: function( obj ) { return obj != null ? jQuery.extend( obj, promise ) : promise; } }, deferred = {}; // Keep pipe for back-compat promise.pipe = promise.then; // Add list-specific methods jQuery.each( tuples, function( i, tuple ) { var list = tuple[ 2 ], stateString = tuple[ 3 ]; // promise[ done | fail | progress ] = list.add promise[ tuple[1] ] = list.add; // Handle state if ( stateString ) { list.add(function() { // state = [ resolved | rejected ] state = stateString; // [ reject_list | resolve_list ].disable; progress_list.lock }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); } // deferred[ resolve | reject | notify ] deferred[ tuple[0] ] = function() { deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); return this; }; deferred[ tuple[0] + "With" ] = list.fireWith; }); // Make the deferred a promise promise.promise( deferred ); // Call given func if any if ( func ) { func.call( deferred, deferred ); } // All done! return deferred; }, // Deferred helper when: function( subordinate /* , ..., subordinateN */ ) { var i = 0, resolveValues = slice.call( arguments ), length = resolveValues.length, // the count of uncompleted subordinates remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, // the master Deferred. If resolveValues consist of only a single Deferred, just use that. deferred = remaining === 1 ? subordinate : jQuery.Deferred(), // Update function for both resolve and progress values updateFunc = function( i, contexts, values ) { return function( value ) { contexts[ i ] = this; values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( values === progressValues ) { deferred.notifyWith( contexts, values ); } else if ( !(--remaining) ) { deferred.resolveWith( contexts, values ); } }; }, progressValues, progressContexts, resolveContexts; // add listeners to Deferred subordinates; treat others as resolved if ( length > 1 ) { progressValues = new Array( length ); progressContexts = new Array( length ); resolveContexts = new Array( length ); for ( ; i < length; i++ ) { if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { resolveValues[ i ].promise() .done( updateFunc( i, resolveContexts, resolveValues ) ) .fail( deferred.reject ) .progress( updateFunc( i, progressContexts, progressValues ) ); } else { --remaining; } } } // if we're not waiting on anything, resolve the master if ( !remaining ) { deferred.resolveWith( resolveContexts, resolveValues ); } return deferred.promise(); } }); // The deferred used on DOM ready var readyList; jQuery.fn.ready = function( fn ) { // Add the callback jQuery.ready.promise().done( fn ); return this; }; jQuery.extend({ // Is the DOM ready to be used? Set to true once it occurs. isReady: false, // A counter to track how many items to wait for before // the ready event fires. See #6781 readyWait: 1, // Hold (or release) the ready event holdReady: function( hold ) { if ( hold ) { jQuery.readyWait++; } else { jQuery.ready( true ); } }, // Handle when the DOM is ready ready: function( wait ) { // Abort if there are pending holds or we're already ready if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { return; } // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready ); } // Remember that the DOM is ready jQuery.isReady = true; // If a normal DOM Ready event fired, decrement, and wait if need be if ( wait !== true && --jQuery.readyWait > 0 ) { return; } // If there are functions bound, to execute readyList.resolveWith( document, [ jQuery ] ); // Trigger any bound ready events if ( jQuery.fn.triggerHandler ) { jQuery( document ).triggerHandler( "ready" ); jQuery( document ).off( "ready" ); } } }); /** * Clean-up method for dom ready events */ function detach() { if ( document.addEventListener ) { document.removeEventListener( "DOMContentLoaded", completed, false ); window.removeEventListener( "load", completed, false ); } else { document.detachEvent( "onreadystatechange", completed ); window.detachEvent( "onload", completed ); } } /** * The ready event handler and self cleanup method */ function completed() { // readyState === "complete" is good enough for us to call the dom ready in oldIE if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { detach(); jQuery.ready(); } } jQuery.ready.promise = function( obj ) { if ( !readyList ) { readyList = jQuery.Deferred(); // Catch cases where $(document).ready() is called after the browser event has already occurred. // we once tried to use readyState "interactive" here, but it caused issues like the one // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready setTimeout( jQuery.ready ); // Standards-based browsers support DOMContentLoaded } else if ( document.addEventListener ) { // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed, false ); // If IE event model is used } else { // Ensure firing before onload, maybe late but safe also for iframes document.attachEvent( "onreadystatechange", completed ); // A fallback to window.onload, that will always work window.attachEvent( "onload", completed ); // If IE and not a frame // continually check to see if the document is ready var top = false; try { top = window.frameElement == null && document.documentElement; } catch(e) {} if ( top && top.doScroll ) { (function doScrollCheck() { if ( !jQuery.isReady ) { try { // Use the trick by Diego Perini // http://javascript.nwbox.com/IEContentLoaded/ top.doScroll("left"); } catch(e) { return setTimeout( doScrollCheck, 50 ); } // detach all dom ready events detach(); // and execute any waiting functions jQuery.ready(); } })(); } } } return readyList.promise( obj ); }; var strundefined = typeof undefined; // Support: IE<9 // Iteration over object's inherited properties before its own var i; for ( i in jQuery( support ) ) { break; } support.ownLast = i !== "0"; // Note: most support tests are defined in their respective modules. // false until the test is run support.inlineBlockNeedsLayout = false; // Execute ASAP in case we need to set body.style.zoom jQuery(function() { // Minified: var a,b,c,d var val, div, body, container; body = document.getElementsByTagName( "body" )[ 0 ]; if ( !body || !body.style ) { // Return for frameset docs that don't have a body return; } // Setup div = document.createElement( "div" ); container = document.createElement( "div" ); container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; body.appendChild( container ).appendChild( div ); if ( typeof div.style.zoom !== strundefined ) { // Support: IE<8 // Check if natively block-level elements act like inline-block // elements when setting their display to 'inline' and giving // them layout div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; if ( val ) { // Prevent IE 6 from affecting layout for positioned elements #11048 // Prevent IE from shrinking the body in IE 7 mode #12869 // Support: IE<8 body.style.zoom = 1; } } body.removeChild( container ); }); (function() { var div = document.createElement( "div" ); // Execute the test only if not already executed in another module. if (support.deleteExpando == null) { // Support: IE<9 support.deleteExpando = true; try { delete div.test; } catch( e ) { support.deleteExpando = false; } } // Null elements to avoid leaks in IE. div = null; })(); /** * Determines whether an object can have data */ jQuery.acceptData = function( elem ) { var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], nodeType = +elem.nodeType || 1; // Do not set data on non-element DOM nodes because it will not be cleared (#8335). return nodeType !== 1 && nodeType !== 9 ? false : // Nodes accept data unless otherwise specified; rejection can be conditional !noData || noData !== true && elem.getAttribute("classid") === noData; }; var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /([A-Z])/g; function dataAttr( elem, key, data ) { // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { try { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : // Only convert to a number if it doesn't change the string +data + "" === data ? +data : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} // Make sure we set the data so it isn't changed later jQuery.data( elem, key, data ); } else { data = undefined; } } return data; } // checks a cache object for emptiness function isEmptyDataObject( obj ) { var name; for ( name in obj ) { // if the public data object is empty, the private is still empty if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { continue; } if ( name !== "toJSON" ) { return false; } } return true; } function internalData( elem, name, data, pvt /* Internal Use Only */ ) { if ( !jQuery.acceptData( elem ) ) { return; } var ret, thisCache, internalKey = jQuery.expando, // We have to handle DOM nodes and JS objects differently because IE6-7 // can't GC object references properly across the DOM-JS boundary isNode = elem.nodeType, // Only DOM nodes need the global jQuery cache; JS object data is // attached directly to the object so GC can occur automatically cache = isNode ? jQuery.cache : elem, // Only defining an ID for JS objects if its cache already exists allows // the code to shortcut on the same path as a DOM node with no cache id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; // Avoid doing any more work than we need to when trying to get data on an // object that has no data at all if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { return; } if ( !id ) { // Only DOM nodes need a new unique ID for each element since their data // ends up in the global cache if ( isNode ) { id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; } else { id = internalKey; } } if ( !cache[ id ] ) { // Avoid exposing jQuery metadata on plain JS objects when the object // is serialized using JSON.stringify cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; } // An object can be passed to jQuery.data instead of a key/value pair; this gets // shallow copied over onto the existing cache if ( typeof name === "object" || typeof name === "function" ) { if ( pvt ) { cache[ id ] = jQuery.extend( cache[ id ], name ); } else { cache[ id ].data = jQuery.extend( cache[ id ].data, name ); } } thisCache = cache[ id ]; // jQuery data() is stored in a separate object inside the object's internal data // cache in order to avoid key collisions between internal data and user-defined // data. if ( !pvt ) { if ( !thisCache.data ) { thisCache.data = {}; } thisCache = thisCache.data; } if ( data !== undefined ) { thisCache[ jQuery.camelCase( name ) ] = data; } // Check for both converted-to-camel and non-converted data property names // If a data property was specified if ( typeof name === "string" ) { // First Try to find as-is property data ret = thisCache[ name ]; // Test for null|undefined property data if ( ret == null ) { // Try to find the camelCased property ret = thisCache[ jQuery.camelCase( name ) ]; } } else { ret = thisCache; } return ret; } function internalRemoveData( elem, name, pvt ) { if ( !jQuery.acceptData( elem ) ) { return; } var thisCache, i, isNode = elem.nodeType, // See jQuery.data for more information cache = isNode ? jQuery.cache : elem, id = isNode ? elem[ jQuery.expando ] : jQuery.expando; // If there is already no cache entry for this object, there is no // purpose in continuing if ( !cache[ id ] ) { return; } if ( name ) { thisCache = pvt ? cache[ id ] : cache[ id ].data; if ( thisCache ) { // Support array or space separated string names for data keys if ( !jQuery.isArray( name ) ) { // try the string as a key before any manipulation if ( name in thisCache ) { name = [ name ]; } else { // split the camel cased version by spaces unless a key with the spaces exists name = jQuery.camelCase( name ); if ( name in thisCache ) { name = [ name ]; } else { name = name.split(" "); } } } else { // If "name" is an array of keys... // When data is initially created, via ("key", "val") signature, // keys will be converted to camelCase. // Since there is no way to tell _how_ a key was added, remove // both plain key and camelCase key. #12786 // This will only penalize the array argument path. name = name.concat( jQuery.map( name, jQuery.camelCase ) ); } i = name.length; while ( i-- ) { delete thisCache[ name[i] ]; } // If there is no data left in the cache, we want to continue // and let the cache object itself get destroyed if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { return; } } } // See jQuery.data for more information if ( !pvt ) { delete cache[ id ].data; // Don't destroy the parent cache unless the internal data object // had been the only thing left in it if ( !isEmptyDataObject( cache[ id ] ) ) { return; } } // Destroy the cache if ( isNode ) { jQuery.cleanData( [ elem ], true ); // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) /* jshint eqeqeq: false */ } else if ( support.deleteExpando || cache != cache.window ) { /* jshint eqeqeq: true */ delete cache[ id ]; // When all else fails, null } else { cache[ id ] = null; } } jQuery.extend({ cache: {}, // The following elements (space-suffixed to avoid Object.prototype collisions) // throw uncatchable exceptions if you attempt to set expando properties noData: { "applet ": true, "embed ": true, // ...but Flash objects (which have this classid) *can* handle expandos "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" }, hasData: function( elem ) { elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; return !!elem && !isEmptyDataObject( elem ); }, data: function( elem, name, data ) { return internalData( elem, name, data ); }, removeData: function( elem, name ) { return internalRemoveData( elem, name ); }, // For internal use only. _data: function( elem, name, data ) { return internalData( elem, name, data, true ); }, _removeData: function( elem, name ) { return internalRemoveData( elem, name, true ); } }); jQuery.fn.extend({ data: function( key, value ) { var i, name, data, elem = this[0], attrs = elem && elem.attributes; // Special expections of .data basically thwart jQuery.access, // so implement the relevant behavior ourselves // Gets all values if ( key === undefined ) { if ( this.length ) { data = jQuery.data( elem ); if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { i = attrs.length; while ( i-- ) { // Support: IE11+ // The attrs elements can be null (#14894) if ( attrs[ i ] ) { name = attrs[ i ].name; if ( name.indexOf( "data-" ) === 0 ) { name = jQuery.camelCase( name.slice(5) ); dataAttr( elem, name, data[ name ] ); } } } jQuery._data( elem, "parsedAttrs", true ); } } return data; } // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { jQuery.data( this, key ); }); } return arguments.length > 1 ? // Sets one value this.each(function() { jQuery.data( this, key, value ); }) : // Gets one value // Try to fetch any internally stored data first elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; }, removeData: function( key ) { return this.each(function() { jQuery.removeData( this, key ); }); } }); jQuery.extend({ queue: function( elem, type, data ) { var queue; if ( elem ) { type = ( type || "fx" ) + "queue"; queue = jQuery._data( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { if ( !queue || jQuery.isArray(data) ) { queue = jQuery._data( elem, type, jQuery.makeArray(data) ); } else { queue.push( data ); } } return queue || []; } }, dequeue: function( elem, type ) { type = type || "fx"; var queue = jQuery.queue( elem, type ), startLength = queue.length, fn = queue.shift(), hooks = jQuery._queueHooks( elem, type ), next = function() { jQuery.dequeue( elem, type ); }; // If the fx queue is dequeued, always remove the progress sentinel if ( fn === "inprogress" ) { fn = queue.shift(); startLength--; } if ( fn ) { // Add a progress sentinel to prevent the fx queue from being // automatically dequeued if ( type === "fx" ) { queue.unshift( "inprogress" ); } // clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } if ( !startLength && hooks ) { hooks.empty.fire(); } }, // not intended for public consumption - generates a queueHooks object, or returns the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; return jQuery._data( elem, key ) || jQuery._data( elem, key, { empty: jQuery.Callbacks("once memory").add(function() { jQuery._removeData( elem, type + "queue" ); jQuery._removeData( elem, key ); }) }); } }); jQuery.fn.extend({ queue: function( type, data ) { var setter = 2; if ( typeof type !== "string" ) { data = type; type = "fx"; setter--; } if ( arguments.length < setter ) { return jQuery.queue( this[0], type ); } return data === undefined ? this : this.each(function() { var queue = jQuery.queue( this, type, data ); // ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[0] !== "inprogress" ) { jQuery.dequeue( this, type ); } }); }, dequeue: function( type ) { return this.each(function() { jQuery.dequeue( this, type ); }); }, clearQueue: function( type ) { return this.queue( type || "fx", [] ); }, // Get a promise resolved when queues of a certain type // are emptied (fx is the type by default) promise: function( type, obj ) { var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() { if ( !( --count ) ) { defer.resolveWith( elements, [ elements ] ); } }; if ( typeof type !== "string" ) { obj = type; type = undefined; } type = type || "fx"; while ( i-- ) { tmp = jQuery._data( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); } } resolve(); return defer.promise( obj ); } }); var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; var isHidden = function( elem, el ) { // isHidden might be called from jQuery#filter function; // in that case, element will be second argument elem = el || elem; return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); }; // Multifunctional method to get and set values of a collection // The value/s can optionally be executed if it's a function var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { var i = 0, length = elems.length, bulk = key == null; // Sets many values if ( jQuery.type( key ) === "object" ) { chainable = true; for ( i in key ) { jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); } // Sets one value } else if ( value !== undefined ) { chainable = true; if ( !jQuery.isFunction( value ) ) { raw = true; } if ( bulk ) { // Bulk operations run against the entire set if ( raw ) { fn.call( elems, value ); fn = null; // ...except when executing function values } else { bulk = fn; fn = function( elem, key, value ) { return bulk.call( jQuery( elem ), value ); }; } } if ( fn ) { for ( ; i < length; i++ ) { fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); } } } return chainable ? elems : // Gets bulk ? fn.call( elems ) : length ? fn( elems[0], key ) : emptyGet; }; var rcheckableType = (/^(?:checkbox|radio)$/i); (function() { // Minified: var a,b,c var input = document.createElement( "input" ), div = document.createElement( "div" ), fragment = document.createDocumentFragment(); // Setup div.innerHTML = "
    a"; // IE strips leading whitespace when .innerHTML is used support.leadingWhitespace = div.firstChild.nodeType === 3; // Make sure that tbody elements aren't automatically inserted // IE will insert them into empty tables support.tbody = !div.getElementsByTagName( "tbody" ).length; // Make sure that link elements get serialized correctly by innerHTML // This requires a wrapper element in IE support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; // Makes sure cloning an html5 element does not cause problems // Where outerHTML is undefined, this still works support.html5Clone = document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; // Check if a disconnected checkbox will retain its checked // value of true after appended to the DOM (IE6/7) input.type = "checkbox"; input.checked = true; fragment.appendChild( input ); support.appendChecked = input.checked; // Make sure textarea (and checkbox) defaultValue is properly cloned // Support: IE6-IE11+ div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; // #11217 - WebKit loses check when the name is after the checked attribute fragment.appendChild( div ); div.innerHTML = ""; // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 // old WebKit doesn't clone checked state correctly in fragments support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; // Support: IE<9 // Opera does not clone events (and typeof div.attachEvent === undefined). // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() support.noCloneEvent = true; if ( div.attachEvent ) { div.attachEvent( "onclick", function() { support.noCloneEvent = false; }); div.cloneNode( true ).click(); } // Execute the test only if not already executed in another module. if (support.deleteExpando == null) { // Support: IE<9 support.deleteExpando = true; try { delete div.test; } catch( e ) { support.deleteExpando = false; } } })(); (function() { var i, eventName, div = document.createElement( "div" ); // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) for ( i in { submit: true, change: true, focusin: true }) { eventName = "on" + i; if ( !(support[ i + "Bubbles" ] = eventName in window) ) { // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) div.setAttribute( eventName, "t" ); support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; } } // Null elements to avoid leaks in IE. div = null; })(); var rformElems = /^(?:input|select|textarea)$/i, rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; function returnTrue() { return true; } function returnFalse() { return false; } function safeActiveElement() { try { return document.activeElement; } catch ( err ) { } } /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { var tmp, events, t, handleObjIn, special, eventHandle, handleObj, handlers, type, namespaces, origType, elemData = jQuery._data( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { return; } // Caller can pass in an object of custom data in lieu of the handler if ( handler.handler ) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; } // Make sure that the handler has a unique ID, used to find/remove it later if ( !handler.guid ) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first if ( !(events = elemData.events) ) { events = elemData.events = {}; } if ( !(eventHandle = elemData.handle) ) { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined; }; // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events eventHandle.elem = elem; } // Handle multiple events separated by a space types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); // There *must* be a type, no attaching namespace-only handlers if ( !type ) { continue; } // If event changes its type, use the special event handlers for the changed type special = jQuery.event.special[ type ] || {}; // If selector defined, determine special event api type, otherwise given type type = ( selector ? special.delegateType : special.bindType ) || type; // Update special based on newly reset type special = jQuery.event.special[ type ] || {}; // handleObj is passed to all event handlers handleObj = jQuery.extend({ type: type, origType: origType, data: data, handler: handler, guid: handler.guid, selector: selector, needsContext: selector && jQuery.expr.match.needsContext.test( selector ), namespace: namespaces.join(".") }, handleObjIn ); // Init the event handler queue if we're the first if ( !(handlers = events[ type ]) ) { handlers = events[ type ] = []; handlers.delegateCount = 0; // Only use addEventListener/attachEvent if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); } else if ( elem.attachEvent ) { elem.attachEvent( "on" + type, eventHandle ); } } } if ( special.add ) { special.add.call( elem, handleObj ); if ( !handleObj.handler.guid ) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front if ( selector ) { handlers.splice( handlers.delegateCount++, 0, handleObj ); } else { handlers.push( handleObj ); } // Keep track of which events have ever been used, for event optimization jQuery.event.global[ type ] = true; } // Nullify elem to prevent memory leaks in IE elem = null; }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { var j, handleObj, tmp, origCount, t, events, special, handlers, type, namespaces, origType, elemData = jQuery.hasData( elem ) && jQuery._data( elem ); if ( !elemData || !(events = elemData.events) ) { return; } // Once for each type.namespace in types; type may be omitted types = ( types || "" ).match( rnotwhite ) || [ "" ]; t = types.length; while ( t-- ) { tmp = rtypenamespace.exec( types[t] ) || []; type = origType = tmp[1]; namespaces = ( tmp[2] || "" ).split( "." ).sort(); // Unbind all events (on this namespace, if provided) for the element if ( !type ) { for ( type in events ) { jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); } continue; } special = jQuery.event.special[ type ] || {}; type = ( selector ? special.delegateType : special.bindType ) || type; handlers = events[ type ] || []; tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); // Remove matching events origCount = j = handlers.length; while ( j-- ) { handleObj = handlers[ j ]; if ( ( mappedTypes || origType === handleObj.origType ) && ( !handler || handler.guid === handleObj.guid ) && ( !tmp || tmp.test( handleObj.namespace ) ) && ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { handlers.splice( j, 1 ); if ( handleObj.selector ) { handlers.delegateCount--; } if ( special.remove ) { special.remove.call( elem, handleObj ); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) if ( origCount && !handlers.length ) { if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { jQuery.removeEvent( elem, type, elemData.handle ); } delete events[ type ]; } } // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; // removeData also checks for emptiness and clears the expando if empty // so use it instead of delete jQuery._removeData( elem, "events" ); } }, trigger: function( event, data, elem, onlyHandlers ) { var handle, ontype, cur, bubbleType, special, tmp, i, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; cur = tmp = elem = elem || document; // Don't do events on text and comment nodes if ( elem.nodeType === 3 || elem.nodeType === 8 ) { return; } // focus/blur morphs to focusin/out; ensure we're not firing them right now if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { return; } if ( type.indexOf(".") >= 0 ) { // Namespaced trigger; create a regexp to match event type in handle() namespaces = type.split("."); type = namespaces.shift(); namespaces.sort(); } ontype = type.indexOf(":") < 0 && "on" + type; // Caller can pass in a jQuery.Event object, Object, or just an event type string event = event[ jQuery.expando ] ? event : new jQuery.Event( type, typeof event === "object" && event ); // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) event.isTrigger = onlyHandlers ? 2 : 3; event.namespace = namespaces.join("."); event.namespace_re = event.namespace ? new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : null; // Clean up the event in case it is being reused event.result = undefined; if ( !event.target ) { event.target = elem; } // Clone any incoming data and prepend the event, creating the handler arg list data = data == null ? [ event ] : jQuery.makeArray( data, [ event ] ); // Allow special events to draw outside the lines special = jQuery.event.special[ type ] || {}; if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { return; } // Determine event propagation path in advance, per W3C events spec (#9951) // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { bubbleType = special.delegateType || type; if ( !rfocusMorph.test( bubbleType + type ) ) { cur = cur.parentNode; } for ( ; cur; cur = cur.parentNode ) { eventPath.push( cur ); tmp = cur; } // Only add window if we got to document (e.g., not plain obj or detached DOM) if ( tmp === (elem.ownerDocument || document) ) { eventPath.push( tmp.defaultView || tmp.parentWindow || window ); } } // Fire handlers on the event path i = 0; while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { event.type = i > 1 ? bubbleType : special.bindType || type; // jQuery handler handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } // Native handler handle = ontype && cur[ ontype ]; if ( handle && handle.apply && jQuery.acceptData( cur ) ) { event.result = handle.apply( cur, data ); if ( event.result === false ) { event.preventDefault(); } } } event.type = type; // If nobody prevented the default action, do it now if ( !onlyHandlers && !event.isDefaultPrevented() ) { if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; if ( tmp ) { elem[ ontype ] = null; } // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; try { elem[ type ](); } catch ( e ) { // IE<9 dies on focus/blur to hidden element (#1486,#12518) // only reproducible on winXP IE8 native, not IE9 in IE8 mode } jQuery.event.triggered = undefined; if ( tmp ) { elem[ ontype ] = tmp; } } } } return event.result; }, dispatch: function( event ) { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event ); var i, ret, handleObj, matched, j, handlerQueue = [], args = slice.call( arguments ), handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event args[0] = event; event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { return; } // Determine handlers handlerQueue = jQuery.event.handlers.call( this, event, handlers ); // Run delegates first; they may want to stop propagation beneath us i = 0; while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { event.currentTarget = matched.elem; j = 0; while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { // Triggered event must either 1) have no namespace, or // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { event.handleObj = handleObj; event.data = handleObj.data; ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) .apply( matched.elem, args ); if ( ret !== undefined ) { if ( (event.result = ret) === false ) { event.preventDefault(); event.stopPropagation(); } } } } } // Call the postDispatch hook for the mapped type if ( special.postDispatch ) { special.postDispatch.call( this, event ); } return event.result; }, handlers: function( event, handlers ) { var sel, handleObj, matches, i, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers // Black-hole SVG instance trees (#13180) // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { /* jshint eqeqeq: false */ for ( ; cur != this; cur = cur.parentNode || this ) { /* jshint eqeqeq: true */ // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { matches = []; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; // Don't conflict with Object.prototype properties (#13203) sel = handleObj.selector + " "; if ( matches[ sel ] === undefined ) { matches[ sel ] = handleObj.needsContext ? jQuery( sel, this ).index( cur ) >= 0 : jQuery.find( sel, this, null, [ cur ] ).length; } if ( matches[ sel ] ) { matches.push( handleObj ); } } if ( matches.length ) { handlerQueue.push({ elem: cur, handlers: matches }); } } } } // Add the remaining (directly-bound) handlers if ( delegateCount < handlers.length ) { handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); } return handlerQueue; }, fix: function( event ) { if ( event[ jQuery.expando ] ) { return event; } // Create a writable copy of the event object and normalize some properties var i, prop, copy, type = event.type, originalEvent = event, fixHook = this.fixHooks[ type ]; if ( !fixHook ) { this.fixHooks[ type ] = fixHook = rmouseEvent.test( type ) ? this.mouseHooks : rkeyEvent.test( type ) ? this.keyHooks : {}; } copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; event = new jQuery.Event( originalEvent ); i = copy.length; while ( i-- ) { prop = copy[ i ]; event[ prop ] = originalEvent[ prop ]; } // Support: IE<9 // Fix target property (#1925) if ( !event.target ) { event.target = originalEvent.srcElement || document; } // Support: Chrome 23+, Safari? // Target should not be a text node (#504, #13143) if ( event.target.nodeType === 3 ) { event.target = event.target.parentNode; } // Support: IE<9 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) event.metaKey = !!event.metaKey; return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; }, // Includes some event props shared by KeyEvent and MouseEvent props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function( event, original ) { // Add which for key events if ( event.which == null ) { event.which = original.charCode != null ? original.charCode : original.keyCode; } return event; } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { var body, eventDoc, doc, button = original.button, fromElement = original.fromElement; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { eventDoc = event.target.ownerDocument || document; doc = eventDoc.documentElement; body = eventDoc.body; event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } // Add relatedTarget, if necessary if ( !event.relatedTarget && fromElement ) { event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; } // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); } return event; } }, special: { load: { // Prevent triggered image.load events from bubbling to window.load noBubble: true }, focus: { // Fire native event if possible so blur/focus sequence is correct trigger: function() { if ( this !== safeActiveElement() && this.focus ) { try { this.focus(); return false; } catch ( e ) { // Support: IE<9 // If we error on focus to hidden element (#1486, #12518), // let .trigger() run the handlers } } }, delegateType: "focusin" }, blur: { trigger: function() { if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } }, delegateType: "focusout" }, click: { // For checkbox, fire native event so checked state will be right trigger: function() { if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { this.click(); return false; } }, // For cross-browser consistency, don't fire native .click() on links _default: function( event ) { return jQuery.nodeName( event.target, "a" ); } }, beforeunload: { postDispatch: function( event ) { // Support: Firefox 20+ // Firefox doesn't alert if the returnValue field is not set. if ( event.result !== undefined && event.originalEvent ) { event.originalEvent.returnValue = event.result; } } } }, simulate: function( type, elem, event, bubble ) { // Piggyback on a donor event to simulate a different one. // Fake originalEvent to avoid donor's stopPropagation, but if the // simulated event prevents default then we do the same on the donor. var e = jQuery.extend( new jQuery.Event(), event, { type: type, isSimulated: true, originalEvent: {} } ); if ( bubble ) { jQuery.event.trigger( e, null, elem ); } else { jQuery.event.dispatch.call( elem, e ); } if ( e.isDefaultPrevented() ) { event.preventDefault(); } } }; jQuery.removeEvent = document.removeEventListener ? function( elem, type, handle ) { if ( elem.removeEventListener ) { elem.removeEventListener( type, handle, false ); } } : function( elem, type, handle ) { var name = "on" + type; if ( elem.detachEvent ) { // #8545, #7054, preventing memory leaks for custom events in IE6-8 // detachEvent needed property on element, by name of that event, to properly expose it to GC if ( typeof elem[ name ] === strundefined ) { elem[ name ] = null; } elem.detachEvent( name, handle ); } }; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword if ( !(this instanceof jQuery.Event) ) { return new jQuery.Event( src, props ); } // Event object if ( src && src.type ) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && // Support: IE < 9, Android < 4.0 src.returnValue === false ? returnTrue : returnFalse; // Event type } else { this.type = src; } // Put explicitly provided properties onto the event object if ( props ) { jQuery.extend( this, props ); } // Create a timestamp if incoming event doesn't have one this.timeStamp = src && src.timeStamp || jQuery.now(); // Mark it as fixed this[ jQuery.expando ] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, preventDefault: function() { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; if ( !e ) { return; } // If preventDefault exists, run it on the original event if ( e.preventDefault ) { e.preventDefault(); // Support: IE // Otherwise set the returnValue property of the original event to false } else { e.returnValue = false; } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; if ( !e ) { return; } // If stopPropagation exists, run it on the original event if ( e.stopPropagation ) { e.stopPropagation(); } // Support: IE // Set the cancelBubble property of the original event to true e.cancelBubble = true; }, stopImmediatePropagation: function() { var e = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; if ( e && e.stopImmediatePropagation ) { e.stopImmediatePropagation(); } this.stopPropagation(); } }; // Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout", pointerenter: "pointerover", pointerleave: "pointerout" }, function( orig, fix ) { jQuery.event.special[ orig ] = { delegateType: fix, bindType: fix, handle: function( event ) { var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj; // For mousenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if ( !related || (related !== target && !jQuery.contains( target, related )) ) { event.type = handleObj.origType; ret = handleObj.handler.apply( this, arguments ); event.type = fix; } return ret; } }; }); // IE submit delegation if ( !support.submitBubbles ) { jQuery.event.special.submit = { setup: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Lazy-add a submit handler when a descendant form may potentially be submitted jQuery.event.add( this, "click._submit keypress._submit", function( e ) { // Node name check avoids a VML-related crash in IE (#9807) var elem = e.target, form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; if ( form && !jQuery._data( form, "submitBubbles" ) ) { jQuery.event.add( form, "submit._submit", function( event ) { event._submit_bubble = true; }); jQuery._data( form, "submitBubbles", true ); } }); // return undefined since we don't need an event listener }, postDispatch: function( event ) { // If form was submitted by the user, bubble the event up the tree if ( event._submit_bubble ) { delete event._submit_bubble; if ( this.parentNode && !event.isTrigger ) { jQuery.event.simulate( "submit", this.parentNode, event, true ); } } }, teardown: function() { // Only need this for delegated form submit events if ( jQuery.nodeName( this, "form" ) ) { return false; } // Remove delegated handlers; cleanData eventually reaps submit handlers attached above jQuery.event.remove( this, "._submit" ); } }; } // IE change delegation and checkbox/radio fix if ( !support.changeBubbles ) { jQuery.event.special.change = { setup: function() { if ( rformElems.test( this.nodeName ) ) { // IE doesn't fire change on a check/radio until blur; trigger it on click // after a propertychange. Eat the blur-change in special.change.handle. // This still fires onchange a second time for check/radio after blur. if ( this.type === "checkbox" || this.type === "radio" ) { jQuery.event.add( this, "propertychange._change", function( event ) { if ( event.originalEvent.propertyName === "checked" ) { this._just_changed = true; } }); jQuery.event.add( this, "click._change", function( event ) { if ( this._just_changed && !event.isTrigger ) { this._just_changed = false; } // Allow triggered, simulated change events (#11500) jQuery.event.simulate( "change", this, event, true ); }); } return false; } // Delegated event; lazy-add a change handler on descendant inputs jQuery.event.add( this, "beforeactivate._change", function( e ) { var elem = e.target; if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { jQuery.event.add( elem, "change._change", function( event ) { if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { jQuery.event.simulate( "change", this.parentNode, event, true ); } }); jQuery._data( elem, "changeBubbles", true ); } }); }, handle: function( event ) { var elem = event.target; // Swallow native change events from checkbox/radio, we already triggered them above if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { return event.handleObj.handler.apply( this, arguments ); } }, teardown: function() { jQuery.event.remove( this, "._change" ); return !rformElems.test( this.nodeName ); } }; } // Create "bubbling" focus and blur events if ( !support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { // Attach a single capturing handler on the document while someone wants focusin/focusout var handler = function( event ) { jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); }; jQuery.event.special[ fix ] = { setup: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this, attaches = jQuery._data( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); jQuery._removeData( doc, fix ); } else { jQuery._data( doc, fix, attaches ); } } }; }); } jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { var type, origFn; // Types can be a map of types/handlers if ( typeof types === "object" ) { // ( types-Object, selector, data ) if ( typeof selector !== "string" ) { // ( types-Object, data ) data = data || selector; selector = undefined; } for ( type in types ) { this.on( type, selector, data, types[ type ], one ); } return this; } if ( data == null && fn == null ) { // ( types, fn ) fn = selector; data = selector = undefined; } else if ( fn == null ) { if ( typeof selector === "string" ) { // ( types, selector, fn ) fn = data; data = undefined; } else { // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } if ( fn === false ) { fn = returnFalse; } else if ( !fn ) { return this; } if ( one === 1 ) { origFn = fn; fn = function( event ) { // Can use an empty set, since event contains the info jQuery().off( event ); return origFn.apply( this, arguments ); }; // Use same guid so caller can remove using origFn fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); } return this.each( function() { jQuery.event.add( this, types, fn, data, selector ); }); }, one: function( types, selector, data, fn ) { return this.on( types, selector, data, fn, 1 ); }, off: function( types, selector, fn ) { var handleObj, type; if ( types && types.preventDefault && types.handleObj ) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; jQuery( types.delegateTarget ).off( handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } if ( typeof types === "object" ) { // ( types-object [, selector] ) for ( type in types ) { this.off( type, selector, types[ type ] ); } return this; } if ( selector === false || typeof selector === "function" ) { // ( types [, fn] ) fn = selector; selector = undefined; } if ( fn === false ) { fn = returnFalse; } return this.each(function() { jQuery.event.remove( this, types, fn, selector ); }); }, trigger: function( type, data ) { return this.each(function() { jQuery.event.trigger( type, data, this ); }); }, triggerHandler: function( type, data ) { var elem = this[0]; if ( elem ) { return jQuery.event.trigger( type, data, elem, true ); } } }); function createSafeFragment( document ) { var list = nodeNames.split( "|" ), safeFrag = document.createDocumentFragment(); if ( safeFrag.createElement ) { while ( list.length ) { safeFrag.createElement( list.pop() ); } } return safeFrag; } var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), rleadingWhitespace = /^\s+/, rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, rtagName = /<([\w:]+)/, rtbody = /\s*$/g, // We have to close these tags to support XHTML (#13200) wrapMap = { option: [ 1, "" ], legend: [ 1, "

    ", "
    " ], area: [ 1, "", "" ], param: [ 1, "", "" ], thead: [ 1, "", "
    " ], tr: [ 2, "", "
    " ], col: [ 2, "", "
    " ], td: [ 3, "", "
    " ], // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, // unless wrapped in a div with non-breaking characters in front of it. _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
    ", "
    " ] }, safeFragment = createSafeFragment( document ), fragmentDiv = safeFragment.appendChild( document.createElement("div") ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; function getAll( context, tag ) { var elems, elem, i = 0, found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : undefined; if ( !found ) { for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { if ( !tag || jQuery.nodeName( elem, tag ) ) { found.push( elem ); } else { jQuery.merge( found, getAll( elem, tag ) ); } } } return tag === undefined || tag && jQuery.nodeName( context, tag ) ? jQuery.merge( [ context ], found ) : found; } // Used in buildFragment, fixes the defaultChecked property function fixDefaultChecked( elem ) { if ( rcheckableType.test( elem.type ) ) { elem.defaultChecked = elem.checked; } } // Support: IE<8 // Manipulating tables requires a tbody function manipulationTarget( elem, content ) { return jQuery.nodeName( elem, "table" ) && jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? elem.getElementsByTagName("tbody")[0] || elem.appendChild( elem.ownerDocument.createElement("tbody") ) : elem; } // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; return elem; } function restoreScript( elem ) { var match = rscriptTypeMasked.exec( elem.type ); if ( match ) { elem.type = match[1]; } else { elem.removeAttribute("type"); } return elem; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { var elem, i = 0; for ( ; (elem = elems[i]) != null; i++ ) { jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); } } function cloneCopyEvent( src, dest ) { if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { return; } var type, i, l, oldData = jQuery._data( src ), curData = jQuery._data( dest, oldData ), events = oldData.events; if ( events ) { delete curData.handle; curData.events = {}; for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { jQuery.event.add( dest, type, events[ type ][ i ] ); } } } // make the cloned public data object a copy from the original if ( curData.data ) { curData.data = jQuery.extend( {}, curData.data ); } } function fixCloneNodeIssues( src, dest ) { var nodeName, e, data; // We do not need to do anything for non-Elements if ( dest.nodeType !== 1 ) { return; } nodeName = dest.nodeName.toLowerCase(); // IE6-8 copies events bound via attachEvent when using cloneNode. if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { data = jQuery._data( dest ); for ( e in data.events ) { jQuery.removeEvent( dest, e, data.handle ); } // Event data gets referenced instead of copied if the expando gets copied too dest.removeAttribute( jQuery.expando ); } // IE blanks contents when cloning scripts, and tries to evaluate newly-set text if ( nodeName === "script" && dest.text !== src.text ) { disableScript( dest ).text = src.text; restoreScript( dest ); // IE6-10 improperly clones children of object elements using classid. // IE10 throws NoModificationAllowedError if parent is null, #12132. } else if ( nodeName === "object" ) { if ( dest.parentNode ) { dest.outerHTML = src.outerHTML; } // This path appears unavoidable for IE9. When cloning an object // element in IE9, the outerHTML strategy above is not sufficient. // If the src has innerHTML and the destination does not, // copy the src.innerHTML into the dest.innerHTML. #10324 if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { dest.innerHTML = src.innerHTML; } } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { // IE6-8 fails to persist the checked state of a cloned checkbox // or radio button. Worse, IE6-7 fail to give the cloned element // a checked appearance if the defaultChecked value isn't also set dest.defaultChecked = dest.checked = src.checked; // IE6-7 get confused and end up setting the value of a cloned // checkbox/radio button to an empty string instead of "on" if ( dest.value !== src.value ) { dest.value = src.value; } // IE6-8 fails to return the selected option to the default selected // state when cloning options } else if ( nodeName === "option" ) { dest.defaultSelected = dest.selected = src.defaultSelected; // IE6-8 fails to set the defaultValue to the correct value when // cloning other types of input fields } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } } jQuery.extend({ clone: function( elem, dataAndEvents, deepDataAndEvents ) { var destElements, node, clone, i, srcElements, inPage = jQuery.contains( elem.ownerDocument, elem ); if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { clone = elem.cloneNode( true ); // IE<=8 does not properly clone detached, unknown element nodes } else { fragmentDiv.innerHTML = elem.outerHTML; fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); } if ( (!support.noCloneEvent || !support.noCloneChecked) && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); // Fix all IE cloning issues for ( i = 0; (node = srcElements[i]) != null; ++i ) { // Ensure that the destination node is not null; Fixes #9587 if ( destElements[i] ) { fixCloneNodeIssues( node, destElements[i] ); } } } // Copy the events from the original to the clone if ( dataAndEvents ) { if ( deepDataAndEvents ) { srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); for ( i = 0; (node = srcElements[i]) != null; i++ ) { cloneCopyEvent( node, destElements[i] ); } } else { cloneCopyEvent( elem, clone ); } } // Preserve script evaluation history destElements = getAll( clone, "script" ); if ( destElements.length > 0 ) { setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } destElements = srcElements = node = null; // Return the cloned set return clone; }, buildFragment: function( elems, context, scripts, selection ) { var j, elem, contains, tmp, tag, tbody, wrap, l = elems.length, // Ensure a safe fragment safe = createSafeFragment( context ), nodes = [], i = 0; for ( ; i < l; i++ ) { elem = elems[ i ]; if ( elem || elem === 0 ) { // Add nodes directly if ( jQuery.type( elem ) === "object" ) { jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node } else if ( !rhtml.test( elem ) ) { nodes.push( context.createTextNode( elem ) ); // Convert html into DOM nodes } else { tmp = tmp || safe.appendChild( context.createElement("div") ); // Deserialize a standard representation tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; // Descend through wrappers to the right content j = wrap[0]; while ( j-- ) { tmp = tmp.lastChild; } // Manually add leading whitespace removed by IE if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); } // Remove IE's autoinserted from table fragments if ( !support.tbody ) { // String was a , *may* have spurious elem = tag === "table" && !rtbody.test( elem ) ? tmp.firstChild : // String was a bare or wrap[1] === "
    " && !rtbody.test( elem ) ? tmp : 0; j = elem && elem.childNodes.length; while ( j-- ) { if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { elem.removeChild( tbody ); } } } jQuery.merge( nodes, tmp.childNodes ); // Fix #12392 for WebKit and IE > 9 tmp.textContent = ""; // Fix #12392 for oldIE while ( tmp.firstChild ) { tmp.removeChild( tmp.firstChild ); } // Remember the top-level container for proper cleanup tmp = safe.lastChild; } } } // Fix #11356: Clear elements from fragment if ( tmp ) { safe.removeChild( tmp ); } // Reset defaultChecked for any radios and checkboxes // about to be appended to the DOM in IE 6/7 (#8060) if ( !support.appendChecked ) { jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); } i = 0; while ( (elem = nodes[ i++ ]) ) { // #4087 - If origin and destination elements are the same, and this is // that element, do not do anything if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { continue; } contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment tmp = getAll( safe.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { setGlobalEval( tmp ); } // Capture executables if ( scripts ) { j = 0; while ( (elem = tmp[ j++ ]) ) { if ( rscriptType.test( elem.type || "" ) ) { scripts.push( elem ); } } } } tmp = null; return safe; }, cleanData: function( elems, /* internal */ acceptData ) { var elem, type, id, data, i = 0, internalKey = jQuery.expando, cache = jQuery.cache, deleteExpando = support.deleteExpando, special = jQuery.event.special; for ( ; (elem = elems[i]) != null; i++ ) { if ( acceptData || jQuery.acceptData( elem ) ) { id = elem[ internalKey ]; data = id && cache[ id ]; if ( data ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { jQuery.event.remove( elem, type ); // This is a shortcut to avoid jQuery.event.remove's overhead } else { jQuery.removeEvent( elem, type, data.handle ); } } } // Remove cache only if it was not already removed by jQuery.event.remove if ( cache[ id ] ) { delete cache[ id ]; // IE does not allow us to delete expando properties from nodes, // nor does it have a removeAttribute function on Document nodes; // we must handle all of these cases if ( deleteExpando ) { delete elem[ internalKey ]; } else if ( typeof elem.removeAttribute !== strundefined ) { elem.removeAttribute( internalKey ); } else { elem[ internalKey ] = null; } deletedIds.push( id ); } } } } } }); jQuery.fn.extend({ text: function( value ) { return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); }, null, value, arguments.length ); }, append: function() { return this.domManip( arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.appendChild( elem ); } }); }, prepend: function() { return this.domManip( arguments, function( elem ) { if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { var target = manipulationTarget( this, elem ); target.insertBefore( elem, target.firstChild ); } }); }, before: function() { return this.domManip( arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this ); } }); }, after: function() { return this.domManip( arguments, function( elem ) { if ( this.parentNode ) { this.parentNode.insertBefore( elem, this.nextSibling ); } }); }, remove: function( selector, keepData /* Internal Use Only */ ) { var elem, elems = selector ? jQuery.filter( selector, this ) : this, i = 0; for ( ; (elem = elems[i]) != null; i++ ) { if ( !keepData && elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem ) ); } if ( elem.parentNode ) { if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { setGlobalEval( getAll( elem, "script" ) ); } elem.parentNode.removeChild( elem ); } } return this; }, empty: function() { var elem, i = 0; for ( ; (elem = this[i]) != null; i++ ) { // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); } // Remove any remaining nodes while ( elem.firstChild ) { elem.removeChild( elem.firstChild ); } // If this is a select, ensure that it displays empty (#12336) // Support: IE<9 if ( elem.options && jQuery.nodeName( elem, "select" ) ) { elem.options.length = 0; } } return this; }, clone: function( dataAndEvents, deepDataAndEvents ) { dataAndEvents = dataAndEvents == null ? false : dataAndEvents; deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; return this.map(function() { return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); }); }, html: function( value ) { return access( this, function( value ) { var elem = this[ 0 ] || {}, i = 0, l = this.length; if ( value === undefined ) { return elem.nodeType === 1 ? elem.innerHTML.replace( rinlinejQuery, "" ) : undefined; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && ( support.htmlSerialize || !rnoshimcache.test( value ) ) && ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { value = value.replace( rxhtmlTag, "<$1>" ); try { for (; i < l; i++ ) { // Remove element nodes and prevent memory leaks elem = this[i] || {}; if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; } } elem = 0; // If using innerHTML throws an exception, use the fallback method } catch(e) {} } if ( elem ) { this.empty().append( value ); } }, null, value, arguments.length ); }, replaceWith: function() { var arg = arguments[ 0 ]; // Make the changes, replacing each context element with the new content this.domManip( arguments, function( elem ) { arg = this.parentNode; jQuery.cleanData( getAll( this ) ); if ( arg ) { arg.replaceChild( elem, this ); } }); // Force removal if there was no new content (e.g., from empty arguments) return arg && (arg.length || arg.nodeType) ? this : this.remove(); }, detach: function( selector ) { return this.remove( selector, true ); }, domManip: function( args, callback ) { // Flatten any nested arrays args = concat.apply( [], args ); var first, node, hasScripts, scripts, doc, fragment, i = 0, l = this.length, set = this, iNoClone = l - 1, value = args[0], isFunction = jQuery.isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit if ( isFunction || ( l > 1 && typeof value === "string" && !support.checkClone && rchecked.test( value ) ) ) { return this.each(function( index ) { var self = set.eq( index ); if ( isFunction ) { args[0] = value.call( this, index, self.html() ); } self.domManip( args, callback ); }); } if ( l ) { fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); first = fragment.firstChild; if ( fragment.childNodes.length === 1 ) { fragment = first; } if ( first ) { scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); hasScripts = scripts.length; // Use the original fragment for the last item instead of the first because it can end up // being emptied incorrectly in certain situations (#8070). for ( ; i < l; i++ ) { node = fragment; if ( i !== iNoClone ) { node = jQuery.clone( node, true, true ); // Keep references to cloned scripts for later restoration if ( hasScripts ) { jQuery.merge( scripts, getAll( node, "script" ) ); } } callback.call( this[i], node, i ); } if ( hasScripts ) { doc = scripts[ scripts.length - 1 ].ownerDocument; // Reenable scripts jQuery.map( scripts, restoreScript ); // Evaluate executable scripts on first document insertion for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Optional AJAX dependency, but won't run scripts if not present if ( jQuery._evalUrl ) { jQuery._evalUrl( node.src ); } } else { jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); } } } } // Fix #11809: Avoid leaking memory fragment = first = null; } } return this; } }); jQuery.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, i = 0, ret = [], insert = jQuery( selector ), last = insert.length - 1; for ( ; i <= last; i++ ) { elems = i === last ? this : this.clone(true); jQuery( insert[i] )[ original ]( elems ); // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() push.apply( ret, elems.get() ); } return this.pushStack( ret ); }; }); var iframe, elemdisplay = {}; /** * Retrieve the actual display of a element * @param {String} name nodeName of the element * @param {Object} doc Document object */ // Called only from within defaultDisplay function actualDisplay( name, doc ) { var style, elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), // getDefaultComputedStyle might be reliably used only on attached element display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? // Use of this method is a temporary fix (more like optmization) until something better comes along, // since it was removed from specification and supported only in FF style.display : jQuery.css( elem[ 0 ], "display" ); // We don't have any data stored on the element, // so use "detach" method as fast way to get rid of the element elem.detach(); return display; } /** * Try to determine the default display value of an element * @param {String} nodeName */ function defaultDisplay( nodeName ) { var doc = document, display = elemdisplay[ nodeName ]; if ( !display ) { display = actualDisplay( nodeName, doc ); // If the simple way fails, read from inside an iframe if ( display === "none" || !display ) { // Use the already-created iframe if possible iframe = (iframe || jQuery( "