galaxy-commits
Threads by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
9 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f58a9199e992/
Changeset: f58a9199e992
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Fix failing test test/unit/workflows/test_extract_summary.py.
Affected #: 1 file
diff -r de2e33813275b89a04e7de4e95b21f6d2e100d4e -r f58a9199e9922c3bef27240aa613a9a3c5bae67e test/unit/workflows/test_extract_summary.py
--- a/test/unit/workflows/test_extract_summary.py
+++ b/test/unit/workflows/test_extract_summary.py
@@ -71,6 +71,10 @@
def __init__( self ):
self.active_datasets = []
+ @property
+ def active_contents( self ):
+ return self.active_datasets
+
class MockTrans( object ):
@@ -87,6 +91,7 @@
self.id = 123
self.state = state
self.copied_from_history_dataset_association = None
+ self.history_content_type = "dataset"
if job is not UNDEFINED_JOB:
if not job:
job = model.Job()
https://bitbucket.org/galaxy/galaxy-central/commits/f1a1c52f8495/
Changeset: f1a1c52f8495
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Move galaxy.dataset_collections.util to galaxy.managers.collections_util to prevent circular dependency error.
Still some problems with histories and hda managers when loading from unit tests:
======================================================================
ERROR: Failure: ImportError (cannot import name histories)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/loader.py", line 414, in loadTestsFromName
addr.filename, addr.module)
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/importer.py", line 47, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/john/workspace/galaxy-central/test/unit/workflows/test_workflow_run_request.py", line 4, in <module>
from galaxy.workflow import run_request
File "/home/john/workspace/galaxy-central/lib/galaxy/workflow/run_request.py", line 4, in <module>
import galaxy.managers.histories
File "/home/john/workspace/galaxy-central/lib/galaxy/managers/histories.py", line 12, in <module>
import galaxy.managers.hdas
File "/home/john/workspace/galaxy-central/lib/galaxy/managers/hdas.py", line 11, in <module>
from galaxy.managers import histories as history_manager
ImportError: cannot import name histories
Affected #: 9 files
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/dataset_collections/__init__.py
--- a/lib/galaxy/dataset_collections/__init__.py
+++ b/lib/galaxy/dataset_collections/__init__.py
@@ -1,7 +1,6 @@
from .registry import DatasetCollectionTypesRegistry
from .matching import MatchingCollections
from .type_description import CollectionTypeDescriptionFactory
-from .util import validate_input_element_identifiers
from galaxy import model
@@ -14,7 +13,7 @@
UsesTagsMixin,
)
from galaxy.managers import hdas # TODO: Refactor all mixin use into managers.
-
+from galaxy.managers.collections_util import validate_input_element_identifiers
from galaxy.util import validation
from galaxy.util import odict
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/dataset_collections/util.py
--- a/lib/galaxy/dataset_collections/util.py
+++ /dev/null
@@ -1,95 +0,0 @@
-from galaxy import exceptions
-from galaxy import web
-from galaxy import model
-
-import logging
-log = logging.getLogger( __name__ )
-
-ERROR_MESSAGE_UNKNOWN_SRC = "Unknown dataset source (src) %s."
-ERROR_MESSAGE_NO_NESTED_IDENTIFIERS = "Dataset source new_collection requires nested element_identifiers for new collection."
-ERROR_MESSAGE_NO_NAME = "Cannot load invalid dataset identifier - missing name - %s"
-ERROR_MESSAGE_NO_COLLECTION_TYPE = "No collection_type define for nested collection %s."
-ERROR_MESSAGE_INVALID_PARAMETER_FOUND = "Found invalid parameter %s in element identifier description %s."
-ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND = "Found duplicated element identifier name %s."
-
-
-def api_payload_to_create_params( payload ):
- """
- Cleanup API payload to pass into dataset_collections.
- """
- required_parameters = [ "collection_type", "element_identifiers" ]
- missing_parameters = [ p for p in required_parameters if p not in payload ]
- if missing_parameters:
- message = "Missing required parameters %s" % missing_parameters
- raise exceptions.ObjectAttributeMissingException( message )
-
- params = dict(
- collection_type=payload.get( "collection_type" ),
- element_identifiers=payload.get( "element_identifiers" ),
- name=payload.get( "name", None ),
- )
-
- return params
-
-
-def validate_input_element_identifiers( element_identifiers ):
- """ Scan through the list of element identifiers supplied by the API consumer
- and verify the structure is valid.
- """
- log.debug( "Validating %d element identifiers for collection creation." % len( element_identifiers ) )
- identifier_names = set()
- for element_identifier in element_identifiers:
- if "__object__" in element_identifier:
- message = ERROR_MESSAGE_INVALID_PARAMETER_FOUND % ( "__model_object__", element_identifier )
- raise exceptions.RequestParameterInvalidException( message )
- if "name" not in element_identifier:
- message = ERROR_MESSAGE_NO_NAME % element_identifier
- raise exceptions.RequestParameterInvalidException( message )
- name = element_identifier[ "name" ]
- if name in identifier_names:
- message = ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND % name
- raise exceptions.RequestParameterInvalidException( message )
- else:
- identifier_names.add( name )
- src = element_identifier.get( "src", "hda" )
- if src not in [ "hda", "hdca", "ldda", "new_collection" ]:
- message = ERROR_MESSAGE_UNKNOWN_SRC % src
- raise exceptions.RequestParameterInvalidException( message )
- if src == "new_collection":
- if "element_identifiers" not in element_identifier:
- message = ERROR_MESSAGE_NO_NESTED_IDENTIFIERS
- raise exceptions.RequestParameterInvalidException( ERROR_MESSAGE_NO_NESTED_IDENTIFIERS )
- if "collection_type" not in element_identifier:
- message = ERROR_MESSAGE_NO_COLLECTION_TYPE % element_identifier
- raise exceptions.RequestParameterInvalidException( message )
- validate_input_element_identifiers( element_identifier[ "element_identifiers" ] )
-
-
-def dictify_dataset_collection_instance( dataset_colleciton_instance, parent, security, view="element" ):
- dict_value = dataset_colleciton_instance.to_dict( view=view )
- encoded_id = security.encode_id( dataset_colleciton_instance.id )
- if isinstance( parent, model.History ):
- encoded_history_id = security.encode_id( parent.id )
- dict_value[ 'url' ] = web.url_for( 'history_content_typed', history_id=encoded_history_id, id=encoded_id, type="dataset_collection" )
- elif isinstance( parent, model.LibraryFolder ):
- encoded_library_id = security.encode_id( parent.library.id )
- encoded_folder_id = security.encode_id( parent.id )
- # TODO: Work in progress - this end-point is not right yet...
- dict_value[ 'url' ] = web.url_for( 'library_content', library_id=encoded_library_id, id=encoded_id, folder_id=encoded_folder_id )
- if view == "element":
- dict_value[ 'elements' ] = map( dictify_element, dataset_colleciton_instance.collection.elements )
- security.encode_all_ids( dict_value, recursive=True ) # TODO: Use Kyle's recusrive formulation of this.
- return dict_value
-
-
-def dictify_element( element ):
- dictified = element.to_dict( view="element" )
- object_detials = element.element_object.to_dict()
- if element.child_collection:
- # Recursively yield elements for each nested collection...
- object_detials[ "elements" ] = map( dictify_element, element.child_collection.elements )
-
- dictified[ "object" ] = object_detials
- return dictified
-
-__all__ = [ api_payload_to_create_params, dictify_dataset_collection_instance ]
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/managers/collections.py
--- /dev/null
+++ b/lib/galaxy/managers/collections.py
@@ -0,0 +1,1 @@
+""" Future home of dataset collections managers. """
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/managers/collections_util.py
--- /dev/null
+++ b/lib/galaxy/managers/collections_util.py
@@ -0,0 +1,95 @@
+from galaxy import exceptions
+from galaxy import web
+from galaxy import model
+
+import logging
+log = logging.getLogger( __name__ )
+
+ERROR_MESSAGE_UNKNOWN_SRC = "Unknown dataset source (src) %s."
+ERROR_MESSAGE_NO_NESTED_IDENTIFIERS = "Dataset source new_collection requires nested element_identifiers for new collection."
+ERROR_MESSAGE_NO_NAME = "Cannot load invalid dataset identifier - missing name - %s"
+ERROR_MESSAGE_NO_COLLECTION_TYPE = "No collection_type define for nested collection %s."
+ERROR_MESSAGE_INVALID_PARAMETER_FOUND = "Found invalid parameter %s in element identifier description %s."
+ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND = "Found duplicated element identifier name %s."
+
+
+def api_payload_to_create_params( payload ):
+ """
+ Cleanup API payload to pass into dataset_collections.
+ """
+ required_parameters = [ "collection_type", "element_identifiers" ]
+ missing_parameters = [ p for p in required_parameters if p not in payload ]
+ if missing_parameters:
+ message = "Missing required parameters %s" % missing_parameters
+ raise exceptions.ObjectAttributeMissingException( message )
+
+ params = dict(
+ collection_type=payload.get( "collection_type" ),
+ element_identifiers=payload.get( "element_identifiers" ),
+ name=payload.get( "name", None ),
+ )
+
+ return params
+
+
+def validate_input_element_identifiers( element_identifiers ):
+ """ Scan through the list of element identifiers supplied by the API consumer
+ and verify the structure is valid.
+ """
+ log.debug( "Validating %d element identifiers for collection creation." % len( element_identifiers ) )
+ identifier_names = set()
+ for element_identifier in element_identifiers:
+ if "__object__" in element_identifier:
+ message = ERROR_MESSAGE_INVALID_PARAMETER_FOUND % ( "__model_object__", element_identifier )
+ raise exceptions.RequestParameterInvalidException( message )
+ if "name" not in element_identifier:
+ message = ERROR_MESSAGE_NO_NAME % element_identifier
+ raise exceptions.RequestParameterInvalidException( message )
+ name = element_identifier[ "name" ]
+ if name in identifier_names:
+ message = ERROR_MESSAGE_DUPLICATED_IDENTIFIER_FOUND % name
+ raise exceptions.RequestParameterInvalidException( message )
+ else:
+ identifier_names.add( name )
+ src = element_identifier.get( "src", "hda" )
+ if src not in [ "hda", "hdca", "ldda", "new_collection" ]:
+ message = ERROR_MESSAGE_UNKNOWN_SRC % src
+ raise exceptions.RequestParameterInvalidException( message )
+ if src == "new_collection":
+ if "element_identifiers" not in element_identifier:
+ message = ERROR_MESSAGE_NO_NESTED_IDENTIFIERS
+ raise exceptions.RequestParameterInvalidException( ERROR_MESSAGE_NO_NESTED_IDENTIFIERS )
+ if "collection_type" not in element_identifier:
+ message = ERROR_MESSAGE_NO_COLLECTION_TYPE % element_identifier
+ raise exceptions.RequestParameterInvalidException( message )
+ validate_input_element_identifiers( element_identifier[ "element_identifiers" ] )
+
+
+def dictify_dataset_collection_instance( dataset_colleciton_instance, parent, security, view="element" ):
+ dict_value = dataset_colleciton_instance.to_dict( view=view )
+ encoded_id = security.encode_id( dataset_colleciton_instance.id )
+ if isinstance( parent, model.History ):
+ encoded_history_id = security.encode_id( parent.id )
+ dict_value[ 'url' ] = web.url_for( 'history_content_typed', history_id=encoded_history_id, id=encoded_id, type="dataset_collection" )
+ elif isinstance( parent, model.LibraryFolder ):
+ encoded_library_id = security.encode_id( parent.library.id )
+ encoded_folder_id = security.encode_id( parent.id )
+ # TODO: Work in progress - this end-point is not right yet...
+ dict_value[ 'url' ] = web.url_for( 'library_content', library_id=encoded_library_id, id=encoded_id, folder_id=encoded_folder_id )
+ if view == "element":
+ dict_value[ 'elements' ] = map( dictify_element, dataset_colleciton_instance.collection.elements )
+ security.encode_all_ids( dict_value, recursive=True ) # TODO: Use Kyle's recusrive formulation of this.
+ return dict_value
+
+
+def dictify_element( element ):
+ dictified = element.to_dict( view="element" )
+ object_detials = element.element_object.to_dict()
+ if element.child_collection:
+ # Recursively yield elements for each nested collection...
+ object_detials[ "elements" ] = map( dictify_element, element.child_collection.elements )
+
+ dictified[ "object" ] = object_detials
+ return dictified
+
+__all__ = [ api_payload_to_create_params, dictify_dataset_collection_instance ]
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/managers/histories.py
--- a/lib/galaxy/managers/histories.py
+++ b/lib/galaxy/managers/histories.py
@@ -10,9 +10,9 @@
from galaxy.managers import base as manager_base
import galaxy.managers.hdas
+import galaxy.managers.collections_util
import galaxy.web
-import galaxy.dataset_collections.util
import logging
log = logging.getLogger( __name__ )
@@ -141,7 +141,7 @@
history and an array of serialized history contents respectively.
"""
hda_mgr = galaxy.managers.hdas.HDAManager()
- collection_dictifier = galaxy.dataset_collections.util.dictify_dataset_collection_instance
+ collection_dictifier = galaxy.managers.collections_util.dictify_dataset_collection_instance
history_dictionary = {}
contents_dictionaries = []
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/webapps/galaxy/api/dataset_collections.py
--- a/lib/galaxy/webapps/galaxy/api/dataset_collections.py
+++ b/lib/galaxy/webapps/galaxy/api/dataset_collections.py
@@ -4,8 +4,7 @@
from galaxy.web.base.controller import UsesHistoryMixin
from galaxy.web.base.controller import UsesLibraryMixinItems
-from galaxy.dataset_collections.util import api_payload_to_create_params
-from galaxy.dataset_collections.util import dictify_dataset_collection_instance
+from galaxy.managers.collections_util import api_payload_to_create_params, dictify_dataset_collection_instance
from logging import getLogger
log = getLogger( __name__ )
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/webapps/galaxy/api/history_contents.py
--- a/lib/galaxy/webapps/galaxy/api/history_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/history_contents.py
@@ -16,12 +16,9 @@
from galaxy.web.base.controller import UsesLibraryMixinItems
from galaxy.web.base.controller import UsesTagsMixin
-from galaxy.dataset_collections.util import api_payload_to_create_params
-from galaxy.dataset_collections.util import dictify_dataset_collection_instance
-
-
from galaxy.managers import histories
from galaxy.managers import hdas
+from galaxy.managers.collections_util import api_payload_to_create_params, dictify_dataset_collection_instance
import logging
log = logging.getLogger( __name__ )
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/webapps/galaxy/api/library_contents.py
--- a/lib/galaxy/webapps/galaxy/api/library_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/library_contents.py
@@ -5,11 +5,10 @@
from galaxy import web
from galaxy import exceptions
from galaxy.web import _future_expose_api as expose_api
-from galaxy.dataset_collections.util import api_payload_to_create_params
-from galaxy.dataset_collections.util import dictify_dataset_collection_instance
from galaxy.web.base.controller import BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems
from galaxy.web.base.controller import UsesHistoryDatasetAssociationMixin
from galaxy.web.base.controller import HTTPBadRequest, url_for
+from galaxy.managers.collections_util import api_payload_to_create_params, dictify_dataset_collection_instance
from galaxy.model import ExtendedMetadata, ExtendedMetadataIndex
from sqlalchemy.orm.exc import MultipleResultsFound
from sqlalchemy.orm.exc import NoResultFound
diff -r f58a9199e9922c3bef27240aa613a9a3c5bae67e -r f1a1c52f8495d1035d1c0a5e21b710974db0908e lib/galaxy/webapps/galaxy/api/tools.py
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -9,7 +9,8 @@
from galaxy.visualization.genomes import GenomeRegion
from galaxy.util.json import to_json_string
from galaxy.visualization.data_providers.genome import *
-from galaxy.dataset_collections.util import dictify_dataset_collection_instance
+
+from galaxy.managers.collections_util import dictify_dataset_collection_instance
import logging
log = logging.getLogger( __name__ )
https://bitbucket.org/galaxy/galaxy-central/commits/b17747153f1a/
Changeset: b17747153f1a
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Extract all the workflow run API param handling out...
This should allow for the reuse of all of this in asynchronous workflow running and make unit testing of all the different paths easier (though that is not included in this commit - the API functional test coverage for this code is pretty decent at this point).
Affected #: 2 files
diff -r f1a1c52f8495d1035d1c0a5e21b710974db0908e -r b17747153f1a55292a03392cf2c9f5a6c69c5460 lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -15,7 +15,7 @@
from galaxy.web.base.controller import SharableMixin
from galaxy.workflow.extract import extract_workflow
from galaxy.workflow.run import invoke
-from galaxy.workflow.run import WorkflowRunConfig
+from galaxy.workflow.run_request import build_workflow_run_config
log = logging.getLogger(__name__)
@@ -212,105 +212,12 @@
message = "Invalid workflow_id specified."
raise exceptions.RequestParameterInvalidException( message )
- # Pull other parameters out of payload.
- param_map = payload.get( 'parameters', {} )
- inputs = payload.get( 'inputs', None )
- inputs_by = payload.get( 'inputs_by', None )
- if inputs is None:
- # Default to legacy behavior - read ds_map and reference steps
- # by unencoded step id (a raw database id).
- inputs = payload.get( 'ds_map', {} )
- inputs_by = inputs_by or 'step_id'
- else:
- inputs = inputs or {}
- # New default is to reference steps by index of workflow step
- # which is intrinsic to the workflow and independent of the state
- # of Galaxy at the time of workflow import.
- inputs_by = inputs_by or 'step_index'
-
- valid_inputs_by = [ 'step_id', 'step_index', 'name' ]
- if inputs_by not in valid_inputs_by:
- trans.response.status = 403
- error_message_template = "Invalid inputs_by specified '%s' must be one of %s"
- error_message = error_message_template % ( inputs_by, valid_inputs_by )
- raise ValueError( error_message )
-
- add_to_history = 'no_add_to_history' not in payload
- history_param = payload.get('history', '')
-
# Get workflow + accessibility check.
stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
workflow = stored_workflow.latest_workflow
- # Sanity checks.
- if len( workflow.steps ) == 0:
- raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
- if workflow.has_cycles:
- raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
- if workflow.has_errors:
- message = "Workflow cannot be run because of validation errors in some steps"
- raise exceptions.MessageException( message )
-
- # Get target history.
- if history_param.startswith('hist_id='):
- # Passing an existing history to use.
- encoded_history_id = history_param[ 8: ]
- history_id = self.__decode_id( trans, encoded_history_id, model_type="history" )
- history = self.history_manager.get( trans, history_id, check_ownership=True )
- else:
- # Send workflow outputs to new history.
- history = self.app.model.History(name=history_param, user=trans.user)
- trans.sa_session.add(history)
- trans.sa_session.flush()
-
- # Set workflow inputs.
- for k in inputs:
- try:
- if inputs[k]['src'] == 'ldda':
- ldda = trans.sa_session.query(self.app.model.LibraryDatasetDatasetAssociation).get(
- trans.security.decode_id(inputs[k]['id']))
- assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
- content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
- elif inputs[k]['src'] == 'ld':
- ldda = trans.sa_session.query(self.app.model.LibraryDataset).get(
- trans.security.decode_id(inputs[k]['id'])).library_dataset_dataset_association
- assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
- content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
- elif inputs[k]['src'] == 'hda':
- # Get dataset handle, add to dict and history if necessary
- content = trans.sa_session.query(self.app.model.HistoryDatasetAssociation).get(
- trans.security.decode_id(inputs[k]['id']))
- assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), content.dataset )
- elif inputs[k]['src'] == 'hdca':
- content = self.app.dataset_collections_service.get_dataset_collection_instance(
- trans,
- 'history',
- inputs[k]['id']
- )
- else:
- message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
- raise exceptions.RequestParameterInvalidException( message )
- if add_to_history and content.history != history:
- content = content.copy()
- if isinstance( content, self.app.model.HistoryDatasetAssociation ):
- history.add_dataset( content )
- else:
- history.add_dataset_collection( content )
- inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
- except AssertionError:
- message = "Invalid workflow input '%s' specified" % inputs[k]['id']
- raise exceptions.ItemAccessibilityException( message )
-
- # Run each step, connecting outputs to inputs
- replacement_dict = payload.get('replacement_params', {})
-
- run_config = WorkflowRunConfig(
- target_history=history,
- replacement_dict=replacement_dict,
- inputs=inputs,
- inputs_by=inputs_by,
- param_map=param_map,
- )
+ run_config = build_workflow_run_config( trans, workflow, payload )
+ history = run_config.target_history
# invoke may throw MessageExceptions on tool erors, failure
# to match up inputs, etc...
@@ -525,8 +432,8 @@
return stored_workflow
def __get_stored_workflow( self, trans, workflow_id ):
+ workflow_id = self.__decode_id( trans, workflow_id )
try:
- workflow_id = self.__decode_id( trans, workflow_id )
query = trans.sa_session.query( trans.app.model.StoredWorkflow )
stored_workflow = query.get( workflow_id )
except Exception:
diff -r f1a1c52f8495d1035d1c0a5e21b710974db0908e -r b17747153f1a55292a03392cf2c9f5a6c69c5460 lib/galaxy/workflow/run_request.py
--- /dev/null
+++ b/lib/galaxy/workflow/run_request.py
@@ -0,0 +1,114 @@
+from galaxy import exceptions
+
+from galaxy.managers import histories
+from galaxy.workflow.run import WorkflowRunConfig
+
+
+def build_workflow_run_config( trans, workflow, payload ):
+ app = trans.app
+ history_manager = histories.HistoryManager()
+
+ # Pull other parameters out of payload.
+ param_map = payload.get( 'parameters', {} )
+ inputs = payload.get( 'inputs', None )
+ inputs_by = payload.get( 'inputs_by', None )
+ if inputs is None:
+ # Default to legacy behavior - read ds_map and reference steps
+ # by unencoded step id (a raw database id).
+ inputs = payload.get( 'ds_map', {} )
+ inputs_by = inputs_by or 'step_id'
+ else:
+ inputs = inputs or {}
+ # New default is to reference steps by index of workflow step
+ # which is intrinsic to the workflow and independent of the state
+ # of Galaxy at the time of workflow import.
+ inputs_by = inputs_by or 'step_index'
+
+ valid_inputs_by = [ 'step_id', 'step_index', 'name' ]
+ if inputs_by not in valid_inputs_by:
+ trans.response.status = 403
+ error_message_template = "Invalid inputs_by specified '%s' must be one of %s"
+ error_message = error_message_template % ( inputs_by, valid_inputs_by )
+ raise ValueError( error_message )
+
+ add_to_history = 'no_add_to_history' not in payload
+ history_param = payload.get('history', '')
+
+ # Sanity checks.
+ if len( workflow.steps ) == 0:
+ raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
+ if workflow.has_cycles:
+ raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
+ if workflow.has_errors:
+ message = "Workflow cannot be run because of validation errors in some steps"
+ raise exceptions.MessageException( message )
+
+ # Get target history.
+ if history_param.startswith('hist_id='):
+ # Passing an existing history to use.
+ encoded_history_id = history_param[ 8: ]
+ history_id = __decode_id( trans, encoded_history_id, model_type="history" )
+ history = history_manager.get( trans, history_id, check_ownership=True )
+ else:
+ # Send workflow outputs to new history.
+ history = app.model.History(name=history_param, user=trans.user)
+ trans.sa_session.add(history)
+ trans.sa_session.flush()
+
+ # Set workflow inputs.
+ for k in inputs:
+ try:
+ if inputs[k]['src'] == 'ldda':
+ ldda = trans.sa_session.query(app.model.LibraryDatasetDatasetAssociation).get(
+ trans.security.decode_id(inputs[k]['id']))
+ assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
+ content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
+ elif inputs[k]['src'] == 'ld':
+ ldda = trans.sa_session.query(app.model.LibraryDataset).get(
+ trans.security.decode_id(inputs[k]['id'])).library_dataset_dataset_association
+ assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
+ content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
+ elif inputs[k]['src'] == 'hda':
+ # Get dataset handle, add to dict and history if necessary
+ content = trans.sa_session.query(app.model.HistoryDatasetAssociation).get(
+ trans.security.decode_id(inputs[k]['id']))
+ assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), content.dataset )
+ elif inputs[k]['src'] == 'hdca':
+ content = app.dataset_collections_service.get_dataset_collection_instance(
+ trans,
+ 'history',
+ inputs[k]['id']
+ )
+ else:
+ message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ raise exceptions.RequestParameterInvalidException( message )
+ if add_to_history and content.history != history:
+ content = content.copy()
+ if isinstance( content, app.model.HistoryDatasetAssociation ):
+ history.add_dataset( content )
+ else:
+ history.add_dataset_collection( content )
+ inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
+ except AssertionError:
+ message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ raise exceptions.ItemAccessibilityException( message )
+
+ # Run each step, connecting outputs to inputs
+ replacement_dict = payload.get('replacement_params', {})
+
+ run_config = WorkflowRunConfig(
+ target_history=history,
+ replacement_dict=replacement_dict,
+ inputs=inputs,
+ inputs_by=inputs_by,
+ param_map=param_map,
+ )
+ return run_config
+
+
+def __decode_id( trans, workflow_id, model_type="workflow" ):
+ try:
+ return trans.security.decode_id( workflow_id )
+ except Exception:
+ message = "Malformed %s id ( %s ) specified, unable to decode" % ( model_type, workflow_id )
+ raise exceptions.MalformedId( message )
https://bitbucket.org/galaxy/galaxy-central/commits/041779f857a1/
Changeset: 041779f857a1
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Hack to get around circular dependency by histories and hdas manager modules.
======================================================================
ERROR: Failure: ImportError (cannot import name histories)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/loader.py", line 414, in loadTestsFromName
addr.filename, addr.module)
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/importer.py", line 47, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/home/john/workspace/lwr/.venv/local/lib/python2.7/site-packages/nose/importer.py", line 94, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/john/workspace/galaxy-central/test/unit/workflows/test_workflow_run_request.py", line 4, in <module>
from galaxy.workflow import run_request
File "/home/john/workspace/galaxy-central/lib/galaxy/workflow/run_request.py", line 4, in <module>
import galaxy.managers.histories
File "/home/john/workspace/galaxy-central/lib/galaxy/managers/histories.py", line 12, in <module>
import galaxy.managers.hdas
File "/home/john/workspace/galaxy-central/lib/galaxy/managers/hdas.py", line 11, in <module>
from galaxy.managers import histories as history_manager
ImportError: cannot import name histories
Affected #: 1 file
diff -r b17747153f1a55292a03392cf2c9f5a6c69c5460 -r 041779f857a178092e216a628b62d3c04a4c8977 lib/galaxy/managers/histories.py
--- a/lib/galaxy/managers/histories.py
+++ b/lib/galaxy/managers/histories.py
@@ -9,7 +9,6 @@
from galaxy.model import orm
from galaxy.managers import base as manager_base
-import galaxy.managers.hdas
import galaxy.managers.collections_util
import galaxy.web
@@ -140,6 +139,8 @@
Returns a dictionary containing ``history`` and ``contents``, serialized
history and an array of serialized history contents respectively.
"""
+ # import here prevents problems related to circular dependecy between histories and hdas managers.
+ import galaxy.managers.hdas
hda_mgr = galaxy.managers.hdas.HDAManager()
collection_dictifier = galaxy.managers.collections_util.dictify_dataset_collection_instance
https://bitbucket.org/galaxy/galaxy-central/commits/7772ff282e95/
Changeset: 7772ff282e95
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Cleanup repeated dictionary access in build_workflow_run_config, better error handling.
Affected #: 1 file
diff -r 041779f857a178092e216a628b62d3c04a4c8977 -r 7772ff282e95516a4d39ef0a87afeabb8b123d23 lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -56,31 +56,39 @@
trans.sa_session.flush()
# Set workflow inputs.
- for k in inputs:
+ for input_dict in inputs.itervalues():
+ if 'src' not in input_dict:
+ message = "Not input source type defined for input '%s'." % input_dict
+ raise exceptions.RequestParameterInvalidException( message )
+ if 'id' not in input_dict:
+ message = "Not input id defined for input '%s'." % input_dict
+ raise exceptions.RequestParameterInvalidException( message )
+ input_source = input_dict['src']
+ input_id = input_dict['id']
try:
- if inputs[k]['src'] == 'ldda':
+ if input_source == 'ldda':
ldda = trans.sa_session.query(app.model.LibraryDatasetDatasetAssociation).get(
- trans.security.decode_id(inputs[k]['id']))
+ trans.security.decode_id(input_id))
assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
- elif inputs[k]['src'] == 'ld':
+ elif input_source == 'ld':
ldda = trans.sa_session.query(app.model.LibraryDataset).get(
- trans.security.decode_id(inputs[k]['id'])).library_dataset_dataset_association
+ trans.security.decode_id(input_id)).library_dataset_dataset_association
assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), ldda.dataset )
content = ldda.to_history_dataset_association(history, add_to_history=add_to_history)
- elif inputs[k]['src'] == 'hda':
+ elif input_source == 'hda':
# Get dataset handle, add to dict and history if necessary
content = trans.sa_session.query(app.model.HistoryDatasetAssociation).get(
- trans.security.decode_id(inputs[k]['id']))
+ trans.security.decode_id(input_id))
assert trans.user_is_admin() or trans.app.security_agent.can_access_dataset( trans.get_current_user_roles(), content.dataset )
- elif inputs[k]['src'] == 'hdca':
+ elif input_source == 'hdca':
content = app.dataset_collections_service.get_dataset_collection_instance(
trans,
'history',
- inputs[k]['id']
+ input_id
)
else:
- message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ message = "Unknown workflow input source '%s' specified." % input_source
raise exceptions.RequestParameterInvalidException( message )
if add_to_history and content.history != history:
content = content.copy()
@@ -88,9 +96,9 @@
history.add_dataset( content )
else:
history.add_dataset_collection( content )
- inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
+ input_dict['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
except AssertionError:
- message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ message = "Invalid workflow input '%s' specified" % input_id
raise exceptions.ItemAccessibilityException( message )
# Run each step, connecting outputs to inputs
https://bitbucket.org/galaxy/galaxy-central/commits/84caa9526b5f/
Changeset: 84caa9526b5f
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Change 'hda' input name in workflow inputs dict to 'content'...
... 'content' better reflects that this can be either an HDA or an HDCA.
Affected #: 2 files
diff -r 7772ff282e95516a4d39ef0a87afeabb8b123d23 -r 84caa9526b5fe407718082dcdd7c8b65cb210175 lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -224,7 +224,7 @@
else:
raise Exception("Unknown history content encountered")
if self.inputs:
- outputs[ step.id ][ 'output' ] = self.inputs_by_step_id[ step.id ][ 'hda' ]
+ outputs[ step.id ][ 'output' ] = self.inputs_by_step_id[ step.id ][ 'content' ]
return job
diff -r 7772ff282e95516a4d39ef0a87afeabb8b123d23 -r 84caa9526b5fe407718082dcdd7c8b65cb210175 lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -63,6 +63,9 @@
if 'id' not in input_dict:
message = "Not input id defined for input '%s'." % input_dict
raise exceptions.RequestParameterInvalidException( message )
+ if 'content' in input_dict:
+ message = "Input cannot specify explicit 'content' attribute %s'." % input_dict
+ raise exceptions.RequestParameterInvalidException( message )
input_source = input_dict['src']
input_id = input_dict['id']
try:
@@ -96,7 +99,7 @@
history.add_dataset( content )
else:
history.add_dataset_collection( content )
- input_dict['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
+ input_dict['content'] = content
except AssertionError:
message = "Invalid workflow input '%s' specified" % input_id
raise exceptions.ItemAccessibilityException( message )
https://bitbucket.org/galaxy/galaxy-central/commits/483ceff2d2b6/
Changeset: 483ceff2d2b6
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Normalize workflow step parameters earlier...
... this will allow linking to actual steps (referential integrity) if/when we store workflow requests in the database.
Also unit tests.
Affected #: 4 files
diff -r 84caa9526b5fe407718082dcdd7c8b65cb210175 -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -41,9 +41,9 @@
that step ('name').
:type inputs_by: str
- :param param_map: Override tool and/or step parameters (see documentation on
- _update_step_parameters below).
- :type param_map:
+ :param param_map: Override step parameters - should be dict with step id keys and
+ tool param name-value dicts as values.
+ :type param_map: dict
"""
def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, inputs_by='step_id', param_map={} ):
@@ -304,36 +304,9 @@
self.inputs_by_step_id[ step.id ] = self.inputs[ key ]
-def _update_step_parameters(step, param_map):
- """
- Update ``step`` parameters based on the user-provided ``param_map`` dict.
-
- ``param_map`` should be structured as follows::
-
- PARAM_MAP = {STEP_ID: PARAM_DICT, ...}
- PARAM_DICT = {NAME: VALUE, ...}
-
- For backwards compatibility, the following (deprecated) format is
- also supported for ``param_map``::
-
- PARAM_MAP = {TOOL_ID: PARAM_DICT, ...}
-
- in which case PARAM_DICT affects all steps with the given tool id.
- If both by-tool-id and by-step-id specifications are used, the
- latter takes precedence.
-
- Finally (again, for backwards compatibility), PARAM_DICT can also
- be specified as::
-
- PARAM_DICT = {'param': NAME, 'value': VALUE}
-
- Note that this format allows only one parameter to be set per step.
- """
- param_dict = param_map.get(step.tool_id, {}).copy()
- param_dict.update(param_map.get(str(step.id), {}))
+def _update_step_parameters(step, normalized_param_map):
+ param_dict = normalized_param_map.get(step.id, {})
if param_dict:
- if 'param' in param_dict and 'value' in param_dict:
- param_dict[param_dict['param']] = param_dict['value']
step.state.inputs.update(param_dict)
diff -r 84caa9526b5fe407718082dcdd7c8b65cb210175 -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -4,12 +4,62 @@
from galaxy.workflow.run import WorkflowRunConfig
+def normalize_step_parameters(steps, param_map):
+ """ Take a complex param_map that can reference parameters by
+ step_id in the new flexible way or in the old one-parameter
+ per tep fashion or by tool id and normalize the parameters so
+ everything is referenced by a numeric step id.
+ """
+ normalized_param_map = {}
+ for step in steps:
+ param_dict = _step_parameters(step, param_map)
+ if param_dict:
+ normalized_param_map[step.id] = param_dict
+ return normalized_param_map
+
+
+def _step_parameters(step, param_map):
+ """
+ Update ``step`` parameters based on the user-provided ``param_map`` dict.
+
+ ``param_map`` should be structured as follows::
+
+ PARAM_MAP = {STEP_ID: PARAM_DICT, ...}
+ PARAM_DICT = {NAME: VALUE, ...}
+
+ For backwards compatibility, the following (deprecated) format is
+ also supported for ``param_map``::
+
+ PARAM_MAP = {TOOL_ID: PARAM_DICT, ...}
+
+ in which case PARAM_DICT affects all steps with the given tool id.
+ If both by-tool-id and by-step-id specifications are used, the
+ latter takes precedence.
+
+ Finally (again, for backwards compatibility), PARAM_DICT can also
+ be specified as::
+
+ PARAM_DICT = {'param': NAME, 'value': VALUE}
+
+ Note that this format allows only one parameter to be set per step.
+ """
+ param_dict = param_map.get(step.tool_id, {}).copy()
+ param_dict.update(param_map.get(str(step.id), {}))
+ if param_dict:
+ if 'param' in param_dict and 'value' in param_dict:
+ param_dict[param_dict['param']] = param_dict['value']
+ del param_dict[ 'param' ]
+ del param_dict[ 'value' ]
+ return param_dict
+
+
def build_workflow_run_config( trans, workflow, payload ):
app = trans.app
history_manager = histories.HistoryManager()
# Pull other parameters out of payload.
param_map = payload.get( 'parameters', {} )
+ param_map = normalize_step_parameters( workflow.steps, param_map )
inputs = payload.get( 'inputs', None )
inputs_by = payload.get( 'inputs_by', None )
if inputs is None:
diff -r 84caa9526b5fe407718082dcdd7c8b65cb210175 -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde test/unit/workflows/test_run_parameters.py
--- /dev/null
+++ b/test/unit/workflows/test_run_parameters.py
@@ -0,0 +1,84 @@
+from .workflow_support import MockTrans
+
+from galaxy import model
+from galaxy.workflow.run_request import normalize_step_parameters
+
+
+def test_normalize_parameters_empty():
+ normalized_params = __normalize_parameters_against_fixture( {} )
+ assert normalized_params == {}
+
+
+def test_normalize_parameters_by_tool():
+ normalized_params = __normalize_parameters_against_fixture( {
+ 'cat1': { 'foo': 'bar' }
+ } )
+ # Tool specified parameters are expanded out.
+ assert normalized_params[ 3 ] == { 'foo': 'bar' }
+ assert normalized_params[ 4 ] == { 'foo': 'bar' }
+ assert len( normalized_params.keys() ) == 2
+
+
+def test_step_parameters():
+ normalized_params = __normalize_parameters_against_fixture( {
+ '1': { 'foo': 'bar' }
+ } )
+ assert normalized_params[ 1 ] == { 'foo': 'bar' }
+ assert len( normalized_params.keys() ) == 1
+
+
+def test_step_parameters_legacy():
+ normalized_params = __normalize_parameters_against_fixture( {
+ '1': { 'param': 'foo', 'value': 'bar' }
+ } )
+ assert normalized_params[ 1 ] == { 'foo': 'bar' }, normalized_params
+ assert len( normalized_params.keys() ) == 1
+
+
+def __normalize_parameters_against_fixture( params ):
+ trans = MockTrans()
+ workflow = __workflow_fixure( trans )
+ normalized_params = normalize_step_parameters( workflow.steps, params )
+ return normalized_params
+
+
+def __workflow_fixure( trans ):
+ user = model.User(
+ email="testworkflow_params(a)bx.psu.edu",
+ password="pass"
+ )
+ stored_workflow = model.StoredWorkflow()
+ stored_workflow.user = user
+ workflow = model.Workflow()
+ workflow.stored_workflow = stored_workflow
+
+ def add_step( **kwds ):
+ workflow_step = model.WorkflowStep()
+ for key, value in kwds.iteritems():
+ setattr(workflow_step, key, value)
+ workflow.steps.append( workflow_step )
+
+ trans.app.model.context.add(
+ workflow,
+ )
+
+ add_step(
+ type="input",
+ order_index=0,
+ )
+ add_step(
+ type="input",
+ order_index=1,
+ )
+ add_step(
+ type="tool",
+ tool_id="cat1",
+ order_index=2,
+ )
+ add_step(
+ type="tool",
+ tool_id="cat1",
+ order_index=4,
+ )
+ trans.app.model.context.flush()
+ return workflow
diff -r 84caa9526b5fe407718082dcdd7c8b65cb210175 -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde test/unit/workflows/workflow_support.py
--- /dev/null
+++ b/test/unit/workflows/workflow_support.py
@@ -0,0 +1,19 @@
+from galaxy.util import bunch
+from galaxy.model import mapping
+
+
+class MockTrans( object ):
+
+ def __init__( self ):
+ self.app = TestApp()
+
+
+class TestApp( object ):
+
+ def __init__( self ):
+ self.config = bunch.Bunch( )
+ self.model = mapping.init(
+ "/tmp",
+ "sqlite:///:memory:",
+ create_tables=True
+ )
https://bitbucket.org/galaxy/galaxy-central/commits/9664ed5cbb9f/
Changeset: 9664ed5cbb9f
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Normalize workflow input dataset dict earlier...
... this will allow linking to actual steps (referential integrity) if/when we store workflow requests in the database and failing faster.
Also more unit tests.
Affected #: 3 files
diff -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -46,12 +46,11 @@
:type param_map: dict
"""
- def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, inputs_by='step_id', param_map={} ):
+ def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, param_map={} ):
self.target_history = target_history
self.replacement_dict = replacement_dict
self.copy_inputs_to_history = copy_inputs_to_history
self.inputs = inputs
- self.inputs_by = inputs_by
self.param_map = param_map
@@ -73,9 +72,7 @@
self.target_history = workflow_run_config.target_history
self.replacement_dict = workflow_run_config.replacement_dict
self.copy_inputs_to_history = workflow_run_config.copy_inputs_to_history
- self.inputs = workflow_run_config.inputs
- self.inputs_by = workflow_run_config.inputs_by
- self.inputs_by_step_id = {}
+ self.inputs_by_step_id = workflow_run_config.inputs
self.param_map = workflow_run_config.param_map
self.outputs = odict()
@@ -223,8 +220,8 @@
outputs[ step.id ][ 'input_ds_copy' ] = new_hdca
else:
raise Exception("Unknown history content encountered")
- if self.inputs:
- outputs[ step.id ][ 'output' ] = self.inputs_by_step_id[ step.id ][ 'content' ]
+ if self.inputs_by_step_id:
+ outputs[ step.id ][ 'output' ] = self.inputs_by_step_id[ step.id ]
return job
@@ -289,20 +286,6 @@
step.module = modules.module_factory.from_workflow_step( self.trans, step )
step.state = step.module.get_runtime_state()
- # This is an input step. Make sure we have an available input.
- if step.type in [ 'data_input', 'data_collection_input' ]:
- if self.inputs_by == "step_id":
- key = str( step.id )
- elif self.inputs_by == "name":
- key = step.tool_inputs.get( 'name', None )
- else:
- key = str( step.order_index )
- if key not in self.inputs:
- message = "Workflow cannot be run because an expected input step '%s' has no input dataset." % step.id
- raise exceptions.MessageException( message )
- else:
- self.inputs_by_step_id[ step.id ] = self.inputs[ key ]
-
def _update_step_parameters(step, normalized_param_map):
param_dict = normalized_param_map.get(step.id, {})
diff -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -3,6 +3,32 @@
from galaxy.managers import histories
from galaxy.workflow.run import WorkflowRunConfig
+INPUT_STEP_TYPES = [ 'data_input', 'data_collection_input' ]
+
+
+def normalize_inputs(steps, inputs, inputs_by):
+ normalized_inputs = {}
+ for step in steps:
+ if step.type not in INPUT_STEP_TYPES:
+ continue
+
+ if inputs_by == "step_id":
+ inputs_key = str( step.id )
+ elif inputs_by == "step_index":
+ inputs_key = str( step.order_index )
+ elif inputs_by == "name":
+ inputs_key = step.tool_inputs.get( 'name', None )
+ else:
+ message = "Workflow cannot be run because unexpected inputs_by value specified."
+ raise exceptions.MessageException( message )
+ if inputs_key not in inputs:
+ message = "Workflow cannot be run because an expected input step '%s' has no input dataset." % step.id
+ raise exceptions.MessageException( message )
+
+ normalized_inputs[ step.id ] = inputs[ inputs_key ][ 'content' ]
+
+ return normalized_inputs
+
def normalize_step_parameters(steps, param_map):
""" Take a complex param_map that can reference parameters by
@@ -74,13 +100,6 @@
# of Galaxy at the time of workflow import.
inputs_by = inputs_by or 'step_index'
- valid_inputs_by = [ 'step_id', 'step_index', 'name' ]
- if inputs_by not in valid_inputs_by:
- trans.response.status = 403
- error_message_template = "Invalid inputs_by specified '%s' must be one of %s"
- error_message = error_message_template % ( inputs_by, valid_inputs_by )
- raise ValueError( error_message )
-
add_to_history = 'no_add_to_history' not in payload
history_param = payload.get('history', '')
@@ -154,14 +173,15 @@
message = "Invalid workflow input '%s' specified" % input_id
raise exceptions.ItemAccessibilityException( message )
+ normalized_inputs = normalize_inputs( workflow.steps, inputs, inputs_by )
+
# Run each step, connecting outputs to inputs
replacement_dict = payload.get('replacement_params', {})
run_config = WorkflowRunConfig(
target_history=history,
replacement_dict=replacement_dict,
- inputs=inputs,
- inputs_by=inputs_by,
+ inputs=normalized_inputs,
param_map=param_map,
)
return run_config
diff -r 483ceff2d2b6f41432cd16f4dbf539355c3f4dde -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 test/unit/workflows/test_run_parameters.py
--- a/test/unit/workflows/test_run_parameters.py
+++ b/test/unit/workflows/test_run_parameters.py
@@ -2,6 +2,9 @@
from galaxy import model
from galaxy.workflow.run_request import normalize_step_parameters
+from galaxy.workflow.run_request import normalize_inputs
+
+STEP_ID_OFFSET = 4 # Offset a little so ids and order index are different.
def test_normalize_parameters_empty():
@@ -14,34 +17,87 @@
'cat1': { 'foo': 'bar' }
} )
# Tool specified parameters are expanded out.
- assert normalized_params[ 3 ] == { 'foo': 'bar' }
- assert normalized_params[ 4 ] == { 'foo': 'bar' }
+ assert normalized_params[ STEP_ID_OFFSET + 3 ] == { 'foo': 'bar' }
+ assert normalized_params[ STEP_ID_OFFSET + 4 ] == { 'foo': 'bar' }
assert len( normalized_params.keys() ) == 2
def test_step_parameters():
normalized_params = __normalize_parameters_against_fixture( {
- '1': { 'foo': 'bar' }
+ str( STEP_ID_OFFSET + 1 ): { 'foo': 'bar' }
} )
- assert normalized_params[ 1 ] == { 'foo': 'bar' }
+ assert normalized_params[ STEP_ID_OFFSET + 1 ] == { 'foo': 'bar' }
assert len( normalized_params.keys() ) == 1
def test_step_parameters_legacy():
normalized_params = __normalize_parameters_against_fixture( {
- '1': { 'param': 'foo', 'value': 'bar' }
+ str( STEP_ID_OFFSET + 1 ): { 'param': 'foo', 'value': 'bar' }
} )
- assert normalized_params[ 1 ] == { 'foo': 'bar' }, normalized_params
+ assert normalized_params[ STEP_ID_OFFSET + 1 ] == { 'foo': 'bar' }, normalized_params
assert len( normalized_params.keys() ) == 1
+def test_inputs_by_step_id():
+ input1 = __new_input()
+ input2 = __new_input()
+ normalized_inputs = __normalize_inputs_against_fixture( {
+ str( STEP_ID_OFFSET + 1 ): input1,
+ str( STEP_ID_OFFSET + 2 ): input2
+ }, inputs_by="step_id" )
+ assert normalized_inputs[ STEP_ID_OFFSET + 1 ] == input1[ 'content' ]
+ assert normalized_inputs[ STEP_ID_OFFSET + 2 ] == input2[ 'content' ]
+
+
+def test_inputs_by_step_index():
+ input1 = __new_input()
+ input2 = __new_input()
+ normalized_inputs = __normalize_inputs_against_fixture( {
+ str( 0 ): input1,
+ str( 1 ): input2
+ }, inputs_by="step_index" )
+ assert normalized_inputs[ STEP_ID_OFFSET + 1 ] == input1[ 'content' ]
+ assert normalized_inputs[ STEP_ID_OFFSET + 2 ] == input2[ 'content' ]
+
+
+def test_inputs_by_name():
+ input1 = __new_input()
+ input2 = __new_input()
+ normalized_inputs = __normalize_inputs_against_fixture( {
+ "input1": input1,
+ "input2": input2
+ }, inputs_by="name" )
+ print normalized_inputs
+ assert normalized_inputs[ STEP_ID_OFFSET + 1 ] == input1[ 'content' ]
+ assert normalized_inputs[ STEP_ID_OFFSET + 2 ] == input2[ 'content' ]
+
+
def __normalize_parameters_against_fixture( params ):
trans = MockTrans()
+ # Create a throw away workflow so step ids and order_index
+ # are different for actual fixture.
+ __workflow_fixure( trans )
+
workflow = __workflow_fixure( trans )
normalized_params = normalize_step_parameters( workflow.steps, params )
return normalized_params
+def __normalize_inputs_against_fixture( inputs, inputs_by ):
+ trans = MockTrans()
+ # Create a throw away workflow so step ids and order_index
+ # are different for actual fixture.
+ __workflow_fixure( trans )
+
+ workflow = __workflow_fixure( trans )
+ normalized_inputs = normalize_inputs( workflow.steps, inputs, inputs_by )
+ return normalized_inputs
+
+
+def __new_input( ):
+ return dict( content=model.HistoryDatasetAssociation() )
+
+
def __workflow_fixure( trans ):
user = model.User(
email="testworkflow_params(a)bx.psu.edu",
@@ -63,12 +119,14 @@
)
add_step(
- type="input",
+ type="data_input",
order_index=0,
+ tool_inputs={"name": "input1"}
)
add_step(
- type="input",
+ type="data_input",
order_index=1,
+ tool_inputs={"name": "input2"}
)
add_step(
type="tool",
@@ -81,4 +139,8 @@
order_index=4,
)
trans.app.model.context.flush()
- return workflow
+ # Expunge and reload to ensure step state is as expected from database.
+ workflow_id = workflow.id
+ trans.app.model.context.expunge_all()
+
+ return trans.app.model.context.query( model.Workflow ).get( workflow_id )
https://bitbucket.org/galaxy/galaxy-central/commits/bdc4017c2e7e/
Changeset: bdc4017c2e7e
User: jmchilton
Date: 2014-08-10 20:05:31
Summary: Move WorkflowConfig so run_request doesn't need to import run.
This is a more logical organization of these modules.
Affected #: 2 files
diff -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 -r bdc4017c2e7e9ecb5dfa3d36798f535402ec80aa lib/galaxy/workflow/run.py
--- a/lib/galaxy/workflow/run.py
+++ b/lib/galaxy/workflow/run.py
@@ -13,47 +13,12 @@
from galaxy.tools.execute import execute
from galaxy.util.odict import odict
from galaxy.workflow import modules
+from galaxy.workflow.run_request import WorkflowRunConfig
import logging
log = logging.getLogger( __name__ )
-class WorkflowRunConfig( object ):
- """ Wrapper around all the ways a workflow execution can be parameterized.
-
- :param target_history: History to execute workflow in.
- :type target_history: galaxy.model.History.
-
- :param replacement_dict: Workflow level parameters used for renaming post
- job actions.
- :type replacement_dict: dict
-
- :param copy_inputs_to_history: Should input data parameters be copied to
- target_history. (Defaults to False)
- :type copy_inputs_to_history: bool
-
- :param inputs: Map from step ids to dict's containing HDA for these steps.
- :type inputs: dict
-
- :param inputs_by: How inputs maps to inputs (datasets/collections) to workflows
- steps - by unencoded database id ('step_id'), index in workflow
- 'step_index' (independent of database), or by input name for
- that step ('name').
- :type inputs_by: str
-
- :param param_map: Override step parameters - should be dict with step id keys and
- tool param name-value dicts as values.
- :type param_map: dict
- """
-
- def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, param_map={} ):
- self.target_history = target_history
- self.replacement_dict = replacement_dict
- self.copy_inputs_to_history = copy_inputs_to_history
- self.inputs = inputs
- self.param_map = param_map
-
-
def invoke( trans, workflow, workflow_run_config ):
""" Run the supplied workflow in the supplied target_history.
"""
diff -r 9664ed5cbb9fa654da1972772b5a3065450d2a15 -r bdc4017c2e7e9ecb5dfa3d36798f535402ec80aa lib/galaxy/workflow/run_request.py
--- a/lib/galaxy/workflow/run_request.py
+++ b/lib/galaxy/workflow/run_request.py
@@ -1,11 +1,46 @@
from galaxy import exceptions
from galaxy.managers import histories
-from galaxy.workflow.run import WorkflowRunConfig
INPUT_STEP_TYPES = [ 'data_input', 'data_collection_input' ]
+class WorkflowRunConfig( object ):
+ """ Wrapper around all the ways a workflow execution can be parameterized.
+
+ :param target_history: History to execute workflow in.
+ :type target_history: galaxy.model.History.
+
+ :param replacement_dict: Workflow level parameters used for renaming post
+ job actions.
+ :type replacement_dict: dict
+
+ :param copy_inputs_to_history: Should input data parameters be copied to
+ target_history. (Defaults to False)
+ :type copy_inputs_to_history: bool
+
+ :param inputs: Map from step ids to dict's containing HDA for these steps.
+ :type inputs: dict
+
+ :param inputs_by: How inputs maps to inputs (datasets/collections) to workflows
+ steps - by unencoded database id ('step_id'), index in workflow
+ 'step_index' (independent of database), or by input name for
+ that step ('name').
+ :type inputs_by: str
+
+ :param param_map: Override step parameters - should be dict with step id keys and
+ tool param name-value dicts as values.
+ :type param_map: dict
+ """
+
+ def __init__( self, target_history, replacement_dict, copy_inputs_to_history=False, inputs={}, param_map={} ):
+ self.target_history = target_history
+ self.replacement_dict = replacement_dict
+ self.copy_inputs_to_history = copy_inputs_to_history
+ self.inputs = inputs
+ self.param_map = param_map
+
+
def normalize_inputs(steps, inputs, inputs_by):
normalized_inputs = {}
for step in steps:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Trackster: refine label track position calculation.
by commits-noreply@bitbucket.org 10 Aug '14
by commits-noreply@bitbucket.org 10 Aug '14
10 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d85ae37476a1/
Changeset: d85ae37476a1
Branch: next-stable
User: jgoecks
Date: 2014-08-09 21:38:33
Summary: Trackster: refine label track position calculation.
Affected #: 2 files
diff -r 990bc0688199410ab08d5e8a418770b516c6f4e2 -r d85ae37476a17205c9869d633f3aafd104b48a98 static/scripts/packed/viz/trackster/tracks.js
--- a/static/scripts/packed/viz/trackster/tracks.js
+++ b/static/scripts/packed/viz/trackster/tracks.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","viz/visualization","viz/viz_views","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","viz/trackster/filters","mvc/data","mvc/tools","utils/config"],function(ab,w,V,j,s,J,h,X,P,R){var o=ab.extend;var l={};var i=function(ac,ad){l[ac.attr("id")]=ad};var k=function(ac,ad,af,ae){af=".group";l[ac.attr("id")]=ae;ac.bind("drag",{handle:"."+ad,relative:true},function(an,ao){var am=$(this),ar=$(this).parent(),aj=ar.children(".track,.group"),al=l[$(this).attr("id")],ai,ah,ap,ag,ak;ah=$(this).parents(af);if(ah.length!==0){ap=ah.position().top;ag=ap+ah.outerHeight();var aq=l[ah.attr("id")];if(ao.offsetY<ap){$(this).insertBefore(ah);aq.remove_drawable(al);aq.container.add_drawable_before(al,aq);return}else{if(ao.offsetY>ag){$(this).insertAfter(ah);aq.remove_drawable(al);aq.container.add_drawable(al);return}}}ah=null;for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));ap=ai.position().top;ag=ap+ai.outerHeight();if(ai.is(af)&&this!==ai.get(0)&&ao.offsetY>=ap&&ao.offsetY<=ag){if(ao.offsetY-ap<ag-ao.offsetY){ai.find(".content-div").prepend(this)}else{ai.find(".content-div").append(this)}if(al.container){al.container.remove_drawable(al)}l[ai.attr("id")].add_drawable(al);return}}for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));if(ao.offsetY<ai.position().top&&!(ai.hasClass("reference-track")||ai.hasClass("intro"))){break}}if(ak===aj.length){if(this!==aj.get(ak-1)){ar.append(this);l[ar.attr("id")].move_drawable(al,ak)}}else{if(this!==aj.get(ak)){$(this).insertBefore(aj.get(ak));l[ar.attr("id")].move_drawable(al,(ao.deltaY>0?ak-1:ak))}}}).bind("dragstart",function(){$(this).addClass("dragging")}).bind("dragend",function(){$(this).removeClass("dragging")})};var D=20,z=100,G=12000,Q=400,I=5000,v=100,m="Cannot display dataset due to an error. ",H="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",u="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",x="Tool cannot be rerun: ",a="Loading data...",T="Ready for display",O=10,F=20,A=["Histogram","Line","Filled","Intensity"];function U(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var p=function(ad,ac,ag){if(!p.id_counter){p.id_counter=0}this.id=p.id_counter++;this.view=ad;this.container=ac;this.drag_handle_class=ag.drag_handle_class;this.is_overview=false;this.action_icons={};this.config=R.ConfigSettingCollection.from_models_and_saved_values(this.config_params,ag.prefs);if(!this.config.get_value("name")){this.config.set_value("name",ag.name)}if(this.config_onchange){this.config.on("change",this.config_onchange,this)}this.container_div=this.build_container_div();this.header_div=null;if(ag.header!==false){var ae=new V.TrackHeaderView({model:this,id:this.id});this.header_div=ae.$el;this.container_div.append(this.header_div);var af=ae.icons_div;this.action_icons=ae.action_icons;this.container_div.hover(function(){af.show()},function(){af.hide()})}};p.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.config.get_value("content_visible")){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.config.set_value("content_visible",false)}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.config.set_value("content_visible",true);ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"gear",on_click_fn:function(ad){var ac=new R.ConfigSettingCollectionView({collection:ad.config});ac.render_in_modal("Configure Track")}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".tooltip").remove();ac.remove()}}];o(p.prototype,{config_params:[{key:"name",label:"Name",type:"text",default_value:""},{key:"content_visible",type:"bool",default_value:true,hidden:true}],config_onchange:function(){},init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.config.get_value("content_visible")){return true}return false},request_draw:function(){},_draw:function(ac){},to_dict:function(){},set_name:function(ac){this.old_name=this.config.get_value("name");this.config.set_value("name",ac)},revert_name:function(){if(this.old_name){this.config.set_value("name",this.old_name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var y=function(ad,ac,ae){p.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};o(y.prototype,p.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=n(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(ac){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad]._draw(ac)}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{prefs:this.config.to_key_value_dict(),obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables},get_tracks:function(af){var ac=this.drawables.slice(0),ad=[],ae;while(ac.length!==0){ae=ac.shift();if(ae instanceof af){ad.push(ae)}else{if(ae.drawables){ac=ac.concat(ae.drawables)}}}return ad}});var N=function(ad,ac,af){o(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});y.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);i(this.container_div,this);i(this.content_div,this);k(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new h.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.filters_manager.parent_div.after($("<div style='clear: both'/>"));this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new h.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};o(N.prototype,p.prototype,y.prototype,{action_icons_def:[p.prototype.action_icons_def[0],p.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw({clear_tile_cache:true})}ac.filters_manager.toggle()}},p.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){this.action_icons.composite_icon.toggle(this.drawables[0] instanceof e);this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao&&this.drawables[0] instanceof g){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new h.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}this.action_icons.filters_icon.toggle(this.filters_manager.filters.length>0)}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ad=new e(this.view,this.view,{name:this.config.get_value("name"),drawables:this.drawables});var ac=this.container.replace_drawable(this,ad,true);ad.request_draw()},add_drawable:function(ac){y.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){y.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=o(y.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac){ab.each(this.drawables,function(ad){ad.request_draw(ac)})}});var Y=Backbone.View.extend({initialize:function(ac){o(ac,{obj_type:"View"});y.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new w.CanvasManager(this.container.get(0).ownerDocument);this.reset();this.config=R.ConfigSettingCollection.from_models_and_saved_values([{key:"name",label:"Name",type:"text",default_value:""},{key:"a_color",label:"A Color",type:"color",default_value:"#FF0000"},{key:"c_color",label:"C Color",type:"color",default_value:"#00FF00"},{key:"g_color",label:"G Color",type:"color",default_value:"#0000FF"},{key:"t_color",label:"T Color",type:"color",default_value:"#FF00FF"},{key:"n_color",label:"N Color",type:"color",default_value:"#AAAAAA"}],{name:ac.name})},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;i(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container);var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){w.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(n(ah,ac,ac))})})});this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).addClass("chrom-nav").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}ag.stopPropagation()};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_tracks(c),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})},minLength:2})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div/>").addClass("zoom-area").css("height",ac.browser_content_div.height()+ac.top_labeltrack.height()+1).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new W(this,{content_div:this.top_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")},get_base_color:function(ac){return this.config.get_value(ac.toLowerCase()+"_color")||this.config.get_value("n_color")}});o(Y.prototype,y.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){this.intro_div.toggle(this.drawables.length===0)},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=v;var ac=this,ad=$.Deferred();$.ajax({url:galaxy_config.root+"api/genomes/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){var ah=new B(ac);ac.add_label_track(ah);ac.reference_track=ah}ac.chrom_data=ag.chrom_info;var ak='<option value="">Select Chrom/Contig</option>';for(var aj=0,af=ac.chrom_data.length;aj<af;aj++){var ai=ac.chrom_data[aj].chrom;ak+='<option value="'+ai+'">'+ai+"</option>"}if(ag.prev_chroms){ak+='<option value="previous">Previous '+v+"</option>"}if(ag.next_chroms){ak+='<option value="next">Next '+v+"</option>"}ac.chrom_select.html(ak);ac.chrom_start_index=ag.start_index;ad.resolve(ag.chrom_info)},error:function(){alert("Could not load chroms for this dbkey: "+ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-v});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+v});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad===undefined&&aj===undefined){ae.low=0;ae.high=ae.max_high}else{ae.low=(ad!==undefined?Math.max(ad,0):0);if(aj===undefined){ae.low=Math.max(ae.low-15,0);ae.high=ae.low+30}else{ae.high=Math.min(aj,ae.max_high)}}ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/,/g,"");ag=ag.replace(/:|\-/g," ");var ad=ag.split(/\s+/),af=ad[0],ae=(ad[1]?parseInt(ad[1],10):undefined),ac=(ad[2]?parseInt(ad[2],10):undefined);this.change_chrom(af,ae,ac)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw({data_fetch:false});if(this.redraw_on_move_fn){clearTimeout(this.redraw_on_move_fn)}this.redraw_on_move_fn=setTimeout(function(){ac.request_redraw()},200);var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ad){y.prototype.add_drawable.call(this,ad);ad.init();this.changed();this.update_intro_div();var ac=this;ad.config.on("change",function(){ac.changed()})},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){y.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ad,ae){var ac=this,af=(ae?[ae]:ac.drawables);ab.each(af,function(ag){var ah=ab.find(ac.tracks_to_be_redrawn,function(ai){return ai[0]===ag});if(ah){ah[1]=ad}else{ac.tracks_to_be_redrawn.push([ag,ad])}});if(!this.requested_redraw){requestAnimationFrame(function(){ac._redraw()});this.requested_redraw=true}},_redraw:function(){this.requested_redraw=false;var ac=this.low,ag=this.high;if(ac<this.max_low){ac=this.max_low}if(ag>this.max_high){ag=this.max_high}var ad=this.high-this.low;if(this.high!==0&&ad<this.min_separation){ag=ac+this.min_separation}this.low=Math.floor(ac);this.high=Math.ceil(ag);this.update_location(this.low,this.high);this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var af=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ah=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:af,width:Math.max(ae,ah)}).show();if(ah<ae){this.overview_box.css("left",af-(ae-ah)/2)}if(this.overview_highlight){this.overview_highlight.css({left:af,width:ah})}ab.each(this.tracks_to_be_redrawn,function(ak){var ai=ak[0],aj=ak[1];if(ai){ai._draw(aj)}});this.tracks_to_be_redrawn=[];ab.each(this.label_tracks,function(ai){ai._draw()})},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_viewport:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height())},resize_window:function(){this.resize_viewport();this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset.id===ae.dataset.id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var q=P.Tool.extend({defaults:{track:null},initialize:function(ac){P.Tool.prototype.initialize.call(this,ac);var ad=true;if(ac.tool_state!==undefined&&ac.tool_state.hidden!==undefined){ad=ac.tool_state.hidden}this.set("hidden",ad);this.remove_inputs(["data","hidden_data","conditional"])},state_dict:function(ac){return ab.extend(this.get_inputs_dict(),{hidden:!this.is_visible()})}});var t=Backbone.View.extend({events:{"change :input":"update_value"},render:function(){var ae=this.$el.addClass("param-row"),af=this.model;var ac=$("<div>").addClass("param-label").text(af.get("label")).appendTo(ae);var ad=$("<div/>").addClass("param-input").html(af.get("html")).appendTo(ae);ad.find(":input").val(af.get("value"));$("<div style='clear: both;'/>").appendTo(ae)},update_value:function(ac){this.model.set_value($(ac.target).val())}});var aa=Backbone.View.extend({initialize:function(ac){this.model.on("change:hidden",this.set_visible,this)},render:function(){var ad=this;tool=this.model,parent_div=this.$el.addClass("dynamic-tool").hide();parent_div.bind("drag",function(ah){ah.stopPropagation()}).click(function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()}).keydown(function(ah){ah.stopPropagation()});var ae=$("<div class='tool-name'>").appendTo(parent_div).text(tool.get("name"));tool.get("inputs").each(function(ai){var ah=new t({model:ai});ah.render();parent_div.append(ah.$el)});parent_div.find("input").click(function(){$(this).select()});var af=$("<div>").addClass("param-row").appendTo(parent_div);var ag=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(af);var ac=$("<input type='submit'>").attr("value","Run on visible region").appendTo(af);ac.click(function(){ad.run_on_region()});ag.click(function(){ad.run_on_dataset()});if(tool.is_visible()){this.$el.show()}},set_visible:function(){this.$el.toggle(this.model.is_visible())},update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},run_on_dataset:function(){var ac=this.model;this.run({target_dataset_id:this.model.get("track").dataset.id,action:"rerun",tool_id:ac.id},null,function(ad){Galaxy.modal.show({title:ac.get("name")+" is Running",body:ac.get("name")+" is running on the complete dataset. Tool outputs are in dataset's history.",buttons:{Close:function(){Galaxy.modal.hide()}}})})},run_on_region:function(){var ad=this.model.get("track"),ag=this.model,ai=new w.GenomeRegion({chrom:ad.view.chrom,start:ad.view.low,end:ad.view.high}),aj={target_dataset_id:ad.dataset.id,action:"rerun",tool_id:ag.id,regions:[ai.toJSON()]},ah=ad,al=ag.get("name")+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ak=new N(view,view,{name:ad.config.get_value("name")});var af=ah.container.replace_drawable(ah,ak,false);ak.container_div.insertBefore(ah.view.content_div.children()[af]);ak.add_drawable(ah);ah.container_div.appendTo(ak.content_div);ac=ak}else{ac=ah.container}var ae=new ah.constructor(view,ac,{name:al,hda_ldda:"hda"});ae.init_for_tool_data();ae.change_mode(ah.mode);ae.set_filters_manager(ah.filters_manager.copy(ae));ae.update_icons();ac.add_drawable(ae);ae.tiles_div.text("Starting job.");this.run(aj,ae,function(am){ae.set_dataset(new X.Dataset(am));ae.tiles_div.text("Running job.");ae.init()})},run:function(ac,ae,af){ac.inputs=this.model.get_inputs_dict();var ad=new j.ServerStateDeferred({ajax_settings:{url:galaxy_config.root+"api/tools",data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(H)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(x+ag.message)}else{af(ag)}}})}});var C=function(ac,ad){J.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var b=function(ac,af,ag,ad,ae){this.track=ac;this.region=af;this.low=af.get("start");this.high=af.get("end");this.w_scale=ag;this.canvas=ad;this.html_elt=$("<div class='track-tile'/>").append(ad);this.data=ae;this.stale=false};b.prototype.predisplay_actions=function(){};var K=function(ac,af,ag,ad,ae){b.call(this,ac,af,ag,ad,ae)};K.prototype.predisplay_actions=function(){};var M=function(ae,aj,al,ad,ag,ah,am,ac,ai,af,ak){b.call(this,ae,aj,al,ad,ag);this.mode=ah;this.all_slotted=ac;this.feature_mapper=ai;this.has_icons=false;this.incomplete_features=af;this.other_tiles_features_drawn={};this.seq_data=ak};o(M.prototype,b.prototype);M.prototype.predisplay_actions=function(){};var f=function(ad,ac,ae){o(ae,{drag_handle_class:"draghandle"});p.call(this,ad,ac,ae);this.dataset=null;if(ae.dataset){this.dataset=(ae.dataset instanceof Backbone.Model?ae.dataset:new X.Dataset(ae.dataset))}this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:I);this.data_manager=("data_manager" in ae?ae.data_manager:new w.GenomeDataManager({dataset:this.dataset,genome:new w.Genome({key:ad.dbkey,chroms_info:{chrom_info:ad.chrom_data}}),data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=this.config.get_value("height");this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};o(f.prototype,p.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},p.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"application-dock-270",on_click_fn:function(ac){ac.view.set_overview(ac)}},p.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.tool.toggle();if(ac.tool.is_visible()){ac.set_name(ac.config.get_value("name")+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.get("name") %><br/><strong>Dataset</strong>: <%= track.config.get_value("name") %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new w.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new w.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}Galaxy.modal.hide();window.location.href=galaxy_config.root+"visualization/sweepster?"+$.param({dataset_id:ac.dataset.id,hda_ldda:ac.dataset.get("hda_ldda"),regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};Galaxy.modal.show({title:"Visualize tool parameter space and output from different parameter settings?",body:ae,buttons:{No:ah,Yes:ad}})}},p.prototype.action_icons_def[2]],can_draw:function(){return this.dataset&&p.prototype.can_draw.call(this)},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id)},set_dataset:function(ac){this.dataset=ac;this.data_manager.set("dataset",ac)},on_resize:function(){this.request_draw({clear_tile_cache:true})},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.config.get_value("content_visible")){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.set_value("height",ac.visible_height_px);ac.changed()}).appendTo(ac.container_div)},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof W){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof g){return"LineTrack"}else{if(this instanceof S){return"ReadTrack"}else{if(this instanceof Z){return"VariantTrack"}else{if(this instanceof e){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},show_message:function(ac){this.tiles_div.remove();return $("<span/>").addClass("message").html(ac).appendTo(this.content_div)},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.children().remove();ad.container_div.removeClass("nodata error pending");ad.tiles_div=$("<div/>").addClass("tiles").appendTo(ad.content_div);if(!ad.dataset.id){return}var ac=$.Deferred(),af={hda_ldda:ad.dataset.get("hda_ldda"),data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");var ah=ad.show_message(m);if(ag.message){ah.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){Galaxy.modal.show({title:"Trackster Error",body:"<pre>"+ag.message+"</pre>",buttons:{Close:function(){Galaxy.modal.hide()}}})}));ah.append($("<span/>").text(" "));ah.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.show_message(H)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.show_message(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.show_message(u);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(T);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when.apply($,ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(af&&af.min&&af.max){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_default_value("min_value",ae);ac.config.set_default_value("max_value",ag);ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},get_drawables:function(){return this}});var L=function(ae,ad,ag){f.call(this,ae,ad,ag);var ac=this;k(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new h.FiltersManager(this,("filters" in ag?ag.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=(ag.tool?new q(ab.extend(ag.tool,{track:this,tool_state:ag.tool_state})):null);this.tile_cache=new w.Cache(O);this.left_offset=0;if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){var af=new aa({model:this.tool});af.render();this.dynamic_tool_div=af.$el;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);if(!this.config.get_value("content_visible")){this.tiles_div.hide()}this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(ag.mode){this.change_mode(ag.mode)}};o(L.prototype,p.prototype,f.prototype,{action_icons_def:f.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw({clear_tile_cache:true})},hide:true}]),copy:function(ac){var ad=this.to_dict();o(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),dataset:{id:this.dataset.id,hda_ldda:this.dataset.get("hda_ldda")},prefs:this.config.to_key_value_dict(),mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},set_min_max:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(isNaN(parseFloat(ac.config.get_value("min_value")))||isNaN(parseFloat(ac.config.get_value("max_value")))){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.set_value("mode",ad);if(ad==="Auto"){this.data_manager.clear()}ac.request_draw({clear_tile_cache:true});this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;ac.action_icons.filters_icon.toggle(ac.filters_available);ac.action_icons.tools_icon.toggle(ac.tool!==null);ac.action_icons.param_space_viz_icon.toggle(ac.tool!==null)},_gen_tile_cache_key:function(ad,ac){return ad+"_"+ac},request_draw:function(ac){if(ac&&ac.clear_tile_cache){this.tile_cache.clear()}this.view.request_redraw(ac,this)},before_draw:function(){this.max_height_px=0},_draw:function(aq){if(!this.can_draw()){return}var an=aq&&aq.clear_after,al=this.view.low,ag=this.view.high,aj=ag-al,ad=this.view.container.width(),ap=this.view.resolution_px_b,af=1/ap;if(this.is_overview){al=this.view.max_low;ag=this.view.max_high;ap=ad/(view.max_high-view.max_low);af=1/ap}this.before_draw();this.tiles_div.children().addClass("remove");var ak=Math.floor(Q*af),ac=Math.floor(al/ak),am,ah,ai=[],ao=[];while((ac*ak)<ag){am=new w.GenomeRegion({chrom:this.view.chrom,start:ac*ak,end:Math.min((ac+1)*ak,this.view.max_high)});ah=this.draw_helper(am,ap,aq);ai.push(ah);$.when(ah).then(function(ar){ao.push(ar)});ac+=1}if(!an){this.tiles_div.children(".remove").removeClass("remove").remove()}var ae=this;$.when.apply($,ai).then(function(){ae.tiles_div.children(".remove").remove();ao=ab.filter(ao,function(ar){return ar!==null});if(ao.length!==0){ae.postdraw_actions(ao,ad,ap,an)}})},_add_yaxis_label:function(af,ah){var ad=this,ag=(af==="max"?"top":"bottom"),ai=(af==="max"?"max":"min"),ac=(af==="max"?"max_value":"min_value"),ae=this.container_div.find(".yaxislabel."+ag);ah=ah||function(){ad.request_draw({clear_tile_cache:true})};if(ae.length!==0){ae.text(ad.config.get_value(ac))}else{ae=$("<div/>").text(ad.config.get_value(ac)).make_text_editable({num_cols:12,on_finish:function(aj){$(".tooltip").remove();ad.config.set_value(ac,aj);ah()},help_text:"Set "+ai+" value"}).addClass("yaxislabel "+ag).css("color",this.config.get_value("label_color"));this.container_div.prepend(ae)}},postdraw_actions:function(af,ag,ai,ac){var ae=ab.filter(af,function(aj){return(aj instanceof K)});if(ae.length>0){this.max_height_px=0;var ad=this;ab.each(af,function(aj){if(!(aj instanceof K)){aj.html_elt.remove();ad.draw_helper(aj.region,ai,{force:true,mode:"Coverage"})}});ad._add_yaxis_label("max")}else{this.container_div.find(".yaxislabel").remove();var ah=ab.find(af,function(aj){return aj.has_icons});if(ah){ab.each(af,function(aj){if(!aj.has_icons){aj.html_elt.css("padding-top",D)}})}}},get_mode:function(ac){return this.mode},update_auto_mode:function(ac){},_get_drawables:function(){return[this]},draw_helper:function(al,an,ao){if(!ao){ao={}}var ad=ao.force,ai=ao.mode||this.mode,af=1/an,ae=this,ag=this._get_drawables(),am=this._gen_tile_cache_key(an,al),ah=function(ap){return(ap&&"track" in ap)};var aj=(ad?undefined:ae.tile_cache.get_elt(am));if(aj){if(ah(aj)){ae.show_tile(aj,an)}return aj}if(ao.data_fetch===false){return null}var ak=function(){var ap=(ab.find(A,function(ar){return ar===ai})?"Coverage":ai);var aq=ab.map(ag,function(ar){return ar.data_manager.get_data(al,ap,af,ae.data_url_extra_params)});if(view.reference_track){aq.push(view.reference_track.data_manager.get_data(al,ai,af,view.reference_track.data_url_extra_params))}return aq};var ac=$.Deferred();ae.tile_cache.set_elt(am,ac);$.when.apply($,ak()).then(function(){var ap=ak(),av=ap,aB;if(ab.find(ap,function(aD){return j.is_deferred(aD)})){ae.tile_cache.set_elt(am,undefined);$.when(ae.draw_helper(al,an,ao)).then(function(aD){ac.resolve(aD)});return}if(view.reference_track){aB=view.reference_track.data_manager.subset_entry(ap.pop(),al)}var aw=[],at=[];ab.each(ag,function(aG,aD){var aF=aG.mode,aE=av[aD];if(aF==="Auto"){aF=aG.get_mode(aE);aG.update_auto_mode(aF)}aw.push(aF);at.push(aG.get_canvas_height(aE,aF,an,aq))});var au=ae.view.canvas_manager.new_canvas(),ax=al.get("start"),aC=al.get("end"),ar=0,aq=Math.ceil((aC-ax)*an)+ae.left_offset,az=ab.max(at),ay;au.width=aq;au.height=(ao.height||az);var aA=au.getContext("2d");aA.translate(ae.left_offset,0);if(ag.length>1){aA.globalAlpha=0.5;aA.globalCompositeOperation="source-over"}ab.each(ag,function(aE,aD){ay=aE.draw_tile(av[aD],aA,aw[aD],al,an,aB)});if(ay!==undefined){ae.tile_cache.set_elt(am,ay);ae.show_tile(ay,an)}ac.resolve(ay)});return ac},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},_draw_line_track_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.LinePainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new K(this,ag,ai,af,ac.data)},draw_tile:function(ac,ad,ag,af,ah,ae){},show_tile:function(ae,ah){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=Math.round((ae.low-(this.is_overview?this.view.max_low:this.view.low))*ah);if(this.left_offset){ag-=this.left_offset}ac.css("left",ag);if(ac.hasClass("remove")){ac.removeClass("remove")}else{this.tiles_div.append(ac)}ac.css("height","auto");this.max_height_px=Math.max(this.max_height_px,ac.height()-2);ac.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},tool_region_and_parameters_str:function(af){var ac=this,ae=(af!==undefined?af.toString():"all"),ad=ab.values(ac.tool.get_inputs_dict()).join(", ");return" - region=["+ae+"], parameters=["+ad+"]"},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="bigwig"}else{if(ac.dataset_type==="bigwig"||ac.extra_info==="no_detail"){return false}else{return true}}}},can_subset:function(ac){if(ac.message||ac.extra_info==="no_detail"){return false}else{if(ac.dataset_type==="bigwig"){return(ac.data[1][0]-ac.data[0][0]===1)}}return true},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state"}});var W=function(ad,ac){f.call(this,ad,ac,{resize:false,header:false});this.container_div.addClass("label-track")};o(W.prototype,f.prototype,{init:function(){this.enabled=true},predraw_init:function(){},_draw:function(ag){var ae=this.view,af=ae.high-ae.low,aj=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/aj)*aj,ah=this.view.container.width(),ad=$("<div/>").addClass("label-container");while(ac<ae.high){var ai=(ac-ae.low)/af*ah;ad.append($("<div/>").addClass("label").text(commatize(ac)).css({left:ai}));ac+=aj}this.content_div.children(":first").remove();this.content_div.append(ad)}});var e=function(ad,ac,ag){L.call(this,ad,ac,ag);this.drawables=[];if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=n(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}ab.each(this.drawables,function(ah){if(ah instanceof c||ah instanceof S){ah.change_mode("Coverage")}});this.update_icons();this.obj_type="CompositeTrack"};o(e.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_group()}}].concat(L.prototype.action_icons_def),to_dict:y.prototype.to_dict,add_drawable:y.prototype.add_drawable,unpack_drawables:y.prototype.unpack_drawables,config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},on_resize:function(){var ac=this.visible_height_px;ab.each(this.drawables,function(ad){ad.visible_height_px=ac});f.prototype.on_resize.call(this)},change_mode:function(ac){L.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:p.prototype.can_draw,_get_drawables:function(){return this.drawables},show_group:function(){var af=new N(this.view,this.container,{name:this.config.get_value("name")}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw({clear_tile_cache:true})},before_draw:function(){var ad=ab.min(ab.map(this.drawables,function(ae){return ae.config.get_value("min_value")})),ac=ab.max(ab.map(this.drawables,function(ae){return ae.config.get_value("max_value")}));this.config.set_value("min_value",ad);this.config.set_value("max_value",ac);ab.each(this.drawables,function(ae){ae.config.set_value("min_value",ad);ae.config.set_value("max_value",ac)})},update_all_min_max:function(){var ad=this,ac=this.config.get_value("min_value"),ae=this.config.get_value("max_value");ab.each(this.drawables,function(af){af.config.set_value("min_value",ac);af.config.set_value("max_value",ae)});this.request_draw({clear_tile_cache:true})},postdraw_actions:function(ai,ac,al,ah){var ag=-1,ae;for(ae=0;ae<ai.length;ae++){var aj=ai[ae].html_elt.find("canvas").height();if(aj>ag){ag=aj}}for(ae=0;ae<ai.length;ae++){var af=ai[ae];if(af.html_elt.find("canvas").height()!==ag){this.draw_helper(af.region,al,{force:true,height:ag});af.html_elt.remove()}}var ad=this,ak=function(){ad.update_all_min_max()};this._add_yaxis_label("min",ak);this._add_yaxis_label("max",ak)}});var B=function(ac){L.call(this,ac,{content_div:ac.top_labeltrack},{resize:false,header:false});this.left_offset=ac.canvas_manager.char_width_px;this.container_div.addClass("reference-track");this.data_url=galaxy_config.root+"api/genomes/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new w.GenomeReferenceDataManager({data_url:this.data_url,can_subset:this.can_subset});this.hide_contents()};o(B.prototype,p.prototype,L.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"height",type:"int",default_value:13,hidden:true}]),init:function(){this.data_manager.clear();this.enabled=true},predraw_init:function(){},can_draw:p.prototype.can_draw,draw_helper:function(af,ah,ad){var ac=this.tiles_div.is(":visible"),ag,ae=null;if(ah>this.view.canvas_manager.char_width_px){this.tiles_div.show();ag=true;ae=L.prototype.draw_helper.call(this,af,ah,ad)}else{ag=false;this.tiles_div.hide()}if(ac!==ag){this.view.resize_viewport()}return ae},can_subset:function(ac){return true},draw_tile:function(ae,ak,af,ah,al){var ad=this.data_manager.subset_entry(ae,ah),aj=ad.data;var ac=ak.canvas;ak.font=ak.canvas.manager.default_font;ak.textAlign="center";for(var ag=0,ai=aj.length;ag<ai;ag++){ak.fillStyle=this.view.get_base_color(aj[ag]);ak.fillText(aj[ag],Math.floor(ag*al),10)}return new b(this,ah,al,ac,ad)}});var g=function(ad,ac,ae){this.mode="Histogram";L.call(this,ad,ac,ae)};o(g.prototype,p.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Color",type:"color"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},before_draw:function(){},draw_tile:function(ac,ad,af,ae,ag){return this._draw_line_track_tile(ac,ad,af,ae,ag)},can_subset:function(ac){return(ac.data[1][0]-ac.data[0][0]===1)},postdraw_actions:function(ad,ae,af,ac){this._add_yaxis_label("max");this._add_yaxis_label("min")}});var r=function(ad,ac,ae){this.mode="Heatmap";L.call(this,ad,ac,ae)};o(r.prototype,p.prototype,L.prototype,{display_modes:["Heatmap"],config_params:ab.union(p.prototype.config_params,[{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.DiagonalHeatmapPainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new b(this,ag,ai,af,ac.data)}});var c=function(ad,ac,ae){L.call(this,ad,ac,ae);this.container_div.addClass("feature-track");this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};o(c.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Block color",type:"color"},{key:"reverse_strand_color",label:"Antisense strand color",type:"color"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.set_painter_from_config();this.request_draw({clear_tile_cache:true})},set_painter_from_config:function(){if(this.config.get_value("connector_style")==="arcs"){this.painter=J.ArcLinkedFeaturePainter}else{this.painter=J.LinkedFeaturePainter}},postdraw_actions:function(ao,af,aq,an){L.prototype.postdraw_actions.call(this,ao,af,aq,an);var ah=this,ai,am=ab.filter(ao,function(ar){return(ar instanceof K)});if(am.length===0){var ac={};ab.each(ab.pluck(ao,"incomplete_features"),function(ar){ab.each(ar,function(at){ac[at[0]]=at})});var ap=this;ab.each(ao,function(av){var aw=ab.omit(ac,ab.map(av.incomplete_features,function(ay){return ay[0]}));aw=ab.omit(aw,ab.keys(av.other_tiles_features_drawn));if(ab.size(aw)!==0){var at={data:ab.values(aw)},au=ap.view.canvas_manager.new_canvas(),ar=au.getContext("2d");au.height=Math.max(av.canvas.height,ap.get_canvas_height(at,av.mode,av.w_scale,100));au.width=av.canvas.width;ar.drawImage(av.canvas,0,0);ar.translate(ah.left_offset,0);var ax=ap.draw_tile(at,ar,av.mode,av.region,av.w_scale,av.seq_data);$(av.canvas).replaceWith($(ax.canvas));av.canvas=au;ab.extend(av.other_tiles_features_drawn,ac)}})}if(ah.filters_manager){var ag=ah.filters_manager.filters,ak;for(ak=0;ak<ag.length;ak++){ag[ak].update_ui_elt()}var aj=false,al,ae;for(ai=0;ai<ao.length;ai++){if(ao[ai].data.length){al=ao[ai].data[0];for(ak=0;ak<ag.length;ak++){ae=ag[ak];if(ae.applies_to(al)&&ae.min!==ae.max){aj=true;break}}}}if(ah.filters_available!==aj){ah.filters_available=aj;if(!ah.filters_available){ah.filters_manager.hide()}ah.update_icons()}}if(ao[0] instanceof M){var ad=true;for(ai=0;ai<ao.length;ai++){if(!ao[ai].all_slotted){ad=false;break}}this.action_icons.show_more_rows_icon.toggle(!ad)}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (s.FeatureSlotter)(ag,af,z,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>G){mode="Squish"}else{mode="Pack"}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="Coverage"||ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return Math.max(this.min_height_px,ae.get_required_height(af,ad))}},draw_tile:function(an,at,aq,ag,ak,af,ao){var ar=this,ae=at.canvas,az=ag.get("start"),ad=ag.get("end"),ah=this.left_offset;if(an.dataset_type==="bigwig"){return this._draw_line_track_tile(an,at,aq,ag,ak)}var aj=[],ap=this.slotters[ak].slots;all_slotted=true;if(an.data){var al=this.filters_manager.filters;for(var au=0,aw=an.data.length;au<aw;au++){var ai=an.data[au];var av=false;var am;for(var ay=0,aD=al.length;ay<aD;ay++){am=al[ay];am.update_attrs(ai);if(!am.keep(ai)){av=true;break}}if(!av){aj.push(ai);if(!(ai[0] in ap)){all_slotted=false}}}}var aC=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null),aA=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null),aB=new (this.painter)(aj,az,ad,this.config.to_key_value_dict(),aq,aC,aA,af,function(aE){return ar.view.get_base_color(aE)});var ax=null;at.fillStyle=this.config.get_value("block_color");at.font=at.canvas.manager.default_font;at.textAlign="right";if(an.data){var ac=aB.draw(at,ae.width,ae.height,ak,ap);ax=ac.feature_mapper;incomplete_features=ac.incomplete_features;ax.translation=-ah}if(!ao){return new M(ar,ag,ak,ae,an.data,aq,an.message,all_slotted,ax,incomplete_features,af)}}});var Z=function(ad,ac,ae){L.call(this,ad,ac,ae);this.painter=J.VariantPainter;this.summary_draw_height=30;this.left_offset=30};o(Z.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Histogram color",type:"color"},{key:"show_sample_data",label:"Show sample data",type:"bool",default_value:true},{key:"show_labels",label:"Show summary and sample labels",type:"bool",default_value:true},{key:"summary_height",label:"Locus summary height",type:"float",default_value:20},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,af,ah,ag,ai){if(ac.dataset_type==="bigwig"){return this._draw_line_track_tile(ac,af,"Histogram",ag,ai)}else{var ae=this.view,ad=new (this.painter)(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah,function(aj){return ae.get_base_color(aj)});ad.draw(af,af.canvas.width,af.canvas.height,ai);return new b(this,ag,ai,af.canvas,ac.data)}},get_canvas_height:function(ac,ag,ah,ae){if(ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var ad=(this.dataset.get_metadata("sample_names")?this.dataset.get_metadata("sample_names").length:0);if(ad===0&&ac.data.length!==0){ad=ac.data[0][7].match(/,/g);if(ad===null){ad=1}else{ad=ad.length+1}}var af=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return af.get_required_height(ad)}},predraw_init:function(){var ac=[f.prototype.predraw_init.call(this)];if(!this.dataset.get_metadata("sample_names")){ac.push(this.dataset.fetch())}return ac},postdraw_actions:function(ag,ah,aj,ad){L.prototype.postdraw_actions.call(this,ag,ah,aj,ad);var af=ab.filter(ag,function(ak){return(ak instanceof K)});var ae=this.dataset.get_metadata("sample_names");if(af.length===0&&this.config.get_value("show_labels")&&ae&&ae.length>1){var ac;if(this.container_div.find(".yaxislabel.variant").length===0){ac=this.config.get_value("summary_height")/2;this.tiles_div.prepend($("<div/>").text("Summary").addClass("yaxislabel variant top").css({"font-size":ac+"px",top:(this.config.get_value("summary_height")-ac)/2+"px"}));if(this.config.get_value("show_sample_data")){var ai=ae.join("<br/>");this.tiles_div.prepend($("<div/>").html(ai).addClass("yaxislabel variant top sample").css({top:this.config.get_value("summary_height")}))}}ac=(this.mode==="Squish"?5:10)+"px";$(this.tiles_div).find(".sample").css({"font-size":ac,"line-height":ac});$(this.tiles_div).find(".yaxislabel").css("color",this.config.get_value("label_color"))}else{this.container_div.find(".yaxislabel.variant").remove()}}});var S=function(ad,ac,ae){c.call(this,ad,ac,ae);this.painter=J.ReadPainter;this.update_icons()};o(S.prototype,p.prototype,L.prototype,c.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Histogram color",type:"color"},{key:"detail_block_color",label:"Sense strand block color",type:"color",default_value:"#AAAAAA"},{key:"reverse_strand_color",label:"Antisense strand block color",type:"color",default_value:"#DDDDDD"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})}});var d={CompositeTrack:e,DrawableGroup:N,DiagonalHeatmapTrack:r,FeatureTrack:c,LineTrack:g,ReadTrack:S,VariantTrack:Z,VcfTrack:Z};var n=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Y,DrawableGroup:N,LineTrack:g,FeatureTrack:c,DiagonalHeatmapTrack:r,ReadTrack:S,VariantTrack:Z,CompositeTrack:e,object_from_template:n}});
\ No newline at end of file
+define(["libs/underscore","viz/visualization","viz/viz_views","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","viz/trackster/filters","mvc/data","mvc/tools","utils/config"],function(ab,w,V,j,s,J,h,X,P,R){var o=ab.extend;var l={};var i=function(ac,ad){l[ac.attr("id")]=ad};var k=function(ac,ad,af,ae){af=".group";l[ac.attr("id")]=ae;ac.bind("drag",{handle:"."+ad,relative:true},function(an,ao){var am=$(this),ar=$(this).parent(),aj=ar.children(".track,.group"),al=l[$(this).attr("id")],ai,ah,ap,ag,ak;ah=$(this).parents(af);if(ah.length!==0){ap=ah.position().top;ag=ap+ah.outerHeight();var aq=l[ah.attr("id")];if(ao.offsetY<ap){$(this).insertBefore(ah);aq.remove_drawable(al);aq.container.add_drawable_before(al,aq);return}else{if(ao.offsetY>ag){$(this).insertAfter(ah);aq.remove_drawable(al);aq.container.add_drawable(al);return}}}ah=null;for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));ap=ai.position().top;ag=ap+ai.outerHeight();if(ai.is(af)&&this!==ai.get(0)&&ao.offsetY>=ap&&ao.offsetY<=ag){if(ao.offsetY-ap<ag-ao.offsetY){ai.find(".content-div").prepend(this)}else{ai.find(".content-div").append(this)}if(al.container){al.container.remove_drawable(al)}l[ai.attr("id")].add_drawable(al);return}}for(ak=0;ak<aj.length;ak++){ai=$(aj.get(ak));if(ao.offsetY<ai.position().top&&!(ai.hasClass("reference-track")||ai.hasClass("intro"))){break}}if(ak===aj.length){if(this!==aj.get(ak-1)){ar.append(this);l[ar.attr("id")].move_drawable(al,ak)}}else{if(this!==aj.get(ak)){$(this).insertBefore(aj.get(ak));l[ar.attr("id")].move_drawable(al,(ao.deltaY>0?ak-1:ak))}}}).bind("dragstart",function(){$(this).addClass("dragging")}).bind("dragend",function(){$(this).removeClass("dragging")})};var D=20,z=100,G=12000,Q=400,I=5000,v=100,m="Cannot display dataset due to an error. ",H="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",u="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",x="Tool cannot be rerun: ",a="Loading data...",T="Ready for display",O=10,F=20,A=["Histogram","Line","Filled","Intensity"];function U(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var p=function(ad,ac,ag){if(!p.id_counter){p.id_counter=0}this.id=p.id_counter++;this.view=ad;this.container=ac;this.drag_handle_class=ag.drag_handle_class;this.is_overview=false;this.action_icons={};this.config=R.ConfigSettingCollection.from_models_and_saved_values(this.config_params,ag.prefs);if(!this.config.get_value("name")){this.config.set_value("name",ag.name)}if(this.config_onchange){this.config.on("change",this.config_onchange,this)}this.container_div=this.build_container_div();this.header_div=null;if(ag.header!==false){var ae=new V.TrackHeaderView({model:this,id:this.id});this.header_div=ae.$el;this.container_div.append(this.header_div);var af=ae.icons_div;this.action_icons=ae.action_icons;this.container_div.hover(function(){af.show()},function(){af.hide()})}};p.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.config.get_value("content_visible")){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.config.set_value("content_visible",false)}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.config.set_value("content_visible",true);ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"gear",on_click_fn:function(ad){var ac=new R.ConfigSettingCollectionView({collection:ad.config});ac.render_in_modal("Configure Track")}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".tooltip").remove();ac.remove()}}];o(p.prototype,{config_params:[{key:"name",label:"Name",type:"text",default_value:""},{key:"content_visible",type:"bool",default_value:true,hidden:true}],config_onchange:function(){},init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.config.get_value("content_visible")){return true}return false},request_draw:function(){},_draw:function(ac){},to_dict:function(){},set_name:function(ac){this.old_name=this.config.get_value("name");this.config.set_value("name",ac)},revert_name:function(){if(this.old_name){this.config.set_value("name",this.old_name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var y=function(ad,ac,ae){p.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};o(y.prototype,p.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=n(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(ac){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad]._draw(ac)}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{prefs:this.config.to_key_value_dict(),obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables},get_tracks:function(af){var ac=this.drawables.slice(0),ad=[],ae;while(ac.length!==0){ae=ac.shift();if(ae instanceof af){ad.push(ae)}else{if(ae.drawables){ac=ac.concat(ae.drawables)}}}return ad}});var N=function(ad,ac,af){o(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});y.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);i(this.container_div,this);i(this.content_div,this);k(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new h.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.filters_manager.parent_div.after($("<div style='clear: both'/>"));this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new h.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};o(N.prototype,p.prototype,y.prototype,{action_icons_def:[p.prototype.action_icons_def[0],p.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw({clear_tile_cache:true})}ac.filters_manager.toggle()}},p.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){this.action_icons.composite_icon.toggle(this.drawables[0] instanceof e);this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao&&this.drawables[0] instanceof g){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new h.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}this.action_icons.filters_icon.toggle(this.filters_manager.filters.length>0)}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ad=new e(this.view,this.view,{name:this.config.get_value("name"),drawables:this.drawables});var ac=this.container.replace_drawable(this,ad,true);ad.request_draw()},add_drawable:function(ac){y.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){y.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=o(y.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac){ab.each(this.drawables,function(ad){ad.request_draw(ac)})}});var Y=Backbone.View.extend({initialize:function(ac){o(ac,{obj_type:"View"});y.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new w.CanvasManager(this.container.get(0).ownerDocument);this.reset();this.config=R.ConfigSettingCollection.from_models_and_saved_values([{key:"name",label:"Name",type:"text",default_value:""},{key:"a_color",label:"A Color",type:"color",default_value:"#FF0000"},{key:"c_color",label:"C Color",type:"color",default_value:"#00FF00"},{key:"g_color",label:"G Color",type:"color",default_value:"#0000FF"},{key:"t_color",label:"T Color",type:"color",default_value:"#FF00FF"},{key:"n_color",label:"N Color",type:"color",default_value:"#AAAAAA"}],{name:ac.name})},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;i(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container);var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){w.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(n(ah,ac,ac))})})});this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).addClass("chrom-nav").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}ag.stopPropagation()};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_tracks(c),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})},minLength:2})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div/>").addClass("zoom-area").css("height",ac.browser_content_div.height()+ac.top_labeltrack.height()+1).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new W(this,{content_div:this.top_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")},get_base_color:function(ac){return this.config.get_value(ac.toLowerCase()+"_color")||this.config.get_value("n_color")}});o(Y.prototype,y.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){this.intro_div.toggle(this.drawables.length===0)},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=v;var ac=this,ad=$.Deferred();$.ajax({url:galaxy_config.root+"api/genomes/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){var ah=new B(ac);ac.add_label_track(ah);ac.reference_track=ah}ac.chrom_data=ag.chrom_info;var ak='<option value="">Select Chrom/Contig</option>';for(var aj=0,af=ac.chrom_data.length;aj<af;aj++){var ai=ac.chrom_data[aj].chrom;ak+='<option value="'+ai+'">'+ai+"</option>"}if(ag.prev_chroms){ak+='<option value="previous">Previous '+v+"</option>"}if(ag.next_chroms){ak+='<option value="next">Next '+v+"</option>"}ac.chrom_select.html(ak);ac.chrom_start_index=ag.start_index;ad.resolve(ag.chrom_info)},error:function(){alert("Could not load chroms for this dbkey: "+ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-v});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+v});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad===undefined&&aj===undefined){ae.low=0;ae.high=ae.max_high}else{ae.low=(ad!==undefined?Math.max(ad,0):0);if(aj===undefined){ae.low=Math.max(ae.low-15,0);ae.high=ae.low+30}else{ae.high=Math.min(aj,ae.max_high)}}ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/,/g,"");ag=ag.replace(/:|\-/g," ");var ad=ag.split(/\s+/),af=ad[0],ae=(ad[1]?parseInt(ad[1],10):undefined),ac=(ad[2]?parseInt(ad[2],10):undefined);this.change_chrom(af,ae,ac)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw({data_fetch:false});if(this.redraw_on_move_fn){clearTimeout(this.redraw_on_move_fn)}this.redraw_on_move_fn=setTimeout(function(){ac.request_redraw()},200);var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ad){y.prototype.add_drawable.call(this,ad);ad.init();this.changed();this.update_intro_div();var ac=this;ad.config.on("change",function(){ac.changed()})},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){y.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ad,ae){var ac=this,af=(ae?[ae]:ac.drawables);ab.each(af,function(ag){var ah=ab.find(ac.tracks_to_be_redrawn,function(ai){return ai[0]===ag});if(ah){ah[1]=ad}else{ac.tracks_to_be_redrawn.push([ag,ad])}});if(!this.requested_redraw){requestAnimationFrame(function(){ac._redraw()});this.requested_redraw=true}},_redraw:function(){this.requested_redraw=false;var ac=this.low,ag=this.high;if(ac<this.max_low){ac=this.max_low}if(ag>this.max_high){ag=this.max_high}var ad=this.high-this.low;if(this.high!==0&&ad<this.min_separation){ag=ac+this.min_separation}this.low=Math.floor(ac);this.high=Math.ceil(ag);this.update_location(this.low,this.high);this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var af=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ah=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:af,width:Math.max(ae,ah)}).show();if(ah<ae){this.overview_box.css("left",af-(ae-ah)/2)}if(this.overview_highlight){this.overview_highlight.css({left:af,width:ah})}ab.each(this.tracks_to_be_redrawn,function(ak){var ai=ak[0],aj=ak[1];if(ai){ai._draw(aj)}});this.tracks_to_be_redrawn=[];ab.each(this.label_tracks,function(ai){ai._draw()})},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_viewport:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height())},resize_window:function(){this.resize_viewport();this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset.id===ae.dataset.id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var q=P.Tool.extend({defaults:{track:null},initialize:function(ac){P.Tool.prototype.initialize.call(this,ac);var ad=true;if(ac.tool_state!==undefined&&ac.tool_state.hidden!==undefined){ad=ac.tool_state.hidden}this.set("hidden",ad);this.remove_inputs(["data","hidden_data","conditional"])},state_dict:function(ac){return ab.extend(this.get_inputs_dict(),{hidden:!this.is_visible()})}});var t=Backbone.View.extend({events:{"change :input":"update_value"},render:function(){var ae=this.$el.addClass("param-row"),af=this.model;var ac=$("<div>").addClass("param-label").text(af.get("label")).appendTo(ae);var ad=$("<div/>").addClass("param-input").html(af.get("html")).appendTo(ae);ad.find(":input").val(af.get("value"));$("<div style='clear: both;'/>").appendTo(ae)},update_value:function(ac){this.model.set_value($(ac.target).val())}});var aa=Backbone.View.extend({initialize:function(ac){this.model.on("change:hidden",this.set_visible,this)},render:function(){var ad=this;tool=this.model,parent_div=this.$el.addClass("dynamic-tool").hide();parent_div.bind("drag",function(ah){ah.stopPropagation()}).click(function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()}).keydown(function(ah){ah.stopPropagation()});var ae=$("<div class='tool-name'>").appendTo(parent_div).text(tool.get("name"));tool.get("inputs").each(function(ai){var ah=new t({model:ai});ah.render();parent_div.append(ah.$el)});parent_div.find("input").click(function(){$(this).select()});var af=$("<div>").addClass("param-row").appendTo(parent_div);var ag=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(af);var ac=$("<input type='submit'>").attr("value","Run on visible region").appendTo(af);ac.click(function(){ad.run_on_region()});ag.click(function(){ad.run_on_dataset()});if(tool.is_visible()){this.$el.show()}},set_visible:function(){this.$el.toggle(this.model.is_visible())},update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},run_on_dataset:function(){var ac=this.model;this.run({target_dataset_id:this.model.get("track").dataset.id,action:"rerun",tool_id:ac.id},null,function(ad){Galaxy.modal.show({title:ac.get("name")+" is Running",body:ac.get("name")+" is running on the complete dataset. Tool outputs are in dataset's history.",buttons:{Close:function(){Galaxy.modal.hide()}}})})},run_on_region:function(){var ad=this.model.get("track"),ag=this.model,ai=new w.GenomeRegion({chrom:ad.view.chrom,start:ad.view.low,end:ad.view.high}),aj={target_dataset_id:ad.dataset.id,action:"rerun",tool_id:ag.id,regions:[ai.toJSON()]},ah=ad,al=ag.get("name")+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ak=new N(view,view,{name:ad.config.get_value("name")});var af=ah.container.replace_drawable(ah,ak,false);ak.container_div.insertBefore(ah.view.content_div.children()[af]);ak.add_drawable(ah);ah.container_div.appendTo(ak.content_div);ac=ak}else{ac=ah.container}var ae=new ah.constructor(view,ac,{name:al,hda_ldda:"hda"});ae.init_for_tool_data();ae.change_mode(ah.mode);ae.set_filters_manager(ah.filters_manager.copy(ae));ae.update_icons();ac.add_drawable(ae);ae.tiles_div.text("Starting job.");this.run(aj,ae,function(am){ae.set_dataset(new X.Dataset(am));ae.tiles_div.text("Running job.");ae.init()})},run:function(ac,ae,af){ac.inputs=this.model.get_inputs_dict();var ad=new j.ServerStateDeferred({ajax_settings:{url:galaxy_config.root+"api/tools",data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(H)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(x+ag.message)}else{af(ag)}}})}});var C=function(ac,ad){J.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var b=function(ac,af,ag,ad,ae){this.track=ac;this.region=af;this.low=af.get("start");this.high=af.get("end");this.w_scale=ag;this.canvas=ad;this.html_elt=$("<div class='track-tile'/>").append(ad);this.data=ae;this.stale=false};b.prototype.predisplay_actions=function(){};var K=function(ac,af,ag,ad,ae){b.call(this,ac,af,ag,ad,ae)};K.prototype.predisplay_actions=function(){};var M=function(ae,aj,al,ad,ag,ah,am,ac,ai,af,ak){b.call(this,ae,aj,al,ad,ag);this.mode=ah;this.all_slotted=ac;this.feature_mapper=ai;this.has_icons=false;this.incomplete_features=af;this.other_tiles_features_drawn={};this.seq_data=ak};o(M.prototype,b.prototype);M.prototype.predisplay_actions=function(){};var f=function(ad,ac,ae){o(ae,{drag_handle_class:"draghandle"});p.call(this,ad,ac,ae);this.dataset=null;if(ae.dataset){this.dataset=(ae.dataset instanceof Backbone.Model?ae.dataset:new X.Dataset(ae.dataset))}this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:I);this.data_manager=("data_manager" in ae?ae.data_manager:new w.GenomeDataManager({dataset:this.dataset,genome:new w.Genome({key:ad.dbkey,chroms_info:{chrom_info:ad.chrom_data}}),data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=this.config.get_value("height");this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};o(f.prototype,p.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},p.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"application-dock-270",on_click_fn:function(ac){ac.view.set_overview(ac)}},p.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"ui-slider-050",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.tool.toggle();if(ac.tool.is_visible()){ac.set_name(ac.config.get_value("name")+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.get("name") %><br/><strong>Dataset</strong>: <%= track.config.get_value("name") %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){Galaxy.modal.hide();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new w.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new w.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}Galaxy.modal.hide();window.location.href=galaxy_config.root+"visualization/sweepster?"+$.param({dataset_id:ac.dataset.id,hda_ldda:ac.dataset.get("hda_ldda"),regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};Galaxy.modal.show({title:"Visualize tool parameter space and output from different parameter settings?",body:ae,buttons:{No:ah,Yes:ad}})}},p.prototype.action_icons_def[2]],can_draw:function(){return this.dataset&&p.prototype.can_draw.call(this)},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id)},set_dataset:function(ac){this.dataset=ac;this.data_manager.set("dataset",ac)},on_resize:function(){this.request_draw({clear_tile_cache:true})},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.config.get_value("content_visible")){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.set_value("height",ac.visible_height_px);ac.changed()}).appendTo(ac.container_div)},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof W){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof g){return"LineTrack"}else{if(this instanceof S){return"ReadTrack"}else{if(this instanceof Z){return"VariantTrack"}else{if(this instanceof e){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},show_message:function(ac){this.tiles_div.remove();return $("<span/>").addClass("message").html(ac).appendTo(this.content_div)},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.children().remove();ad.container_div.removeClass("nodata error pending");ad.tiles_div=$("<div/>").addClass("tiles").appendTo(ad.content_div);if(!ad.dataset.id){return}var ac=$.Deferred(),af={hda_ldda:ad.dataset.get("hda_ldda"),data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");var ah=ad.show_message(m);if(ag.message){ah.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){Galaxy.modal.show({title:"Trackster Error",body:"<pre>"+ag.message+"</pre>",buttons:{Close:function(){Galaxy.modal.hide()}}})}));ah.append($("<span/>").text(" "));ah.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.show_message(H)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.show_message(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.show_message(u);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(T);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when.apply($,ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(af&&af.min&&af.max){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_default_value("min_value",ae);ac.config.set_default_value("max_value",ag);ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},get_drawables:function(){return this}});var L=function(ae,ad,ag){f.call(this,ae,ad,ag);var ac=this;k(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new h.FiltersManager(this,("filters" in ag?ag.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=(ag.tool?new q(ab.extend(ag.tool,{track:this,tool_state:ag.tool_state})):null);this.tile_cache=new w.Cache(O);this.left_offset=0;if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){var af=new aa({model:this.tool});af.render();this.dynamic_tool_div=af.$el;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);if(!this.config.get_value("content_visible")){this.tiles_div.hide()}this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(ag.mode){this.change_mode(ag.mode)}};o(L.prototype,p.prototype,f.prototype,{action_icons_def:f.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw({clear_tile_cache:true})},hide:true}]),copy:function(ac){var ad=this.to_dict();o(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),dataset:{id:this.dataset.id,hda_ldda:this.dataset.get("hda_ldda")},prefs:this.config.to_key_value_dict(),mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},set_min_max:function(){var ac=this;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.dataset.get("hda_ldda")},function(ad){var af=ad.data;if(isNaN(parseFloat(ac.config.get_value("min_value")))||isNaN(parseFloat(ac.config.get_value("max_value")))){var ae=af.min,ag=af.max;ae=Math.floor(Math.min(0,Math.max(ae,af.mean-2*af.sd)));ag=Math.ceil(Math.max(0,Math.min(ag,af.mean+2*af.sd)));ac.config.set_value("min_value",ae);ac.config.set_value("max_value",ag)}})},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.set_value("mode",ad);if(ad==="Auto"){this.data_manager.clear()}ac.request_draw({clear_tile_cache:true});this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;ac.action_icons.filters_icon.toggle(ac.filters_available);ac.action_icons.tools_icon.toggle(ac.tool!==null);ac.action_icons.param_space_viz_icon.toggle(ac.tool!==null)},_gen_tile_cache_key:function(ad,ac){return ad+"_"+ac},request_draw:function(ac){if(ac&&ac.clear_tile_cache){this.tile_cache.clear()}this.view.request_redraw(ac,this)},before_draw:function(){this.max_height_px=0},_draw:function(aq){if(!this.can_draw()){return}var an=aq&&aq.clear_after,al=this.view.low,ag=this.view.high,aj=ag-al,ad=this.view.container.width(),ap=this.view.resolution_px_b,af=1/ap;if(this.is_overview){al=this.view.max_low;ag=this.view.max_high;ap=ad/(view.max_high-view.max_low);af=1/ap}this.before_draw();this.tiles_div.children().addClass("remove");var ak=Math.floor(Q*af),ac=Math.floor(al/ak),am,ah,ai=[],ao=[];while((ac*ak)<ag){am=new w.GenomeRegion({chrom:this.view.chrom,start:ac*ak,end:Math.min((ac+1)*ak,this.view.max_high)});ah=this.draw_helper(am,ap,aq);ai.push(ah);$.when(ah).then(function(ar){ao.push(ar)});ac+=1}if(!an){this.tiles_div.children(".remove").removeClass("remove").remove()}var ae=this;$.when.apply($,ai).then(function(){ae.tiles_div.children(".remove").remove();ao=ab.filter(ao,function(ar){return ar!==null});if(ao.length!==0){ae.postdraw_actions(ao,ad,ap,an)}})},_add_yaxis_label:function(af,ah){var ad=this,ag=(af==="max"?"top":"bottom"),ai=(af==="max"?"max":"min"),ac=(af==="max"?"max_value":"min_value"),ae=this.container_div.find(".yaxislabel."+ag);ah=ah||function(){ad.request_draw({clear_tile_cache:true})};if(ae.length!==0){ae.text(ad.config.get_value(ac))}else{ae=$("<div/>").text(ad.config.get_value(ac)).make_text_editable({num_cols:12,on_finish:function(aj){$(".tooltip").remove();ad.config.set_value(ac,aj);ah()},help_text:"Set "+ai+" value"}).addClass("yaxislabel "+ag).css("color",this.config.get_value("label_color"));this.container_div.prepend(ae)}},postdraw_actions:function(af,ag,ai,ac){var ae=ab.filter(af,function(aj){return(aj instanceof K)});if(ae.length>0){this.max_height_px=0;var ad=this;ab.each(af,function(aj){if(!(aj instanceof K)){aj.html_elt.remove();ad.draw_helper(aj.region,ai,{force:true,mode:"Coverage"})}});ad._add_yaxis_label("max")}else{this.container_div.find(".yaxislabel").remove();var ah=ab.find(af,function(aj){return aj.has_icons});if(ah){ab.each(af,function(aj){if(!aj.has_icons){aj.html_elt.css("padding-top",D)}})}}},get_mode:function(ac){return this.mode},update_auto_mode:function(ac){},_get_drawables:function(){return[this]},draw_helper:function(al,an,ao){if(!ao){ao={}}var ad=ao.force,ai=ao.mode||this.mode,af=1/an,ae=this,ag=this._get_drawables(),am=this._gen_tile_cache_key(an,al),ah=function(ap){return(ap&&"track" in ap)};var aj=(ad?undefined:ae.tile_cache.get_elt(am));if(aj){if(ah(aj)){ae.show_tile(aj,an)}return aj}if(ao.data_fetch===false){return null}var ak=function(){var ap=(ab.find(A,function(ar){return ar===ai})?"Coverage":ai);var aq=ab.map(ag,function(ar){return ar.data_manager.get_data(al,ap,af,ae.data_url_extra_params)});if(view.reference_track){aq.push(view.reference_track.data_manager.get_data(al,ai,af,view.reference_track.data_url_extra_params))}return aq};var ac=$.Deferred();ae.tile_cache.set_elt(am,ac);$.when.apply($,ak()).then(function(){var ap=ak(),av=ap,aB;if(ab.find(ap,function(aD){return j.is_deferred(aD)})){ae.tile_cache.set_elt(am,undefined);$.when(ae.draw_helper(al,an,ao)).then(function(aD){ac.resolve(aD)});return}if(view.reference_track){aB=view.reference_track.data_manager.subset_entry(ap.pop(),al)}var aw=[],at=[];ab.each(ag,function(aG,aD){var aF=aG.mode,aE=av[aD];if(aF==="Auto"){aF=aG.get_mode(aE);aG.update_auto_mode(aF)}aw.push(aF);at.push(aG.get_canvas_height(aE,aF,an,aq))});var au=ae.view.canvas_manager.new_canvas(),ax=al.get("start"),aC=al.get("end"),ar=0,aq=Math.ceil((aC-ax)*an)+ae.left_offset,az=ab.max(at),ay;au.width=aq;au.height=(ao.height||az);var aA=au.getContext("2d");aA.translate(ae.left_offset,0);if(ag.length>1){aA.globalAlpha=0.5;aA.globalCompositeOperation="source-over"}ab.each(ag,function(aE,aD){ay=aE.draw_tile(av[aD],aA,aw[aD],al,an,aB)});if(ay!==undefined){ae.tile_cache.set_elt(am,ay);ae.show_tile(ay,an)}ac.resolve(ay)});return ac},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},_draw_line_track_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.LinePainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new K(this,ag,ai,af,ac.data)},draw_tile:function(ac,ad,ag,af,ah,ae){},show_tile:function(ae,ah){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=Math.round((ae.low-(this.is_overview?this.view.max_low:this.view.low))*ah);if(this.left_offset){ag-=this.left_offset}ac.css("left",ag);if(ac.hasClass("remove")){ac.removeClass("remove")}else{this.tiles_div.append(ac)}ac.css("height","auto");this.max_height_px=Math.max(this.max_height_px,ac.height()-2);ac.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},tool_region_and_parameters_str:function(af){var ac=this,ae=(af!==undefined?af.toString():"all"),ad=ab.values(ac.tool.get_inputs_dict()).join(", ");return" - region=["+ae+"], parameters=["+ad+"]"},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="bigwig"}else{if(ac.dataset_type==="bigwig"||ac.extra_info==="no_detail"){return false}else{return true}}}},can_subset:function(ac){if(ac.message||ac.extra_info==="no_detail"){return false}else{if(ac.dataset_type==="bigwig"){return(ac.data[1][0]-ac.data[0][0]===1)}}return true},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state"}});var W=function(ad,ac){f.call(this,ad,ac,{resize:false,header:false});this.container_div.addClass("label-track")};o(W.prototype,f.prototype,{init:function(){this.enabled=true},predraw_init:function(){},_draw:function(ag){var ae=this.view,af=ae.high-ae.low,aj=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/aj)*aj,ah=this.view.container.width(),ad=$("<div/>").addClass("label-container");while(ac<ae.high){var ai=Math.floor((ac-ae.low)/af*ah);ad.append($("<div/>").addClass("label").text(commatize(ac)).css({left:ai}));ac+=aj}this.content_div.children(":first").remove();this.content_div.append(ad)}});var e=function(ad,ac,ag){L.call(this,ad,ac,ag);this.drawables=[];if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=n(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}ab.each(this.drawables,function(ah){if(ah instanceof c||ah instanceof S){ah.change_mode("Coverage")}});this.update_icons();this.obj_type="CompositeTrack"};o(e.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".tooltip").remove();ac.show_group()}}].concat(L.prototype.action_icons_def),to_dict:y.prototype.to_dict,add_drawable:y.prototype.add_drawable,unpack_drawables:y.prototype.unpack_drawables,config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},on_resize:function(){var ac=this.visible_height_px;ab.each(this.drawables,function(ad){ad.visible_height_px=ac});f.prototype.on_resize.call(this)},change_mode:function(ac){L.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:p.prototype.can_draw,_get_drawables:function(){return this.drawables},show_group:function(){var af=new N(this.view,this.container,{name:this.config.get_value("name")}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw({clear_tile_cache:true})},before_draw:function(){var ad=ab.min(ab.map(this.drawables,function(ae){return ae.config.get_value("min_value")})),ac=ab.max(ab.map(this.drawables,function(ae){return ae.config.get_value("max_value")}));this.config.set_value("min_value",ad);this.config.set_value("max_value",ac);ab.each(this.drawables,function(ae){ae.config.set_value("min_value",ad);ae.config.set_value("max_value",ac)})},update_all_min_max:function(){var ad=this,ac=this.config.get_value("min_value"),ae=this.config.get_value("max_value");ab.each(this.drawables,function(af){af.config.set_value("min_value",ac);af.config.set_value("max_value",ae)});this.request_draw({clear_tile_cache:true})},postdraw_actions:function(ai,ac,al,ah){var ag=-1,ae;for(ae=0;ae<ai.length;ae++){var aj=ai[ae].html_elt.find("canvas").height();if(aj>ag){ag=aj}}for(ae=0;ae<ai.length;ae++){var af=ai[ae];if(af.html_elt.find("canvas").height()!==ag){this.draw_helper(af.region,al,{force:true,height:ag});af.html_elt.remove()}}var ad=this,ak=function(){ad.update_all_min_max()};this._add_yaxis_label("min",ak);this._add_yaxis_label("max",ak)}});var B=function(ac){L.call(this,ac,{content_div:ac.top_labeltrack},{resize:false,header:false});this.left_offset=ac.canvas_manager.char_width_px;this.container_div.addClass("reference-track");this.data_url=galaxy_config.root+"api/genomes/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new w.GenomeReferenceDataManager({data_url:this.data_url,can_subset:this.can_subset});this.hide_contents()};o(B.prototype,p.prototype,L.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"height",type:"int",default_value:13,hidden:true}]),init:function(){this.data_manager.clear();this.enabled=true},predraw_init:function(){},can_draw:p.prototype.can_draw,draw_helper:function(af,ah,ad){var ac=this.tiles_div.is(":visible"),ag,ae=null;if(ah>this.view.canvas_manager.char_width_px){this.tiles_div.show();ag=true;ae=L.prototype.draw_helper.call(this,af,ah,ad)}else{ag=false;this.tiles_div.hide()}if(ac!==ag){this.view.resize_viewport()}return ae},can_subset:function(ac){return true},draw_tile:function(ae,ak,af,ah,al){var ad=this.data_manager.subset_entry(ae,ah),aj=ad.data;var ac=ak.canvas;ak.font=ak.canvas.manager.default_font;ak.textAlign="center";for(var ag=0,ai=aj.length;ag<ai;ag++){ak.fillStyle=this.view.get_base_color(aj[ag]);ak.fillText(aj[ag],Math.floor(ag*al),10)}return new b(this,ah,al,ac,ad)}});var g=function(ad,ac,ae){this.mode="Histogram";L.call(this,ad,ac,ae)};o(g.prototype,p.prototype,L.prototype,{display_modes:A,config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Color",type:"color"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:30,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},before_draw:function(){},draw_tile:function(ac,ad,af,ae,ag){return this._draw_line_track_tile(ac,ad,af,ae,ag)},can_subset:function(ac){return(ac.data[1][0]-ac.data[0][0]===1)},postdraw_actions:function(ad,ae,af,ac){this._add_yaxis_label("max");this._add_yaxis_label("min")}});var r=function(ad,ac,ae){this.mode="Heatmap";L.call(this,ad,ac,ae)};o(r.prototype,p.prototype,L.prototype,{display_modes:["Heatmap"],config_params:ab.union(p.prototype.config_params,[{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,ae,ah,ag,ai){var af=ae.canvas,ad=new J.DiagonalHeatmapPainter(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah);ad.draw(ae,af.width,af.height,ai);return new b(this,ag,ai,af,ac.data)}});var c=function(ad,ac,ae){L.call(this,ad,ac,ae);this.container_div.addClass("feature-track");this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};o(c.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Block color",type:"color"},{key:"reverse_strand_color",label:"Antisense strand color",type:"color"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.set_painter_from_config();this.request_draw({clear_tile_cache:true})},set_painter_from_config:function(){if(this.config.get_value("connector_style")==="arcs"){this.painter=J.ArcLinkedFeaturePainter}else{this.painter=J.LinkedFeaturePainter}},postdraw_actions:function(ao,af,aq,an){L.prototype.postdraw_actions.call(this,ao,af,aq,an);var ah=this,ai,am=ab.filter(ao,function(ar){return(ar instanceof K)});if(am.length===0){var ac={};ab.each(ab.pluck(ao,"incomplete_features"),function(ar){ab.each(ar,function(at){ac[at[0]]=at})});var ap=this;ab.each(ao,function(av){var aw=ab.omit(ac,ab.map(av.incomplete_features,function(ay){return ay[0]}));aw=ab.omit(aw,ab.keys(av.other_tiles_features_drawn));if(ab.size(aw)!==0){var at={data:ab.values(aw)},au=ap.view.canvas_manager.new_canvas(),ar=au.getContext("2d");au.height=Math.max(av.canvas.height,ap.get_canvas_height(at,av.mode,av.w_scale,100));au.width=av.canvas.width;ar.drawImage(av.canvas,0,0);ar.translate(ah.left_offset,0);var ax=ap.draw_tile(at,ar,av.mode,av.region,av.w_scale,av.seq_data);$(av.canvas).replaceWith($(ax.canvas));av.canvas=au;ab.extend(av.other_tiles_features_drawn,ac)}})}if(ah.filters_manager){var ag=ah.filters_manager.filters,ak;for(ak=0;ak<ag.length;ak++){ag[ak].update_ui_elt()}var aj=false,al,ae;for(ai=0;ai<ao.length;ai++){if(ao[ai].data.length){al=ao[ai].data[0];for(ak=0;ak<ag.length;ak++){ae=ag[ak];if(ae.applies_to(al)&&ae.min!==ae.max){aj=true;break}}}}if(ah.filters_available!==aj){ah.filters_available=aj;if(!ah.filters_available){ah.filters_manager.hide()}ah.update_icons()}}if(ao[0] instanceof M){var ad=true;for(ai=0;ai<ao.length;ai++){if(!ao[ai].all_slotted){ad=false;break}}this.action_icons.show_more_rows_icon.toggle(!ad)}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (s.FeatureSlotter)(ag,af,z,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>G){mode="Squish"}else{mode="Pack"}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="Coverage"||ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return Math.max(this.min_height_px,ae.get_required_height(af,ad))}},draw_tile:function(an,at,aq,ag,ak,af,ao){var ar=this,ae=at.canvas,az=ag.get("start"),ad=ag.get("end"),ah=this.left_offset;if(an.dataset_type==="bigwig"){return this._draw_line_track_tile(an,at,aq,ag,ak)}var aj=[],ap=this.slotters[ak].slots;all_slotted=true;if(an.data){var al=this.filters_manager.filters;for(var au=0,aw=an.data.length;au<aw;au++){var ai=an.data[au];var av=false;var am;for(var ay=0,aD=al.length;ay<aD;ay++){am=al[ay];am.update_attrs(ai);if(!am.keep(ai)){av=true;break}}if(!av){aj.push(ai);if(!(ai[0] in ap)){all_slotted=false}}}}var aC=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null),aA=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null),aB=new (this.painter)(aj,az,ad,this.config.to_key_value_dict(),aq,aC,aA,af,function(aE){return ar.view.get_base_color(aE)});var ax=null;at.fillStyle=this.config.get_value("block_color");at.font=at.canvas.manager.default_font;at.textAlign="right";if(an.data){var ac=aB.draw(at,ae.width,ae.height,ak,ap);ax=ac.feature_mapper;incomplete_features=ac.incomplete_features;ax.translation=-ah}if(!ao){return new M(ar,ag,ak,ae,an.data,aq,an.message,all_slotted,ax,incomplete_features,af)}}});var Z=function(ad,ac,ae){L.call(this,ad,ac,ae);this.painter=J.VariantPainter;this.summary_draw_height=30;this.left_offset=30};o(Z.prototype,p.prototype,L.prototype,{display_modes:["Auto","Coverage","Dense","Squish","Pack"],config_params:ab.union(p.prototype.config_params,[{key:"color",label:"Histogram color",type:"color"},{key:"show_sample_data",label:"Show sample data",type:"bool",default_value:true},{key:"show_labels",label:"Show summary and sample labels",type:"bool",default_value:true},{key:"summary_height",label:"Locus summary height",type:"float",default_value:20},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})},draw_tile:function(ac,af,ah,ag,ai){if(ac.dataset_type==="bigwig"){return this._draw_line_track_tile(ac,af,"Histogram",ag,ai)}else{var ae=this.view,ad=new (this.painter)(ac.data,ag.get("start"),ag.get("end"),this.config.to_key_value_dict(),ah,function(aj){return ae.get_base_color(aj)});ad.draw(af,af.canvas.width,af.canvas.height,ai);return new b(this,ag,ai,af.canvas,ac.data)}},get_canvas_height:function(ac,ag,ah,ae){if(ac.dataset_type==="bigwig"){return this.summary_draw_height}else{var ad=(this.dataset.get_metadata("sample_names")?this.dataset.get_metadata("sample_names").length:0);if(ad===0&&ac.data.length!==0){ad=ac.data[0][7].match(/,/g);if(ad===null){ad=1}else{ad=ad.length+1}}var af=new (this.painter)(null,null,null,this.config.to_key_value_dict(),ag);return af.get_required_height(ad)}},predraw_init:function(){var ac=[f.prototype.predraw_init.call(this)];if(!this.dataset.get_metadata("sample_names")){ac.push(this.dataset.fetch())}return ac},postdraw_actions:function(ag,ah,aj,ad){L.prototype.postdraw_actions.call(this,ag,ah,aj,ad);var af=ab.filter(ag,function(ak){return(ak instanceof K)});var ae=this.dataset.get_metadata("sample_names");if(af.length===0&&this.config.get_value("show_labels")&&ae&&ae.length>1){var ac;if(this.container_div.find(".yaxislabel.variant").length===0){ac=this.config.get_value("summary_height")/2;this.tiles_div.prepend($("<div/>").text("Summary").addClass("yaxislabel variant top").css({"font-size":ac+"px",top:(this.config.get_value("summary_height")-ac)/2+"px"}));if(this.config.get_value("show_sample_data")){var ai=ae.join("<br/>");this.tiles_div.prepend($("<div/>").html(ai).addClass("yaxislabel variant top sample").css({top:this.config.get_value("summary_height")}))}}ac=(this.mode==="Squish"?5:10)+"px";$(this.tiles_div).find(".sample").css({"font-size":ac,"line-height":ac});$(this.tiles_div).find(".yaxislabel").css("color",this.config.get_value("label_color"))}else{this.container_div.find(".yaxislabel.variant").remove()}}});var S=function(ad,ac,ae){c.call(this,ad,ac,ae);this.painter=J.ReadPainter;this.update_icons()};o(S.prototype,p.prototype,L.prototype,c.prototype,{config_params:ab.union(p.prototype.config_params,[{key:"block_color",label:"Histogram color",type:"color"},{key:"detail_block_color",label:"Sense strand block color",type:"color",default_value:"#AAAAAA"},{key:"reverse_strand_color",label:"Antisense strand block color",type:"color",default_value:"#DDDDDD"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"min_value",label:"Histogram minimum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"max_value",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"height",type:"int",default_value:0,hidden:true}]),config_onchange:function(){this.set_name(this.config.get_value("name"));this.request_draw({clear_tile_cache:true})}});var d={CompositeTrack:e,DrawableGroup:N,DiagonalHeatmapTrack:r,FeatureTrack:c,LineTrack:g,ReadTrack:S,VariantTrack:Z,VcfTrack:Z};var n=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Y,DrawableGroup:N,LineTrack:g,FeatureTrack:c,DiagonalHeatmapTrack:r,ReadTrack:S,VariantTrack:Z,CompositeTrack:e,object_from_template:n}});
\ No newline at end of file
diff -r 990bc0688199410ab08d5e8a418770b516c6f4e2 -r d85ae37476a17205c9869d633f3aafd104b48a98 static/scripts/viz/trackster/tracks.js
--- a/static/scripts/viz/trackster/tracks.js
+++ b/static/scripts/viz/trackster/tracks.js
@@ -3242,7 +3242,7 @@
width = this.view.container.width(),
new_div = $("<div/>").addClass('label-container');
while ( position < view.high ) {
- var screenPosition = ( position - view.low ) / range * width;
+ var screenPosition = Math.floor( ( position - view.low ) / range * width );
new_div.append( $("<div/>").addClass('label').text(commatize( position )).css( {
left: screenPosition
}));
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Merged in jmchilton/galaxy-central-fork-1 (pull request #452)
by commits-noreply@bitbucket.org 09 Aug '14
by commits-noreply@bitbucket.org 09 Aug '14
09 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/de2e33813275/
Changeset: de2e33813275
User: jmchilton
Date: 2014-08-09 15:15:11
Summary: Merged in jmchilton/galaxy-central-fork-1 (pull request #452)
More RESTful workflow API (attempt 3)
Affected #: 4 files
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1664,7 +1664,7 @@
session.flush()
return imported_stored
- def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False ):
+ def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False, publish=False ):
"""
Creates a workflow from a dict. Created workflow is stored in the database and returned.
"""
@@ -1752,6 +1752,7 @@
workflow.stored_workflow = stored
stored.latest_workflow = workflow
stored.user = trans.user
+ stored.published = publish
if data[ 'annotation' ]:
self.add_item_annotation( trans.sa_session, stored.user, stored, data[ 'annotation' ] )
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -6,11 +6,13 @@
import logging
from sqlalchemy import desc, or_
-from galaxy import exceptions, util, web
+from galaxy import exceptions, util
from galaxy.model.item_attrs import UsesAnnotations
+from galaxy.managers import histories
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.web.base.controller import UsesHistoryMixin
+from galaxy.web.base.controller import SharableMixin
from galaxy.workflow.extract import extract_workflow
from galaxy.workflow.run import invoke
from galaxy.workflow.run import WorkflowRunConfig
@@ -18,9 +20,13 @@
log = logging.getLogger(__name__)
-class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations):
+class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations, SharableMixin):
- @web.expose_api
+ def __init__( self, app ):
+ super( BaseAPIController, self ).__init__( app )
+ self.history_manager = histories.HistoryManager()
+
+ @expose_api
def index(self, trans, **kwd):
"""
GET /api/workflows
@@ -54,30 +60,21 @@
rval.append(item)
return rval
- @web.expose_api
+ @expose_api
def show(self, trans, id, **kwd):
"""
GET /api/workflows/{encoded_workflow_id}
Displays information needed to run a workflow from the command line.
"""
- workflow_id = id
- try:
- decoded_workflow_id = trans.security.decode_id(workflow_id)
- except TypeError:
- trans.response.status = 400
- return "Malformed workflow id ( %s ) specified, unable to decode." % str(workflow_id)
- try:
- stored_workflow = trans.sa_session.query(trans.app.model.StoredWorkflow).get(decoded_workflow_id)
- if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is neither importable, nor owned by or shared with current user")
- except:
- trans.response.status = 400
- return "That workflow does not exist."
+ stored_workflow = self.__get_stored_workflow( trans, id )
+ if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is neither importable, nor owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
item = stored_workflow.to_dict( view='element', value_mapper={ 'id': trans.security.encode_id } )
- item['url'] = url_for('workflow', id=workflow_id)
+ item['url'] = url_for('workflow', id=id)
item['owner'] = stored_workflow.user.username
latest_workflow = stored_workflow.latest_workflow
inputs = {}
@@ -114,7 +111,7 @@
item['steps'] = steps
return item
- @web.expose_api
+ @expose_api
def create(self, trans, payload, **kwd):
"""
POST /api/workflows
@@ -161,10 +158,20 @@
:param workflow_name: If from_history_id is set - name of the workflow to create when extracting a workflow from history
:type workflow_name: str
"""
+ ways_to_create = set( [
+ 'workflow_id',
+ 'installed_repository_file',
+ 'from_history_id',
+ 'shared_workflow_id',
+ 'workflow',
+ ] ).intersection( payload )
+ if len( ways_to_create ) == 0:
+ message = "One parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterMissingException( message )
- if len( set( ['workflow_id', 'installed_repository_file', 'from_history_id'] ).intersection( payload ) ) > 1:
- trans.response.status = 403
- return "Only one among 'workflow_id', 'installed_repository_file', 'from_history_id' must be specified"
+ if len( ways_to_create ) > 1:
+ message = "Only one parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterInvalidException( message )
if 'installed_repository_file' in payload:
workflow_controller = trans.webapp.controllers[ 'workflow' ]
@@ -193,10 +200,17 @@
item[ 'url' ] = url_for( 'workflow', id=item[ 'id' ] )
return item
+ if 'shared_workflow_id' in payload:
+ workflow_id = payload[ 'shared_workflow_id' ]
+ return self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ if 'workflow' in payload:
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
- trans.response.status = 403
- return "Either workflow_id, installed_repository_file or from_history_id must be specified"
+ message = "Invalid workflow_id specified."
+ raise exceptions.RequestParameterInvalidException( message )
# Pull other parameters out of payload.
param_map = payload.get( 'parameters', {} )
@@ -225,34 +239,24 @@
history_param = payload.get('history', '')
# Get workflow + accessibility check.
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
workflow = stored_workflow.latest_workflow
# Sanity checks.
- if not workflow:
- trans.response.status = 400
- return "Workflow not found."
if len( workflow.steps ) == 0:
- trans.response.status = 400
- return "Workflow cannot be run because it does not have any steps"
+ raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
if workflow.has_cycles:
- trans.response.status = 400
- return "Workflow cannot be run because it contains cycles"
+ raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
if workflow.has_errors:
- trans.response.status = 400
- return "Workflow cannot be run because of validation errors in some steps"
+ message = "Workflow cannot be run because of validation errors in some steps"
+ raise exceptions.MessageException( message )
# Get target history.
if history_param.startswith('hist_id='):
# Passing an existing history to use.
- history = trans.sa_session.query(self.app.model.History).get(trans.security.decode_id(history_param[8:]))
- if history.user != trans.user and not trans.user_is_admin():
- trans.response.status = 400
- return "Invalid History specified."
+ encoded_history_id = history_param[ 8: ]
+ history_id = self.__decode_id( trans, encoded_history_id, model_type="history" )
+ history = self.history_manager.get( trans, history_id, check_ownership=True )
else:
# Send workflow outputs to new history.
history = self.app.model.History(name=history_param, user=trans.user)
@@ -284,8 +288,8 @@
inputs[k]['id']
)
else:
- trans.response.status = 400
- return "Unknown dataset source '%s' specified." % inputs[k]['src']
+ message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ raise exceptions.RequestParameterInvalidException( message )
if add_to_history and content.history != history:
content = content.copy()
if isinstance( content, self.app.model.HistoryDatasetAssociation ):
@@ -294,8 +298,8 @@
history.add_dataset_collection( content )
inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
except AssertionError:
- trans.response.status = 400
- return "Invalid Dataset '%s' Specified" % inputs[k]['id']
+ message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ raise exceptions.ItemAccessibilityException( message )
# Run each step, connecting outputs to inputs
replacement_dict = payload.get('replacement_params', {})
@@ -308,6 +312,8 @@
param_map=param_map,
)
+ # invoke may throw MessageExceptions on tool erors, failure
+ # to match up inputs, etc...
outputs = invoke(
trans=trans,
workflow=workflow,
@@ -327,30 +333,22 @@
return rval
- @web.expose_api
+ @expose_api
def workflow_dict( self, trans, workflow_id, **kwd ):
"""
GET /api/workflows/{encoded_workflow_id}/download
Returns a selected workflow as a json dictionary.
"""
- try:
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- except Exception, e:
- return ("Workflow with ID='%s' can not be found\n Exception: %s") % (workflow_id, str( e ))
- # check to see if user has permissions to selected workflow
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
ret_dict = self._workflow_to_dict( trans, stored_workflow )
if not ret_dict:
# This workflow has a tool that's missing from the distribution
- trans.response.status = 400
- return "Workflow cannot be exported due to missing tools."
+ message = "Workflow cannot be exported due to missing tools."
+ raise exceptions.MessageException( message )
return ret_dict
- @web.expose_api
+ @expose_api
def delete( self, trans, id, **kwd ):
"""
DELETE /api/workflows/{encoded_workflow_id}
@@ -379,19 +377,39 @@
# TODO: Unsure of response message to let api know that a workflow was successfully deleted
return ( "Workflow '%s' successfully deleted" % stored_workflow.name )
- @web.expose_api
- def import_new_workflow(self, trans, payload, **kwd):
+ @expose_api
+ def import_new_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/upload
Importing dynamic workflows from the api. Return newly generated workflow id.
Author: rpark
# currently assumes payload['workflow'] is a json representation of a workflow to be inserted into the database
+
+ Deprecated in favor to POST /api/workflows with encoded 'workflow' in
+ payload the same way.
"""
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+ def __api_import_new_workflow( self, trans, payload, **kwd ):
data = payload['workflow']
- workflow, missing_tool_tups = self._workflow_from_dict( trans, data, source="API" )
+ publish = util.string_as_bool( payload.get( "publish", False ) )
+ # If 'publish' set, default to importable.
+ importable = util.string_as_bool( payload.get( "importable", publish ) )
+
+ if publish and not importable:
+ raise exceptions.RequestParameterInvalidException( "Published workflow must be importable." )
+
+ from_dict_kwds = dict(
+ source="API",
+ publish=publish,
+ )
+ workflow, missing_tool_tups = self._workflow_from_dict( trans, data, **from_dict_kwds )
+
+ if importable:
+ self._make_item_accessible( trans.sa_session, workflow )
+ trans.sa_session.flush()
# galaxy workflow newly created id
workflow_id = workflow.id
@@ -409,7 +427,7 @@
return item
@expose_api
- def import_shared_workflow(self, trans, payload, **kwd):
+ def import_shared_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/import
Import a workflow shared by other users.
@@ -423,14 +441,17 @@
workflow_id = payload.get('workflow_id', None)
if workflow_id is None:
raise exceptions.ObjectAttributeMissingException( "Missing required parameter 'workflow_id'." )
+ self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ def __api_import_shared_workflow( self, trans, workflow_id, payload, **kwd ):
try:
stored_workflow = self.get_stored_workflow( trans, workflow_id, check_ownership=False )
except:
raise exceptions.ObjectNotFound( "Malformed workflow id ( %s ) specified." % workflow_id )
if stored_workflow.importable is False:
- raise exceptions.MessageException( 'The owner of this workflow has disabled imports via this link.' )
+ raise exceptions.ItemAccessibilityException( 'The owner of this workflow has disabled imports via this link.' )
elif stored_workflow.deleted:
- raise exceptions.MessageException( "You can't import this workflow because it has been deleted." )
+ raise exceptions.ItemDeletionException( "You can't import this workflow because it has been deleted." )
imported_workflow = self._import_shared_workflow( trans, stored_workflow )
item = imported_workflow.to_dict( value_mapper={ 'id': trans.security.encode_id } )
encoded_id = trans.security.encode_id(imported_workflow.id)
@@ -491,3 +512,32 @@
if out is not None:
return self.encode_all_ids( trans, out.to_dict('element'), True)
return None
+
+ def __get_stored_accessible_workflow( self, trans, workflow_id ):
+ stored_workflow = self.__get_stored_workflow( trans, workflow_id )
+
+ # check to see if user has permissions to selected workflow
+ if stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is not owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
+ return stored_workflow
+
+ def __get_stored_workflow( self, trans, workflow_id ):
+ try:
+ workflow_id = self.__decode_id( trans, workflow_id )
+ query = trans.sa_session.query( trans.app.model.StoredWorkflow )
+ stored_workflow = query.get( workflow_id )
+ except Exception:
+ raise exceptions.ObjectNotFound( "No such workflow found - invalid workflow identifier." )
+ if stored_workflow is None:
+ raise exceptions.ObjectNotFound( "No such workflow found." )
+ return stored_workflow
+
+ def __decode_id( self, trans, workflow_id, model_type="workflow" ):
+ try:
+ return trans.security.decode_id( workflow_id )
+ except Exception:
+ message = "Malformed %s id ( %s ) specified, unable to decode" % ( model_type, workflow_id )
+ raise exceptions.MalformedId( message )
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -213,13 +213,13 @@
webapp.add_route( '/visualization/show/:visualization_name',
controller='visualization', action='render', visualization_name=None )
- # "POST /api/workflows/import" => ``workflows.import_workflow()``.
- # Defines a named route "import_workflow".
- webapp.mapper.connect( 'import_workflow', '/api/workflows/upload', controller='workflows', action='import_new_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with 'workflow' in payload.
+ webapp.mapper.connect( 'import_workflow_deprecated', '/api/workflows/upload', controller='workflows', action='import_new_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_dict', '/api/workflows/{workflow_id}/download', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
# Preserve the following download route for now for dependent applications -- deprecate at some point
webapp.mapper.connect( 'workflow_dict', '/api/workflows/download/{workflow_id}', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
- webapp.mapper.connect( 'import_shared_workflow', '/api/workflows/import', controller='workflows', action='import_shared_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with shared_workflow_id in payload.
+ webapp.mapper.connect( 'import_shared_workflow_deprecated', '/api/workflows/import', controller='workflows', action='import_shared_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_usage', '/api/workflows/{workflow_id}/usage', controller='workflows', action='workflow_usage', conditions=dict(method=['GET']))
webapp.mapper.connect( 'workflow_usage_contents', '/api/workflows/{workflow_id}/usage/{usage_id}', controller='workflows', action='workflow_usage_contents', conditions=dict(method=['GET']))
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -9,6 +9,7 @@
from .helpers import skip_without_tool
from base.interactor import delete_request # requests like delete
+from galaxy.exceptions import error_codes
# Workflow API TODO:
@@ -24,6 +25,16 @@
self.dataset_populator = DatasetPopulator( self.galaxy_interactor )
self.dataset_collection_populator = DatasetCollectionPopulator( self.galaxy_interactor )
+ def test_show_invalid_is_404( self ):
+ show_response = self._get( "workflow/%s" % self._random_key() )
+ self._assert_status_code_is( show_response, 404 )
+
+ def test_cannot_show_private_workflow( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ show_response = self._get( "workflows/%s" % workflow_id )
+ self._assert_status_code_is( show_response, 403 )
+
def test_delete( self ):
workflow_id = self.workflow_populator.simple_workflow( "test_delete" )
workflow_name = "test_delete (imported from API)"
@@ -46,14 +57,44 @@
self._assert_status_code_is( index_response, 200 )
assert isinstance( index_response.json(), list )
- def test_import( self ):
+ def test_upload( self ):
+ self.__test_upload( use_deprecated_route=False )
+
+ def test_upload_deprecated( self ):
+ self.__test_upload( use_deprecated_route=True )
+
+ def __test_upload( self, use_deprecated_route ):
data = dict(
workflow=dumps( self.workflow_populator.load_workflow( name="test_import" ) ),
)
- upload_response = self._post( "workflows/upload", data=data )
+ if use_deprecated_route:
+ route = "workflows/upload"
+ else:
+ route = "workflows"
+ upload_response = self._post( route, data=data )
self._assert_status_code_is( upload_response, 200 )
self._assert_user_has_workflow_with_name( "test_import (imported from API)" )
+ def test_import_deprecated( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published_deprecated", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published_deprecated (imported from API)")
+
+ def test_not_importable_prevents_import( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 403 )
+
+ def test_import_published( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id, deprecated_route=True )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published (imported from API)")
+
def test_export( self ):
uploaded_workflow_id = self.workflow_populator.simple_workflow( "test_for_export" )
download_response = self._get( "workflows/%s/download" % uploaded_workflow_id )
@@ -85,6 +126,29 @@
self._assert_status_code_is( run_workflow_response, 200 )
self.dataset_populator.wait_for_history( history_id, assert_ok=True )
+ def test_cannot_run_inaccessible_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_cannot_access" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
+ def test_404_on_invalid_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ workflow_request[ "workflow_id" ] = self._random_key()
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 404 )
+
+ def test_cannot_run_against_other_users_history( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ other_history_id = self.dataset_populator.new_history()
+ workflow_request[ "history" ] = "hist_id=%s" % other_history_id
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
@skip_without_tool( "cat1" )
@skip_without_tool( "collection_two_paired" )
def test_run_workflow_collection_params( self ):
@@ -233,6 +297,20 @@
collection_step_state = loads( collection_step[ "tool_state" ] )
self.assertEquals( collection_step_state[ "collection_type" ], u"paired" )
+ def test_empty_create( self ):
+ response = self._post( "workflows" )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_MISSING_PARAMETER )
+
+ def test_invalid_create_multiple_types( self ):
+ data = {
+ 'shared_workflow_id': '1234567890abcdef',
+ 'from_history_id': '1234567890abcdef'
+ }
+ response = self._post( "workflows", data )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_INVALID_PARAMETER )
+
@skip_without_tool( "random_lines1" )
def test_extract_mapping_workflow_from_history( self ):
history_id = self.dataset_populator.new_history()
@@ -551,3 +629,16 @@
self._assert_status_code_is( index_response, 200 )
names = map( lambda w: w[ "name" ], index_response.json() )
return names
+
+ def __import_workflow( self, workflow_id, deprecated_route=False ):
+ if deprecated_route:
+ route = "workflows/import"
+ import_data = dict(
+ workflow_id=workflow_id,
+ )
+ else:
+ route = "workflows"
+ import_data = dict(
+ shared_workflow_id=workflow_id,
+ )
+ return self._post( route, import_data )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
5 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d7ebdeca53d2/
Changeset: d7ebdeca53d2
User: jmchilton
Date: 2014-08-08 15:16:55
Summary: More RESTful shared workflow import.
Previous route was "POST /api/workflows/shared", this still works but should be condisdered deprecated in favor of POSTing to /api/workflows with shared_workflow_id in the payload.
Affected #: 2 files
diff -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 -r d7ebdeca53d28ac3d21e7e242629811a81f68082 lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -161,8 +161,13 @@
:param workflow_name: If from_history_id is set - name of the workflow to create when extracting a workflow from history
:type workflow_name: str
"""
-
- if len( set( ['workflow_id', 'installed_repository_file', 'from_history_id'] ).intersection( payload ) ) > 1:
+ ways_to_create = set( [
+ 'workflow_id',
+ 'installed_repository_file',
+ 'from_history_id',
+ 'shared_workflow_id',
+ ] )
+ if len( ways_to_create.intersection( payload ) ) > 1:
trans.response.status = 403
return "Only one among 'workflow_id', 'installed_repository_file', 'from_history_id' must be specified"
@@ -193,6 +198,10 @@
item[ 'url' ] = url_for( 'workflow', id=item[ 'id' ] )
return item
+ if 'shared_workflow_id' in payload:
+ workflow_id = payload[ 'shared_workflow_id' ]
+ return self.__api_import_shared_workflow( trans, workflow_id, payload )
+
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
trans.response.status = 403
@@ -409,7 +418,7 @@
return item
@expose_api
- def import_shared_workflow(self, trans, payload, **kwd):
+ def import_shared_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/import
Import a workflow shared by other users.
@@ -423,6 +432,9 @@
workflow_id = payload.get('workflow_id', None)
if workflow_id is None:
raise exceptions.ObjectAttributeMissingException( "Missing required parameter 'workflow_id'." )
+ self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ def __api_import_shared_workflow( self, trans, workflow_id, payload, **kwd ):
try:
stored_workflow = self.get_stored_workflow( trans, workflow_id, check_ownership=False )
except:
diff -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 -r d7ebdeca53d28ac3d21e7e242629811a81f68082 lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -219,7 +219,8 @@
webapp.mapper.connect( 'workflow_dict', '/api/workflows/{workflow_id}/download', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
# Preserve the following download route for now for dependent applications -- deprecate at some point
webapp.mapper.connect( 'workflow_dict', '/api/workflows/download/{workflow_id}', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
- webapp.mapper.connect( 'import_shared_workflow', '/api/workflows/import', controller='workflows', action='import_shared_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with shared_workflow_id in payload.
+ webapp.mapper.connect( 'import_shared_workflow_deprecated', '/api/workflows/import', controller='workflows', action='import_shared_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_usage', '/api/workflows/{workflow_id}/usage', controller='workflows', action='workflow_usage', conditions=dict(method=['GET']))
webapp.mapper.connect( 'workflow_usage_contents', '/api/workflows/{workflow_id}/usage/{usage_id}', controller='workflows', action='workflow_usage_contents', conditions=dict(method=['GET']))
https://bitbucket.org/galaxy/galaxy-central/commits/479397aedd2b/
Changeset: 479397aedd2b
User: jmchilton
Date: 2014-08-08 15:16:55
Summary: More RESTful direct workflow creation from JSON.
Previous route was "POST /api/workflows/upload", this still works but should be condisdered deprecated in favor
of POSTing to /api/workflows with 'workflow' in the payload.
Affected #: 3 files
diff -r d7ebdeca53d28ac3d21e7e242629811a81f68082 -r 479397aedd2b4cb074ac978377f4d27fa92476a6 lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -166,6 +166,7 @@
'installed_repository_file',
'from_history_id',
'shared_workflow_id',
+ 'workflow',
] )
if len( ways_to_create.intersection( payload ) ) > 1:
trans.response.status = 403
@@ -202,6 +203,9 @@
workflow_id = payload[ 'shared_workflow_id' ]
return self.__api_import_shared_workflow( trans, workflow_id, payload )
+ if 'workflow' in payload:
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
trans.response.status = 403
@@ -389,15 +393,20 @@
return ( "Workflow '%s' successfully deleted" % stored_workflow.name )
@web.expose_api
- def import_new_workflow(self, trans, payload, **kwd):
+ def import_new_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/upload
Importing dynamic workflows from the api. Return newly generated workflow id.
Author: rpark
# currently assumes payload['workflow'] is a json representation of a workflow to be inserted into the database
+
+ Deprecated in favor to POST /api/workflows with encoded 'workflow' in
+ payload the same way.
"""
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+ def __api_import_new_workflow( self, trans, payload, **kwd ):
data = payload['workflow']
workflow, missing_tool_tups = self._workflow_from_dict( trans, data, source="API" )
diff -r d7ebdeca53d28ac3d21e7e242629811a81f68082 -r 479397aedd2b4cb074ac978377f4d27fa92476a6 lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -213,9 +213,8 @@
webapp.add_route( '/visualization/show/:visualization_name',
controller='visualization', action='render', visualization_name=None )
- # "POST /api/workflows/import" => ``workflows.import_workflow()``.
- # Defines a named route "import_workflow".
- webapp.mapper.connect( 'import_workflow', '/api/workflows/upload', controller='workflows', action='import_new_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with 'workflow' in payload.
+ webapp.mapper.connect( 'import_workflow_deprecated', '/api/workflows/upload', controller='workflows', action='import_new_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_dict', '/api/workflows/{workflow_id}/download', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
# Preserve the following download route for now for dependent applications -- deprecate at some point
webapp.mapper.connect( 'workflow_dict', '/api/workflows/download/{workflow_id}', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
diff -r d7ebdeca53d28ac3d21e7e242629811a81f68082 -r 479397aedd2b4cb074ac978377f4d27fa92476a6 test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -46,11 +46,21 @@
self._assert_status_code_is( index_response, 200 )
assert isinstance( index_response.json(), list )
- def test_import( self ):
+ def test_upload( self ):
+ self.__test_upload( use_deprecated_route=False )
+
+ def test_upload_deprecated( self ):
+ self.__test_upload( use_deprecated_route=True )
+
+ def __test_upload( self, use_deprecated_route ):
data = dict(
workflow=dumps( self.workflow_populator.load_workflow( name="test_import" ) ),
)
- upload_response = self._post( "workflows/upload", data=data )
+ if use_deprecated_route:
+ route = "workflows/upload"
+ else:
+ route = "workflows"
+ upload_response = self._post( route, data=data )
self._assert_status_code_is( upload_response, 200 )
self._assert_user_has_workflow_with_name( "test_import (imported from API)" )
https://bitbucket.org/galaxy/galaxy-central/commits/ecc4c38e0529/
Changeset: ecc4c38e0529
User: jmchilton
Date: 2014-08-08 15:16:55
Summary: Work toward making workflows API use newer standards.
Convert workflow API to use new-style API decorator throughout.
Improved workflow exception handling - now more explicit status code setting and returning of raw error strings in the API. Most obvious exceptional paths out of the API are now coming through MessageExceptions of things even more specific. Add API tests for many of these exceptional conditions.
Use more helper methods to reduce method length, duplication.
Affected #: 2 files
diff -r 479397aedd2b4cb074ac978377f4d27fa92476a6 -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -6,8 +6,9 @@
import logging
from sqlalchemy import desc, or_
-from galaxy import exceptions, util, web
+from galaxy import exceptions, util
from galaxy.model.item_attrs import UsesAnnotations
+from galaxy.managers import histories
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.web.base.controller import UsesHistoryMixin
@@ -20,7 +21,11 @@
class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations):
- @web.expose_api
+ def __init__( self, app ):
+ super( BaseAPIController, self ).__init__( app )
+ self.history_manager = histories.HistoryManager()
+
+ @expose_api
def index(self, trans, **kwd):
"""
GET /api/workflows
@@ -54,30 +59,21 @@
rval.append(item)
return rval
- @web.expose_api
+ @expose_api
def show(self, trans, id, **kwd):
"""
GET /api/workflows/{encoded_workflow_id}
Displays information needed to run a workflow from the command line.
"""
- workflow_id = id
- try:
- decoded_workflow_id = trans.security.decode_id(workflow_id)
- except TypeError:
- trans.response.status = 400
- return "Malformed workflow id ( %s ) specified, unable to decode." % str(workflow_id)
- try:
- stored_workflow = trans.sa_session.query(trans.app.model.StoredWorkflow).get(decoded_workflow_id)
- if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is neither importable, nor owned by or shared with current user")
- except:
- trans.response.status = 400
- return "That workflow does not exist."
+ stored_workflow = self.__get_stored_workflow( trans, id )
+ if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is neither importable, nor owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
item = stored_workflow.to_dict( view='element', value_mapper={ 'id': trans.security.encode_id } )
- item['url'] = url_for('workflow', id=workflow_id)
+ item['url'] = url_for('workflow', id=id)
item['owner'] = stored_workflow.user.username
latest_workflow = stored_workflow.latest_workflow
inputs = {}
@@ -114,7 +110,7 @@
item['steps'] = steps
return item
- @web.expose_api
+ @expose_api
def create(self, trans, payload, **kwd):
"""
POST /api/workflows
@@ -167,10 +163,14 @@
'from_history_id',
'shared_workflow_id',
'workflow',
- ] )
- if len( ways_to_create.intersection( payload ) ) > 1:
- trans.response.status = 403
- return "Only one among 'workflow_id', 'installed_repository_file', 'from_history_id' must be specified"
+ ] ).intersection( payload )
+ if len( ways_to_create ) == 0:
+ message = "One parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterMissingException( message )
+
+ if len( ways_to_create ) > 1:
+ message = "Only one parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterInvalidException( message )
if 'installed_repository_file' in payload:
workflow_controller = trans.webapp.controllers[ 'workflow' ]
@@ -208,8 +208,8 @@
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
- trans.response.status = 403
- return "Either workflow_id, installed_repository_file or from_history_id must be specified"
+ message = "Invalid workflow_id specified."
+ raise exceptions.RequestParameterInvalidException( message )
# Pull other parameters out of payload.
param_map = payload.get( 'parameters', {} )
@@ -238,34 +238,24 @@
history_param = payload.get('history', '')
# Get workflow + accessibility check.
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
workflow = stored_workflow.latest_workflow
# Sanity checks.
- if not workflow:
- trans.response.status = 400
- return "Workflow not found."
if len( workflow.steps ) == 0:
- trans.response.status = 400
- return "Workflow cannot be run because it does not have any steps"
+ raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
if workflow.has_cycles:
- trans.response.status = 400
- return "Workflow cannot be run because it contains cycles"
+ raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
if workflow.has_errors:
- trans.response.status = 400
- return "Workflow cannot be run because of validation errors in some steps"
+ message = "Workflow cannot be run because of validation errors in some steps"
+ raise exceptions.MessageException( message )
# Get target history.
if history_param.startswith('hist_id='):
# Passing an existing history to use.
- history = trans.sa_session.query(self.app.model.History).get(trans.security.decode_id(history_param[8:]))
- if history.user != trans.user and not trans.user_is_admin():
- trans.response.status = 400
- return "Invalid History specified."
+ encoded_history_id = history_param[ 8: ]
+ history_id = self.__decode_id( trans, encoded_history_id, model_type="history" )
+ history = self.history_manager.get( trans, history_id, check_ownership=True )
else:
# Send workflow outputs to new history.
history = self.app.model.History(name=history_param, user=trans.user)
@@ -297,8 +287,8 @@
inputs[k]['id']
)
else:
- trans.response.status = 400
- return "Unknown dataset source '%s' specified." % inputs[k]['src']
+ message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ raise exceptions.RequestParameterInvalidException( message )
if add_to_history and content.history != history:
content = content.copy()
if isinstance( content, self.app.model.HistoryDatasetAssociation ):
@@ -307,8 +297,8 @@
history.add_dataset_collection( content )
inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
except AssertionError:
- trans.response.status = 400
- return "Invalid Dataset '%s' Specified" % inputs[k]['id']
+ message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ raise exceptions.ItemAccessibilityException( message )
# Run each step, connecting outputs to inputs
replacement_dict = payload.get('replacement_params', {})
@@ -321,6 +311,8 @@
param_map=param_map,
)
+ # invoke may throw MessageExceptions on tool erors, failure
+ # to match up inputs, etc...
outputs = invoke(
trans=trans,
workflow=workflow,
@@ -340,30 +332,22 @@
return rval
- @web.expose_api
+ @expose_api
def workflow_dict( self, trans, workflow_id, **kwd ):
"""
GET /api/workflows/{encoded_workflow_id}/download
Returns a selected workflow as a json dictionary.
"""
- try:
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- except Exception, e:
- return ("Workflow with ID='%s' can not be found\n Exception: %s") % (workflow_id, str( e ))
- # check to see if user has permissions to selected workflow
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
ret_dict = self._workflow_to_dict( trans, stored_workflow )
if not ret_dict:
# This workflow has a tool that's missing from the distribution
- trans.response.status = 400
- return "Workflow cannot be exported due to missing tools."
+ message = "Workflow cannot be exported due to missing tools."
+ raise exceptions.MessageException( message )
return ret_dict
- @web.expose_api
+ @expose_api
def delete( self, trans, id, **kwd ):
"""
DELETE /api/workflows/{encoded_workflow_id}
@@ -392,7 +376,7 @@
# TODO: Unsure of response message to let api know that a workflow was successfully deleted
return ( "Workflow '%s' successfully deleted" % stored_workflow.name )
- @web.expose_api
+ @expose_api
def import_new_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/upload
@@ -512,3 +496,32 @@
if out is not None:
return self.encode_all_ids( trans, out.to_dict('element'), True)
return None
+
+ def __get_stored_accessible_workflow( self, trans, workflow_id ):
+ stored_workflow = self.__get_stored_workflow( trans, workflow_id )
+
+ # check to see if user has permissions to selected workflow
+ if stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is not owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
+ return stored_workflow
+
+ def __get_stored_workflow( self, trans, workflow_id ):
+ try:
+ workflow_id = self.__decode_id( trans, workflow_id )
+ query = trans.sa_session.query( trans.app.model.StoredWorkflow )
+ stored_workflow = query.get( workflow_id )
+ except Exception:
+ raise exceptions.ObjectNotFound( "No such workflow found - invalid workflow identifier." )
+ if stored_workflow is None:
+ raise exceptions.ObjectNotFound( "No such workflow found." )
+ return stored_workflow
+
+ def __decode_id( self, trans, workflow_id, model_type="workflow" ):
+ try:
+ return trans.security.decode_id( workflow_id )
+ except Exception:
+ message = "Malformed %s id ( %s ) specified, unable to decode" % ( model_type, workflow_id )
+ raise exceptions.MalformedId( message )
diff -r 479397aedd2b4cb074ac978377f4d27fa92476a6 -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -9,6 +9,7 @@
from .helpers import skip_without_tool
from base.interactor import delete_request # requests like delete
+from galaxy.exceptions import error_codes
# Workflow API TODO:
@@ -24,6 +25,16 @@
self.dataset_populator = DatasetPopulator( self.galaxy_interactor )
self.dataset_collection_populator = DatasetCollectionPopulator( self.galaxy_interactor )
+ def test_show_invalid_is_404( self ):
+ show_response = self._get( "workflow/%s" % self._random_key() )
+ self._assert_status_code_is( show_response, 404 )
+
+ def test_cannot_show_private_workflow( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ show_response = self._get( "workflows/%s" % workflow_id )
+ self._assert_status_code_is( show_response, 403 )
+
def test_delete( self ):
workflow_id = self.workflow_populator.simple_workflow( "test_delete" )
workflow_name = "test_delete (imported from API)"
@@ -95,6 +106,29 @@
self._assert_status_code_is( run_workflow_response, 200 )
self.dataset_populator.wait_for_history( history_id, assert_ok=True )
+ def test_cannot_run_inaccessible_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_cannot_access" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
+ def test_404_on_invalid_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ workflow_request[ "workflow_id" ] = self._random_key()
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 404 )
+
+ def test_cannot_run_against_other_users_history( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ other_history_id = self.dataset_populator.new_history()
+ workflow_request[ "history" ] = "hist_id=%s" % other_history_id
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
@skip_without_tool( "cat1" )
@skip_without_tool( "collection_two_paired" )
def test_run_workflow_collection_params( self ):
@@ -243,6 +277,20 @@
collection_step_state = loads( collection_step[ "tool_state" ] )
self.assertEquals( collection_step_state[ "collection_type" ], u"paired" )
+ def test_empty_create( self ):
+ response = self._post( "workflows" )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_MISSING_PARAMETER )
+
+ def test_invalid_create_multiple_types( self ):
+ data = {
+ 'shared_workflow_id': '1234567890abcdef',
+ 'from_history_id': '1234567890abcdef'
+ }
+ response = self._post( "workflows", data )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_INVALID_PARAMETER )
+
@skip_without_tool( "random_lines1" )
def test_extract_mapping_workflow_from_history( self ):
history_id = self.dataset_populator.new_history()
https://bitbucket.org/galaxy/galaxy-central/commits/a3ac64b85faa/
Changeset: a3ac64b85faa
User: jmchilton
Date: 2014-08-08 15:16:55
Summary: Allow workflow uploads to specify publishable/importable.
Use new capabilities to improve workflow testing.
Affected #: 3 files
diff -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f -r a3ac64b85faa4e59d331277a801a2b5570a8ca7e lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1664,7 +1664,7 @@
session.flush()
return imported_stored
- def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False ):
+ def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False, publish=False ):
"""
Creates a workflow from a dict. Created workflow is stored in the database and returned.
"""
@@ -1752,6 +1752,7 @@
workflow.stored_workflow = stored
stored.latest_workflow = workflow
stored.user = trans.user
+ stored.published = publish
if data[ 'annotation' ]:
self.add_item_annotation( trans.sa_session, stored.user, stored, data[ 'annotation' ] )
diff -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f -r a3ac64b85faa4e59d331277a801a2b5570a8ca7e lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -12,6 +12,7 @@
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.web.base.controller import UsesHistoryMixin
+from galaxy.web.base.controller import SharableMixin
from galaxy.workflow.extract import extract_workflow
from galaxy.workflow.run import invoke
from galaxy.workflow.run import WorkflowRunConfig
@@ -19,7 +20,7 @@
log = logging.getLogger(__name__)
-class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations):
+class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations, SharableMixin):
def __init__( self, app ):
super( BaseAPIController, self ).__init__( app )
@@ -393,7 +394,22 @@
def __api_import_new_workflow( self, trans, payload, **kwd ):
data = payload['workflow']
- workflow, missing_tool_tups = self._workflow_from_dict( trans, data, source="API" )
+ publish = util.string_as_bool( payload.get( "publish", False ) )
+ # If 'publish' set, default to importable.
+ importable = util.string_as_bool( payload.get( "importable", publish ) )
+
+ if publish and not importable:
+ raise exceptions.RequestParameterInvalidException( "Published workflow must be importable." )
+
+ from_dict_kwds = dict(
+ source="API",
+ publish=publish,
+ )
+ workflow, missing_tool_tups = self._workflow_from_dict( trans, data, **from_dict_kwds )
+
+ if importable:
+ self._make_item_accessible( trans.sa_session, workflow )
+ trans.sa_session.flush()
# galaxy workflow newly created id
workflow_id = workflow.id
@@ -433,9 +449,9 @@
except:
raise exceptions.ObjectNotFound( "Malformed workflow id ( %s ) specified." % workflow_id )
if stored_workflow.importable is False:
- raise exceptions.MessageException( 'The owner of this workflow has disabled imports via this link.' )
+ raise exceptions.ItemAccessibilityException( 'The owner of this workflow has disabled imports via this link.' )
elif stored_workflow.deleted:
- raise exceptions.MessageException( "You can't import this workflow because it has been deleted." )
+ raise exceptions.ItemDeletionException( "You can't import this workflow because it has been deleted." )
imported_workflow = self._import_shared_workflow( trans, stored_workflow )
item = imported_workflow.to_dict( value_mapper={ 'id': trans.security.encode_id } )
encoded_id = trans.security.encode_id(imported_workflow.id)
diff -r ecc4c38e0529fb3352ad0534e71929f6f6b29e7f -r a3ac64b85faa4e59d331277a801a2b5570a8ca7e test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -75,6 +75,26 @@
self._assert_status_code_is( upload_response, 200 )
self._assert_user_has_workflow_with_name( "test_import (imported from API)" )
+ def test_import_deprecated( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published_deprecated", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published_deprecated (imported from API)")
+
+ def test_not_importable_prevents_import( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 403 )
+
+ def test_import_published( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id, deprecated_route=True )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published (imported from API)")
+
def test_export( self ):
uploaded_workflow_id = self.workflow_populator.simple_workflow( "test_for_export" )
download_response = self._get( "workflows/%s/download" % uploaded_workflow_id )
@@ -609,3 +629,16 @@
self._assert_status_code_is( index_response, 200 )
names = map( lambda w: w[ "name" ], index_response.json() )
return names
+
+ def __import_workflow( self, workflow_id, deprecated_route=False ):
+ if deprecated_route:
+ route = "workflows/import"
+ import_data = dict(
+ workflow_id=workflow_id,
+ )
+ else:
+ route = "workflows"
+ import_data = dict(
+ shared_workflow_id=workflow_id,
+ )
+ return self._post( route, import_data )
https://bitbucket.org/galaxy/galaxy-central/commits/de2e33813275/
Changeset: de2e33813275
User: jmchilton
Date: 2014-08-09 15:15:11
Summary: Merged in jmchilton/galaxy-central-fork-1 (pull request #452)
More RESTful workflow API (attempt 3)
Affected #: 4 files
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -1664,7 +1664,7 @@
session.flush()
return imported_stored
- def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False ):
+ def _workflow_from_dict( self, trans, data, source=None, add_to_menu=False, publish=False ):
"""
Creates a workflow from a dict. Created workflow is stored in the database and returned.
"""
@@ -1752,6 +1752,7 @@
workflow.stored_workflow = stored
stored.latest_workflow = workflow
stored.user = trans.user
+ stored.published = publish
if data[ 'annotation' ]:
self.add_item_annotation( trans.sa_session, stored.user, stored, data[ 'annotation' ] )
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/webapps/galaxy/api/workflows.py
--- a/lib/galaxy/webapps/galaxy/api/workflows.py
+++ b/lib/galaxy/webapps/galaxy/api/workflows.py
@@ -6,11 +6,13 @@
import logging
from sqlalchemy import desc, or_
-from galaxy import exceptions, util, web
+from galaxy import exceptions, util
from galaxy.model.item_attrs import UsesAnnotations
+from galaxy.managers import histories
from galaxy.web import _future_expose_api as expose_api
from galaxy.web.base.controller import BaseAPIController, url_for, UsesStoredWorkflowMixin
from galaxy.web.base.controller import UsesHistoryMixin
+from galaxy.web.base.controller import SharableMixin
from galaxy.workflow.extract import extract_workflow
from galaxy.workflow.run import invoke
from galaxy.workflow.run import WorkflowRunConfig
@@ -18,9 +20,13 @@
log = logging.getLogger(__name__)
-class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations):
+class WorkflowsAPIController(BaseAPIController, UsesStoredWorkflowMixin, UsesHistoryMixin, UsesAnnotations, SharableMixin):
- @web.expose_api
+ def __init__( self, app ):
+ super( BaseAPIController, self ).__init__( app )
+ self.history_manager = histories.HistoryManager()
+
+ @expose_api
def index(self, trans, **kwd):
"""
GET /api/workflows
@@ -54,30 +60,21 @@
rval.append(item)
return rval
- @web.expose_api
+ @expose_api
def show(self, trans, id, **kwd):
"""
GET /api/workflows/{encoded_workflow_id}
Displays information needed to run a workflow from the command line.
"""
- workflow_id = id
- try:
- decoded_workflow_id = trans.security.decode_id(workflow_id)
- except TypeError:
- trans.response.status = 400
- return "Malformed workflow id ( %s ) specified, unable to decode." % str(workflow_id)
- try:
- stored_workflow = trans.sa_session.query(trans.app.model.StoredWorkflow).get(decoded_workflow_id)
- if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is neither importable, nor owned by or shared with current user")
- except:
- trans.response.status = 400
- return "That workflow does not exist."
+ stored_workflow = self.__get_stored_workflow( trans, id )
+ if stored_workflow.importable is False and stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is neither importable, nor owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
item = stored_workflow.to_dict( view='element', value_mapper={ 'id': trans.security.encode_id } )
- item['url'] = url_for('workflow', id=workflow_id)
+ item['url'] = url_for('workflow', id=id)
item['owner'] = stored_workflow.user.username
latest_workflow = stored_workflow.latest_workflow
inputs = {}
@@ -114,7 +111,7 @@
item['steps'] = steps
return item
- @web.expose_api
+ @expose_api
def create(self, trans, payload, **kwd):
"""
POST /api/workflows
@@ -161,10 +158,20 @@
:param workflow_name: If from_history_id is set - name of the workflow to create when extracting a workflow from history
:type workflow_name: str
"""
+ ways_to_create = set( [
+ 'workflow_id',
+ 'installed_repository_file',
+ 'from_history_id',
+ 'shared_workflow_id',
+ 'workflow',
+ ] ).intersection( payload )
+ if len( ways_to_create ) == 0:
+ message = "One parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterMissingException( message )
- if len( set( ['workflow_id', 'installed_repository_file', 'from_history_id'] ).intersection( payload ) ) > 1:
- trans.response.status = 403
- return "Only one among 'workflow_id', 'installed_repository_file', 'from_history_id' must be specified"
+ if len( ways_to_create ) > 1:
+ message = "Only one parameter among - %s - must be specified" % ", ".join( ways_to_create )
+ raise exceptions.RequestParameterInvalidException( message )
if 'installed_repository_file' in payload:
workflow_controller = trans.webapp.controllers[ 'workflow' ]
@@ -193,10 +200,17 @@
item[ 'url' ] = url_for( 'workflow', id=item[ 'id' ] )
return item
+ if 'shared_workflow_id' in payload:
+ workflow_id = payload[ 'shared_workflow_id' ]
+ return self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ if 'workflow' in payload:
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+
workflow_id = payload.get( 'workflow_id', None )
if not workflow_id:
- trans.response.status = 403
- return "Either workflow_id, installed_repository_file or from_history_id must be specified"
+ message = "Invalid workflow_id specified."
+ raise exceptions.RequestParameterInvalidException( message )
# Pull other parameters out of payload.
param_map = payload.get( 'parameters', {} )
@@ -225,34 +239,24 @@
history_param = payload.get('history', '')
# Get workflow + accessibility check.
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
workflow = stored_workflow.latest_workflow
# Sanity checks.
- if not workflow:
- trans.response.status = 400
- return "Workflow not found."
if len( workflow.steps ) == 0:
- trans.response.status = 400
- return "Workflow cannot be run because it does not have any steps"
+ raise exceptions.MessageException( "Workflow cannot be run because it does not have any steps" )
if workflow.has_cycles:
- trans.response.status = 400
- return "Workflow cannot be run because it contains cycles"
+ raise exceptions.MessageException( "Workflow cannot be run because it contains cycles" )
if workflow.has_errors:
- trans.response.status = 400
- return "Workflow cannot be run because of validation errors in some steps"
+ message = "Workflow cannot be run because of validation errors in some steps"
+ raise exceptions.MessageException( message )
# Get target history.
if history_param.startswith('hist_id='):
# Passing an existing history to use.
- history = trans.sa_session.query(self.app.model.History).get(trans.security.decode_id(history_param[8:]))
- if history.user != trans.user and not trans.user_is_admin():
- trans.response.status = 400
- return "Invalid History specified."
+ encoded_history_id = history_param[ 8: ]
+ history_id = self.__decode_id( trans, encoded_history_id, model_type="history" )
+ history = self.history_manager.get( trans, history_id, check_ownership=True )
else:
# Send workflow outputs to new history.
history = self.app.model.History(name=history_param, user=trans.user)
@@ -284,8 +288,8 @@
inputs[k]['id']
)
else:
- trans.response.status = 400
- return "Unknown dataset source '%s' specified." % inputs[k]['src']
+ message = "Unknown workflow input source '%s' specified." % inputs[k]['src']
+ raise exceptions.RequestParameterInvalidException( message )
if add_to_history and content.history != history:
content = content.copy()
if isinstance( content, self.app.model.HistoryDatasetAssociation ):
@@ -294,8 +298,8 @@
history.add_dataset_collection( content )
inputs[k]['hda'] = content # TODO: rename key to 'content', prescreen input ensure not populated explicitly
except AssertionError:
- trans.response.status = 400
- return "Invalid Dataset '%s' Specified" % inputs[k]['id']
+ message = "Invalid workflow input '%s' specified" % inputs[k]['id']
+ raise exceptions.ItemAccessibilityException( message )
# Run each step, connecting outputs to inputs
replacement_dict = payload.get('replacement_params', {})
@@ -308,6 +312,8 @@
param_map=param_map,
)
+ # invoke may throw MessageExceptions on tool erors, failure
+ # to match up inputs, etc...
outputs = invoke(
trans=trans,
workflow=workflow,
@@ -327,30 +333,22 @@
return rval
- @web.expose_api
+ @expose_api
def workflow_dict( self, trans, workflow_id, **kwd ):
"""
GET /api/workflows/{encoded_workflow_id}/download
Returns a selected workflow as a json dictionary.
"""
- try:
- stored_workflow = trans.sa_session.query(self.app.model.StoredWorkflow).get(trans.security.decode_id(workflow_id))
- except Exception, e:
- return ("Workflow with ID='%s' can not be found\n Exception: %s") % (workflow_id, str( e ))
- # check to see if user has permissions to selected workflow
- if stored_workflow.user != trans.user and not trans.user_is_admin():
- if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
- trans.response.status = 400
- return("Workflow is not owned by or shared with current user")
+ stored_workflow = self.__get_stored_accessible_workflow( trans, workflow_id )
ret_dict = self._workflow_to_dict( trans, stored_workflow )
if not ret_dict:
# This workflow has a tool that's missing from the distribution
- trans.response.status = 400
- return "Workflow cannot be exported due to missing tools."
+ message = "Workflow cannot be exported due to missing tools."
+ raise exceptions.MessageException( message )
return ret_dict
- @web.expose_api
+ @expose_api
def delete( self, trans, id, **kwd ):
"""
DELETE /api/workflows/{encoded_workflow_id}
@@ -379,19 +377,39 @@
# TODO: Unsure of response message to let api know that a workflow was successfully deleted
return ( "Workflow '%s' successfully deleted" % stored_workflow.name )
- @web.expose_api
- def import_new_workflow(self, trans, payload, **kwd):
+ @expose_api
+ def import_new_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/upload
Importing dynamic workflows from the api. Return newly generated workflow id.
Author: rpark
# currently assumes payload['workflow'] is a json representation of a workflow to be inserted into the database
+
+ Deprecated in favor to POST /api/workflows with encoded 'workflow' in
+ payload the same way.
"""
+ return self.__api_import_new_workflow( trans, payload, **kwd )
+ def __api_import_new_workflow( self, trans, payload, **kwd ):
data = payload['workflow']
- workflow, missing_tool_tups = self._workflow_from_dict( trans, data, source="API" )
+ publish = util.string_as_bool( payload.get( "publish", False ) )
+ # If 'publish' set, default to importable.
+ importable = util.string_as_bool( payload.get( "importable", publish ) )
+
+ if publish and not importable:
+ raise exceptions.RequestParameterInvalidException( "Published workflow must be importable." )
+
+ from_dict_kwds = dict(
+ source="API",
+ publish=publish,
+ )
+ workflow, missing_tool_tups = self._workflow_from_dict( trans, data, **from_dict_kwds )
+
+ if importable:
+ self._make_item_accessible( trans.sa_session, workflow )
+ trans.sa_session.flush()
# galaxy workflow newly created id
workflow_id = workflow.id
@@ -409,7 +427,7 @@
return item
@expose_api
- def import_shared_workflow(self, trans, payload, **kwd):
+ def import_shared_workflow_deprecated(self, trans, payload, **kwd):
"""
POST /api/workflows/import
Import a workflow shared by other users.
@@ -423,14 +441,17 @@
workflow_id = payload.get('workflow_id', None)
if workflow_id is None:
raise exceptions.ObjectAttributeMissingException( "Missing required parameter 'workflow_id'." )
+ self.__api_import_shared_workflow( trans, workflow_id, payload )
+
+ def __api_import_shared_workflow( self, trans, workflow_id, payload, **kwd ):
try:
stored_workflow = self.get_stored_workflow( trans, workflow_id, check_ownership=False )
except:
raise exceptions.ObjectNotFound( "Malformed workflow id ( %s ) specified." % workflow_id )
if stored_workflow.importable is False:
- raise exceptions.MessageException( 'The owner of this workflow has disabled imports via this link.' )
+ raise exceptions.ItemAccessibilityException( 'The owner of this workflow has disabled imports via this link.' )
elif stored_workflow.deleted:
- raise exceptions.MessageException( "You can't import this workflow because it has been deleted." )
+ raise exceptions.ItemDeletionException( "You can't import this workflow because it has been deleted." )
imported_workflow = self._import_shared_workflow( trans, stored_workflow )
item = imported_workflow.to_dict( value_mapper={ 'id': trans.security.encode_id } )
encoded_id = trans.security.encode_id(imported_workflow.id)
@@ -491,3 +512,32 @@
if out is not None:
return self.encode_all_ids( trans, out.to_dict('element'), True)
return None
+
+ def __get_stored_accessible_workflow( self, trans, workflow_id ):
+ stored_workflow = self.__get_stored_workflow( trans, workflow_id )
+
+ # check to see if user has permissions to selected workflow
+ if stored_workflow.user != trans.user and not trans.user_is_admin():
+ if trans.sa_session.query(trans.app.model.StoredWorkflowUserShareAssociation).filter_by(user=trans.user, stored_workflow=stored_workflow).count() == 0:
+ message = "Workflow is not owned by or shared with current user"
+ raise exceptions.ItemAccessibilityException( message )
+
+ return stored_workflow
+
+ def __get_stored_workflow( self, trans, workflow_id ):
+ try:
+ workflow_id = self.__decode_id( trans, workflow_id )
+ query = trans.sa_session.query( trans.app.model.StoredWorkflow )
+ stored_workflow = query.get( workflow_id )
+ except Exception:
+ raise exceptions.ObjectNotFound( "No such workflow found - invalid workflow identifier." )
+ if stored_workflow is None:
+ raise exceptions.ObjectNotFound( "No such workflow found." )
+ return stored_workflow
+
+ def __decode_id( self, trans, workflow_id, model_type="workflow" ):
+ try:
+ return trans.security.decode_id( workflow_id )
+ except Exception:
+ message = "Malformed %s id ( %s ) specified, unable to decode" % ( model_type, workflow_id )
+ raise exceptions.MalformedId( message )
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -213,13 +213,13 @@
webapp.add_route( '/visualization/show/:visualization_name',
controller='visualization', action='render', visualization_name=None )
- # "POST /api/workflows/import" => ``workflows.import_workflow()``.
- # Defines a named route "import_workflow".
- webapp.mapper.connect( 'import_workflow', '/api/workflows/upload', controller='workflows', action='import_new_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with 'workflow' in payload.
+ webapp.mapper.connect( 'import_workflow_deprecated', '/api/workflows/upload', controller='workflows', action='import_new_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_dict', '/api/workflows/{workflow_id}/download', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
# Preserve the following download route for now for dependent applications -- deprecate at some point
webapp.mapper.connect( 'workflow_dict', '/api/workflows/download/{workflow_id}', controller='workflows', action='workflow_dict', conditions=dict( method=['GET'] ) )
- webapp.mapper.connect( 'import_shared_workflow', '/api/workflows/import', controller='workflows', action='import_shared_workflow', conditions=dict( method=['POST'] ) )
+ # Deprecated in favor of POST /api/workflows with shared_workflow_id in payload.
+ webapp.mapper.connect( 'import_shared_workflow_deprecated', '/api/workflows/import', controller='workflows', action='import_shared_workflow_deprecated', conditions=dict( method=['POST'] ) )
webapp.mapper.connect( 'workflow_usage', '/api/workflows/{workflow_id}/usage', controller='workflows', action='workflow_usage', conditions=dict(method=['GET']))
webapp.mapper.connect( 'workflow_usage_contents', '/api/workflows/{workflow_id}/usage/{usage_id}', controller='workflows', action='workflow_usage_contents', conditions=dict(method=['GET']))
diff -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 -r de2e33813275b89a04e7de4e95b21f6d2e100d4e test/api/test_workflows.py
--- a/test/api/test_workflows.py
+++ b/test/api/test_workflows.py
@@ -9,6 +9,7 @@
from .helpers import skip_without_tool
from base.interactor import delete_request # requests like delete
+from galaxy.exceptions import error_codes
# Workflow API TODO:
@@ -24,6 +25,16 @@
self.dataset_populator = DatasetPopulator( self.galaxy_interactor )
self.dataset_collection_populator = DatasetCollectionPopulator( self.galaxy_interactor )
+ def test_show_invalid_is_404( self ):
+ show_response = self._get( "workflow/%s" % self._random_key() )
+ self._assert_status_code_is( show_response, 404 )
+
+ def test_cannot_show_private_workflow( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ show_response = self._get( "workflows/%s" % workflow_id )
+ self._assert_status_code_is( show_response, 403 )
+
def test_delete( self ):
workflow_id = self.workflow_populator.simple_workflow( "test_delete" )
workflow_name = "test_delete (imported from API)"
@@ -46,14 +57,44 @@
self._assert_status_code_is( index_response, 200 )
assert isinstance( index_response.json(), list )
- def test_import( self ):
+ def test_upload( self ):
+ self.__test_upload( use_deprecated_route=False )
+
+ def test_upload_deprecated( self ):
+ self.__test_upload( use_deprecated_route=True )
+
+ def __test_upload( self, use_deprecated_route ):
data = dict(
workflow=dumps( self.workflow_populator.load_workflow( name="test_import" ) ),
)
- upload_response = self._post( "workflows/upload", data=data )
+ if use_deprecated_route:
+ route = "workflows/upload"
+ else:
+ route = "workflows"
+ upload_response = self._post( route, data=data )
self._assert_status_code_is( upload_response, 200 )
self._assert_user_has_workflow_with_name( "test_import (imported from API)" )
+ def test_import_deprecated( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published_deprecated", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published_deprecated (imported from API)")
+
+ def test_not_importable_prevents_import( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_not_importportable" )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id )
+ self._assert_status_code_is( other_import_response, 403 )
+
+ def test_import_published( self ):
+ workflow_id = self.workflow_populator.simple_workflow( "test_import_published", publish=True )
+ with self._different_user():
+ other_import_response = self.__import_workflow( workflow_id, deprecated_route=True )
+ self._assert_status_code_is( other_import_response, 200 )
+ self._assert_user_has_workflow_with_name( "imported: test_import_published (imported from API)")
+
def test_export( self ):
uploaded_workflow_id = self.workflow_populator.simple_workflow( "test_for_export" )
download_response = self._get( "workflows/%s/download" % uploaded_workflow_id )
@@ -85,6 +126,29 @@
self._assert_status_code_is( run_workflow_response, 200 )
self.dataset_populator.wait_for_history( history_id, assert_ok=True )
+ def test_cannot_run_inaccessible_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_cannot_access" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
+ def test_404_on_invalid_workflow( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ workflow_request[ "workflow_id" ] = self._random_key()
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 404 )
+
+ def test_cannot_run_against_other_users_history( self ):
+ workflow = self.workflow_populator.load_workflow( name="test_for_run_does_not_exist" )
+ workflow_request, history_id = self._setup_workflow_run( workflow )
+ with self._different_user():
+ other_history_id = self.dataset_populator.new_history()
+ workflow_request[ "history" ] = "hist_id=%s" % other_history_id
+ run_workflow_response = self._post( "workflows", data=workflow_request )
+ self._assert_status_code_is( run_workflow_response, 403 )
+
@skip_without_tool( "cat1" )
@skip_without_tool( "collection_two_paired" )
def test_run_workflow_collection_params( self ):
@@ -233,6 +297,20 @@
collection_step_state = loads( collection_step[ "tool_state" ] )
self.assertEquals( collection_step_state[ "collection_type" ], u"paired" )
+ def test_empty_create( self ):
+ response = self._post( "workflows" )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_MISSING_PARAMETER )
+
+ def test_invalid_create_multiple_types( self ):
+ data = {
+ 'shared_workflow_id': '1234567890abcdef',
+ 'from_history_id': '1234567890abcdef'
+ }
+ response = self._post( "workflows", data )
+ self._assert_status_code_is( response, 400 )
+ self._assert_error_code_is( response, error_codes.USER_REQUEST_INVALID_PARAMETER )
+
@skip_without_tool( "random_lines1" )
def test_extract_mapping_workflow_from_history( self ):
history_id = self.dataset_populator.new_history()
@@ -551,3 +629,16 @@
self._assert_status_code_is( index_response, 200 )
names = map( lambda w: w[ "name" ], index_response.json() )
return names
+
+ def __import_workflow( self, workflow_id, deprecated_route=False ):
+ if deprecated_route:
+ route = "workflows/import"
+ import_data = dict(
+ workflow_id=workflow_id,
+ )
+ else:
+ route = "workflows"
+ import_data = dict(
+ shared_workflow_id=workflow_id,
+ )
+ return self._post( route, import_data )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d0133648ddb9/
Changeset: d0133648ddb9
User: jmchilton
Date: 2014-08-08 17:42:20
Summary: Cleanup unused parameter left over in workflow controller.
Affected #: 1 file
diff -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 -r d0133648ddb96fc3e0c030c86802e0b6186b7f92 lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -1226,7 +1226,7 @@
url_for( controller='workflow', action='run', id=workflow_id ) ) )
@web.expose
- def run( self, trans, id, history_id=None, multiple_input_mode="product", hide_fixed_params=False, **kwargs ):
+ def run( self, trans, id, history_id=None, hide_fixed_params=False, **kwargs ):
stored = self.get_stored_workflow( trans, id, check_ownership=False )
user = trans.get_user()
if stored.user != user:
@@ -1269,7 +1269,7 @@
# been POSTed
# List to gather values for the template
invocations = []
- for (kwargs, multi_input_keys) in _expand_multiple_inputs(kwargs, mode=multiple_input_mode):
+ for (kwargs, multi_input_keys) in _expand_multiple_inputs(kwargs):
for step in workflow.steps:
step.upgrade_messages = {}
# Connections by input name
@@ -1653,9 +1653,9 @@
return " on %s and %s" % (", ".join(instance_ds_names[0:-1]), instance_ds_names[-1])
-def _expand_multiple_inputs(kwargs, mode):
+def _expand_multiple_inputs(kwargs):
(single_inputs, matched_multi_inputs, multiplied_multi_inputs) = \
- _split_inputs(kwargs, mode)
+ _split_inputs(kwargs)
# Build up every combination of inputs to be run together.
input_combos = _extend_with_matched_combos(single_inputs, matched_multi_inputs)
@@ -1714,7 +1714,7 @@
return new_inputs
-def _split_inputs(kwargs, mode):
+def _split_inputs(kwargs):
"""
"""
input_keys = filter(lambda a: a.endswith('|input'), kwargs)
https://bitbucket.org/galaxy/galaxy-central/commits/fcbd2849ebd1/
Changeset: fcbd2849ebd1
User: jmchilton
Date: 2014-08-08 17:42:20
Summary: Some PEP-8 fixes for lib/galaxy/webapps/galaxy/controllers/workflow.py.
Affected #: 1 file
diff -r d0133648ddb96fc3e0c030c86802e0b6186b7f92 -r fcbd2849ebd17a80e66e0fbdac9df7bb37f88fa2 lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -51,7 +51,7 @@
use_panels = True
title = "Saved Workflows"
model_class = model.StoredWorkflow
- default_filter = { "name" : "All", "tags": "All" }
+ default_filter = { "name": "All", "tags": "All" }
default_sort_key = "-update_time"
columns = [
grids.TextColumn( "Name", key="name", attach_popup=True, filterable="advanced" ),
@@ -62,10 +62,11 @@
]
columns.append(
grids.MulticolFilterColumn(
- "Search",
- cols_to_filter=[ columns[0], columns[1] ],
- key="free-text-search", visible=False, filterable="standard" )
- )
+ "Search",
+ cols_to_filter=[ columns[0], columns[1] ],
+ key="free-text-search", visible=False, filterable="standard"
+ )
+ )
operations = [
grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Run", condition=( lambda item: not item.deleted ), async_compatible=False ),
@@ -95,19 +96,24 @@
]
columns.append(
grids.MulticolFilterColumn(
- "Search name, annotation, owner, and tags",
- cols_to_filter=[ columns[0], columns[1], columns[2], columns[4] ],
- key="free-text-search", visible=False, filterable="standard" )
- )
+ "Search name, annotation, owner, and tags",
+ cols_to_filter=[ columns[0], columns[1], columns[2], columns[4] ],
+ key="free-text-search", visible=False, filterable="standard"
+ )
+ )
operations = [
- grids.GridOperation( "Import",
- condition=( lambda item: not item.deleted ),
- allow_multiple=False,
- url_args=dict( action="imp" ) ),
- grids.GridOperation( "Save as File",
- condition=( lambda item: not item.deleted ),
- allow_multiple=False,
- url_args=dict( action="export_to_file" ) ),
+ grids.GridOperation(
+ "Import",
+ condition=( lambda item: not item.deleted ),
+ allow_multiple=False,
+ url_args=dict( action="imp")
+ ),
+ grids.GridOperation(
+ "Save as File",
+ condition=( lambda item: not item.deleted ),
+ allow_multiple=False,
+ url_args=dict( action="export_to_file" )
+ ),
]
def build_initial_query( self, trans, **kwargs ):
@@ -275,7 +281,7 @@
user_item_rating = 0
ave_item_rating, num_ratings = self.get_ave_item_rating_data( trans.sa_session, stored_workflow )
return trans.fill_template_mako( "workflow/display.mako", item=stored_workflow, item_data=stored_workflow.latest_workflow.steps,
- user_item_rating=user_item_rating, ave_item_rating=ave_item_rating, num_ratings=num_ratings )
+ user_item_rating=user_item_rating, ave_item_rating=ave_item_rating, num_ratings=num_ratings )
@web.expose
def get_item_content_async( self, trans, id ):
@@ -390,7 +396,7 @@
# Do import.
stored = self.get_stored_workflow( trans, id, check_ownership=False )
- if stored.importable == False:
+ if stored.importable is False:
return trans.show_error_message( "The owner of this workflow has disabled imports via this link.<br>You can %s" % referer_message, use_panels=True )
elif stored.deleted:
return trans.show_error_message( "You can't import this workflow because it has been deleted.<br>You can %s" % referer_message, use_panels=True )
@@ -415,7 +421,7 @@
if 'annotation' in kwargs:
# Set workflow annotation; sanitize annotation before adding it.
annotation = sanitize_html( kwargs[ 'annotation' ], 'utf-8', 'text/html' )
- self.add_item_annotation( trans.sa_session, trans.get_user(), stored, annotation )
+ self.add_item_annotation( trans.sa_session, trans.get_user(), stored, annotation )
trans.sa_session.flush()
return trans.fill_template( 'workflow/edit_attributes.mako',
stored=stored,
@@ -511,7 +517,7 @@
""" Returns workflow's name and link. """
stored = self.get_stored_workflow( trans, id )
- return_dict = { "name" : stored.name, "link" : url_for(controller='workflow', action="display_by_username_and_slug", username=stored.user.username, slug=stored.slug ) }
+ return_dict = { "name": stored.name, "link": url_for(controller='workflow', action="display_by_username_and_slug", username=stored.user.username, slug=stored.slug ) }
return return_dict
@web.expose
@@ -583,8 +589,8 @@
return self.editor( trans, id=trans.security.encode_id(stored_workflow.id ))
else:
return form( url_for(controller="workflow", action="create"), "Create New Workflow", submit_text="Create", use_panels=True ) \
- .add_text( "workflow_name", "Workflow Name", value="Unnamed workflow" ) \
- .add_text( "workflow_annotation", "Workflow Annotation", value="", help="A description of the workflow; annotation is shown alongside shared or published workflows." )
+ .add_text( "workflow_name", "Workflow Name", value="Unnamed workflow" ) \
+ .add_text( "workflow_annotation", "Workflow Annotation", value="", help="A description of the workflow; annotation is shown alongside shared or published workflows." )
@web.expose
def delete( self, trans, id=None ):
@@ -665,7 +671,7 @@
module = module_factory.new( trans, type, **kwargs )
return {
'type': module.type,
- 'name': module.get_name(),
+ 'name': module.get_name(),
'tool_id': module.get_tool_id(),
'tool_state': module.get_state(),
'tooltip': module.get_tooltip( static_path=url_for( '/static' ) ),
@@ -750,9 +756,9 @@
'data_inputs': module.get_data_inputs(),
'data_outputs': module.get_data_outputs(),
'form_html': module.get_config_form(),
- 'annotation' : annotation_str,
- 'post_job_actions' : {},
- 'workflow_outputs' : []
+ 'annotation': annotation_str,
+ 'post_job_actions': {},
+ 'workflow_outputs': []
}
# Connections
input_connections = step.input_connections
@@ -838,8 +844,8 @@
errors.append("Step %s requires tool '%s'." % (step_dict['id'], step_dict['tool_id']))
if errors:
return dict( name=workflow.name,
- message="This workflow includes missing or invalid tools. It cannot be saved until the following steps are removed or the missing tools are enabled.",
- errors=errors)
+ message="This workflow includes missing or invalid tools. It cannot be saved until the following steps are removed or the missing tools are enabled.",
+ errors=errors )
# First pass to build step objects and populate basic values
for key, step_dict in data['steps'].iteritems():
# Create the model class for the step
@@ -932,18 +938,19 @@
workflow_content = json.dumps( workflow_dict, indent=4, sort_keys=True )
# Create myExperiment request.
- request_raw = trans.fill_template( "workflow/myexp_export.mako", \
- workflow_name=workflow_dict['name'], \
- workflow_description=workflow_dict['annotation'], \
- workflow_content=workflow_content, \
- workflow_svg=self._workflow_to_svg_canvas( trans, stored ).standalone_xml()
- )
+ request_raw = trans.fill_template(
+ "workflow/myexp_export.mako",
+ workflow_name=workflow_dict['name'],
+ workflow_description=workflow_dict['annotation'],
+ workflow_content=workflow_content,
+ workflow_svg=self._workflow_to_svg_canvas( trans, stored ).standalone_xml()
+ )
# strip() b/c myExperiment XML parser doesn't allow white space before XML; utf-8 handles unicode characters.
request = unicode( request_raw.strip(), 'utf-8' )
# Do request and get result.
auth_header = base64.b64encode( '%s:%s' % ( myexp_username, myexp_password ))
- headers = { "Content-type": "text/xml", "Accept": "text/xml", "Authorization" : "Basic %s" % auth_header }
+ headers = { "Content-type": "text/xml", "Accept": "text/xml", "Authorization": "Basic %s" % auth_header }
myexp_url = trans.app.config.get( "myexperiment_url", self.__myexp_url )
conn = httplib.HTTPConnection( myexp_url )
# NOTE: blocks web thread.
@@ -958,14 +965,14 @@
myexp_workflow_id = parser.tag_content
workflow_list_str = " <br>Return to <a href='%s'>workflow list." % url_for( controller='workflow', action='list' )
if myexp_workflow_id:
- return trans.show_message( \
+ return trans.show_message(
"""Workflow '%s' successfully exported to myExperiment. <br/><a href="http://%s/workflows/%s">Click here to view the workflow on myExperiment</a> %s
""" % ( stored.name, myexp_url, myexp_workflow_id, workflow_list_str ),
use_panels=True )
else:
- return trans.show_error_message( \
- "Workflow '%s' could not be exported to myExperiment. Error: %s %s" % \
+ return trans.show_error_message(
+ "Workflow '%s' could not be exported to myExperiment. Error: %s %s" %
( stored.name, response_data, workflow_list_str ), use_panels=True )
@web.json_pretty
@@ -1205,10 +1212,10 @@
jobs, warnings = summarize( trans )
# Render
return trans.fill_template(
- "workflow/build_from_current_history.mako",
- jobs=jobs,
- warnings=warnings,
- history=history
+ "workflow/build_from_current_history.mako",
+ jobs=jobs,
+ warnings=warnings,
+ history=history
)
else:
stored_workflow = extract_workflow(
@@ -1223,7 +1230,7 @@
workflow_id = trans.security.encode_id( stored_workflow.id )
return trans.show_message( 'Workflow "%s" created from current history. You can <a href="%s" target="_parent">edit</a> or <a href="%s">run</a> the workflow.' %
( workflow_name, url_for( controller='workflow', action='editor', id=workflow_id ),
- url_for( controller='workflow', action='run', id=workflow_id ) ) )
+ url_for( controller='workflow', action='run', id=workflow_id ) ) )
@web.expose
def run( self, trans, id, history_id=None, hide_fixed_params=False, **kwargs ):
@@ -1350,8 +1357,8 @@
trans.sa_session.flush()
if invocations:
return trans.fill_template( "workflow/run_complete.mako",
- workflow=stored,
- invocations=invocations )
+ workflow=stored,
+ invocations=invocations )
else:
# Prepare each step
missing_tools = []
@@ -1388,24 +1395,27 @@
step.input_connections_by_name = dict( ( conn.input_name, conn ) for conn in step.input_connections )
if missing_tools:
stored.annotation = self.get_item_annotation_str( trans.sa_session, trans.user, stored )
- return trans.fill_template("workflow/run.mako",
- steps=[],
- workflow=stored,
- hide_fixed_params=hide_fixed_params,
- missing_tools=missing_tools)
+ return trans.fill_template(
+ "workflow/run.mako",
+ steps=[],
+ workflow=stored,
+ hide_fixed_params=hide_fixed_params,
+ missing_tools=missing_tools
+ )
# Render the form
stored.annotation = self.get_item_annotation_str( trans.sa_session, trans.user, stored )
return trans.fill_template(
- "workflow/run.mako",
- steps=workflow.steps,
- workflow=stored,
- has_upgrade_messages=has_upgrade_messages,
- step_version_changes=step_version_changes,
- errors=errors,
- incoming=kwargs,
- history_id=history_id,
- hide_fixed_params=hide_fixed_params,
- enable_unique_defaults=trans.app.config.enable_unique_workflow_defaults)
+ "workflow/run.mako",
+ steps=workflow.steps,
+ workflow=stored,
+ has_upgrade_messages=has_upgrade_messages,
+ step_version_changes=step_version_changes,
+ errors=errors,
+ incoming=kwargs,
+ history_id=history_id,
+ hide_fixed_params=hide_fixed_params,
+ enable_unique_defaults=trans.app.config.enable_unique_workflow_defaults
+ )
finally:
# restore the active history
if saved_history is not None:
@@ -1484,12 +1494,12 @@
step.input_connections_by_name = dict( ( conn.input_name, conn ) for conn in step.input_connections )
# Render the form
return trans.fill_template(
- "workflow/tag_outputs.mako",
- steps=workflow.steps,
- workflow=stored,
- has_upgrade_messages=has_upgrade_messages,
- errors=errors,
- incoming=kwargs
+ "workflow/tag_outputs.mako",
+ steps=workflow.steps,
+ workflow=stored,
+ has_upgrade_messages=has_upgrade_messages,
+ errors=errors,
+ incoming=kwargs
)
@web.expose
@@ -1539,7 +1549,7 @@
shared_by_others=shared_by_others,
ids_in_menu=ids_in_menu,
message=message,
- refresh_frames=['tools'] )
+ refresh_frames=refresh_frames )
def _workflow_to_svg_canvas( self, trans, stored ):
workflow = stored.latest_workflow
@@ -1619,17 +1629,17 @@
if len(step_dict['data_inputs']) > 0:
box_height += 15
sep_y = y + len(step_dict['data_inputs']) * line_px + 40
- text.append( svgfig.Line(x-margin, sep_y, x+width-margin, sep_y).SVG() ) #
+ text.append( svgfig.Line(x - margin, sep_y, x + width - margin, sep_y).SVG() )
# input/output box
- boxes.append( svgfig.Rect(x-margin, y+30, x+width-margin, y+30+box_height, fill="#ffffff").SVG() )
+ boxes.append( svgfig.Rect(x - margin, y + 30, x + width - margin, y + 30 + box_height, fill="#ffffff").SVG() )
for conn, output_dict in step_dict['input_connections'].iteritems():
in_coords = in_pos[step_dict['id']][conn]
out_conn_pos = out_pos[output_dict['id']][output_dict['output_name']]
adjusted = (out_conn_pos[0] + widths[output_dict['id']], out_conn_pos[1])
- text.append( svgfig.SVG("circle", cx=out_conn_pos[0]+widths[output_dict['id']]-margin, cy=out_conn_pos[1]-margin, r=5, fill="#ffffff" ) )
- connectors.append( svgfig.Line(adjusted[0], adjusted[1]-margin, in_coords[0]-10, in_coords[1], arrow_end="true" ).SVG() )
+ text.append( svgfig.SVG("circle", cx=out_conn_pos[0] + widths[output_dict['id']] - margin, cy=out_conn_pos[1] - margin, r=5, fill="#ffffff" ) )
+ connectors.append( svgfig.Line(adjusted[0], adjusted[1] - margin, in_coords[0] - 10, in_coords[1], arrow_end="true" ).SVG() )
canvas.append(connectors)
canvas.append(boxes)
@@ -1654,16 +1664,14 @@
def _expand_multiple_inputs(kwargs):
- (single_inputs, matched_multi_inputs, multiplied_multi_inputs) = \
- _split_inputs(kwargs)
+ (single_inputs, matched_multi_inputs, multiplied_multi_inputs) = _split_inputs(kwargs)
# Build up every combination of inputs to be run together.
input_combos = _extend_with_matched_combos(single_inputs, matched_multi_inputs)
input_combos = _extend_with_multiplied_combos(input_combos, multiplied_multi_inputs)
# Input name that are multiply specified
- multi_input_keys = \
- matched_multi_inputs.keys() + multiplied_multi_inputs.keys()
+ multi_input_keys = matched_multi_inputs.keys() + multiplied_multi_inputs.keys()
for input_combo in input_combos:
for key, value in input_combo.iteritems():
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Bug fix for display site changes.
by commits-noreply@bitbucket.org 07 Aug '14
by commits-noreply@bitbucket.org 07 Aug '14
07 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5f663734a26e/
Changeset: 5f663734a26e
User: natefoo
Date: 2014-08-07 17:35:20
Summary: Bug fix for display site changes.
Affected #: 3 files
diff -r 103697ebdd339377424063fba0459cb3cc2b707c -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 lib/galaxy/datatypes/genetics.py
--- a/lib/galaxy/datatypes/genetics.py
+++ b/lib/galaxy/datatypes/genetics.py
@@ -85,7 +85,7 @@
if not dataset.dbkey:
dataset.dbkey = 'hg18' # punt!
if dataset.has_data():
- for site_name, site_url in app.build_sites.get_ucsc_by_build(dataset.dbkey):
+ for site_name, site_url in app.build_sites.get_ucsc_sites_by_build(dataset.dbkey):
if site_name in app.config.ucsc_display_sites:
site_url = site_url.replace('/hgTracks?','/hgGenome?') # for genome graphs
internal_url = "%s" % url_for( controller='dataset',
diff -r 103697ebdd339377424063fba0459cb3cc2b707c -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 lib/galaxy/datatypes/interval.py
--- a/lib/galaxy/datatypes/interval.py
+++ b/lib/galaxy/datatypes/interval.py
@@ -234,7 +234,7 @@
# Filter UCSC sites to only those that are supported by this build and
# enabled.
valid_sites = [ ( name, url )
- for name, url in app.build_sites.get_ucsc_by_build( dataset.dbkey )
+ for name, url in app.build_sites.get_ucsc_sites_by_build( dataset.dbkey )
if name in app.config.ucsc_display_sites ]
if not valid_sites:
return []
@@ -750,7 +750,7 @@
ret_val = []
seqid, start, stop = self.get_estimated_display_viewport( dataset )
if seqid is not None:
- for site_name, site_url in app.build_sites.get_ucsc_by_build( dataset.dbkey ):
+ for site_name, site_url in app.build_sites.get_ucsc_sites_by_build( dataset.dbkey ):
if site_name in app.config.ucsc_display_sites:
redirect_url = urllib.quote_plus(
"%sdb=%s&position=%s:%s-%s&hgt.customText=%%s" %
@@ -1103,7 +1103,7 @@
ret_val = []
chrom, start, stop = self.get_estimated_display_viewport( dataset )
if chrom is not None:
- for site_name, site_url in app.build_sites.get_ucsc_by_build( dataset.dbkey ):
+ for site_name, site_url in app.build_sites.get_ucsc_sites_by_build( dataset.dbkey ):
if site_name in app.config.ucsc_display_sites:
redirect_url = urllib.quote_plus( "%sdb=%s&position=%s:%s-%s&hgt.customText=%%s" % ( site_url, dataset.dbkey, chrom, start, stop ) )
link = self._get_remote_call_url( redirect_url, site_name, dataset, type, app, base_url )
@@ -1285,7 +1285,7 @@
ret_val = []
chrom, start, stop = self.get_estimated_display_viewport(dataset)
if chrom is not None:
- for site_name, site_url in app.build_sites.get_ucsc_by_build(dataset.dbkey):
+ for site_name, site_url in app.build_sites.get_ucsc_sites_by_build(dataset.dbkey):
if site_name in app.config.ucsc_display_sites:
internal_url = "%s" % url_for( controller='dataset', dataset_id=dataset.id, action='display_at', filename='ucsc_' + site_name )
display_url = urllib.quote_plus( "%s%s/display_as?id=%i&display_app=%s&authz_method=display_at" % (base_url, url_for( controller='root' ), dataset.id, type) )
diff -r 103697ebdd339377424063fba0459cb3cc2b707c -r 5f663734a26e8e2d1c462320741c86c9b5d9aef6 lib/galaxy/util/build_sites.py
--- a/lib/galaxy/util/build_sites.py
+++ b/lib/galaxy/util/build_sites.py
@@ -38,7 +38,7 @@
self._build_sites['ucsc'] = self.read_build_sites( self._app.config.ucsc_build_sites )
self._build_sites['gbrowse'] = self.read_build_sites( self._app.config.gbrowse_build_sites )
- def get_site_by_build( self, site_type, build ):
+ def _get_site_by_build( self, site_type, build ):
sites = []
for site in self._build_sites[site_type]:
if build in site['builds']:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
4 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d7bf7ad5c578/
Changeset: d7bf7ad5c578
Branch: next-stable
User: jmchilton
Date: 2014-08-07 15:35:43
Summary: Bugfix: Deal with BibTeX fields in a case insensitive fashion.
Would have thought the parser would have done this already - oh well.
Affected #: 2 files
diff -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 -r d7bf7ad5c578e7d27a4a94c559ef336b2eb3eab0 static/scripts/mvc/citation/citation-model.js
--- a/static/scripts/mvc/citation/citation-model.js
+++ b/static/scripts/mvc/citation/citation-model.js
@@ -18,12 +18,19 @@
var bibtex = this.attributes.content;
var entry = new BibtexParser(bibtex).entries[0];
this.entry = entry;
+ this._fields = {};
+ var rawFields = entry.Fields;
+ for(key in rawFields) {
+ var value = rawFields[ key ];
+ var lowerKey = key.toLowerCase();
+ this._fields[ lowerKey ] = value;
+ }
},
entryType: function() {
return this.entry.EntryType;
},
fields: function() {
- return this.entry.Fields;
+ return this._fields;
}
} );
diff -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 -r d7bf7ad5c578e7d27a4a94c559ef336b2eb3eab0 static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -55,9 +55,9 @@
this._asSentence(fields.note);
}
var doiUrl = "";
- if( fields.DOI ) {
- doiUrl = 'http://dx.doi.org/' + fields.DOI;
- ref += '[<a href="' + doiUrl + '">doi:' + fields.DOI + "</a>]";
+ if( fields.doi ) {
+ doiUrl = 'http://dx.doi.org/' + fields.doi;
+ ref += '[<a href="' + doiUrl + '">doi:' + fields.doi + "</a>]";
}
var url = fields.url || doiUrl;
if( url ) {
https://bitbucket.org/galaxy/galaxy-central/commits/ee8efcfd787f/
Changeset: ee8efcfd787f
Branch: next-stable
User: jmchilton
Date: 2014-08-07 15:35:43
Summary: Relax BibTeX parsing and accept header to handle figshare DOIs.
For instance 10.6084/m9.figshare.979190 reported by Michael Crusoe. JavaScript parser didn't like @data entries produced by figshare and when requesting the entry dx.doi.org returns a 403 response for type accept type text/bibliography, also allowing application/x-bibtex fixes this. Interestingly dx.doi.org throws 500 exceptions if application/x-bibtex is the only acceptable type or appears first for some other DOIs.
Affected #: 2 files
diff -r d7bf7ad5c578e7d27a4a94c559ef336b2eb3eab0 -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e lib/galaxy/managers/citations.py
--- a/lib/galaxy/managers/citations.py
+++ b/lib/galaxy/managers/citations.py
@@ -49,7 +49,7 @@
def _raw_get_bibtex( self, doi ):
dx_url = "http://dx.doi.org/" + doi
- headers = {'Accept': "text/bibliography; style=bibtex" }
+ headers = {'Accept': 'text/bibliography; style=bibtex, application/x-bibtex'}
req = urllib2.Request(dx_url, data="", headers=headers)
response = urllib2.urlopen(req)
bibtex = response.read()
diff -r d7bf7ad5c578e7d27a4a94c559ef336b2eb3eab0 -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e static/scripts/libs/bibtex.js
--- a/static/scripts/libs/bibtex.js
+++ b/static/scripts/libs/bibtex.js
@@ -93,6 +93,7 @@
'booklet' : 14,
'masterthesis' : 15,
'conference' : 16
+ ,'data' : 999 // Galaxy MOD: Handle @data citations coming from figshare.
}
/** @private */ this.MACROS_ = {
'jan' : 'January',
https://bitbucket.org/galaxy/galaxy-central/commits/990bc0688199/
Changeset: 990bc0688199
Branch: next-stable
User: jmchilton
Date: 2014-08-07 15:36:18
Summary: Pack scripts.
Affected #: 3 files
diff -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e -r 990bc0688199410ab08d5e8a418770b516c6f4e2 static/scripts/packed/libs/bibtex.js
--- a/static/scripts/packed/libs/bibtex.js
+++ b/static/scripts/packed/libs/bibtex.js
@@ -1,1 +1,1 @@
-function BibtexParser(c){if(typeof c=="string"){var d={};var a=[];function b(f){a.push(f)}var e=BibtexParser.call(d,b);e.parse(c);return{entries:a,errors:e.getErrors()}}if(typeof c!="function"){throw"Invalid parser construction."}this.STATES_={ENTRY_OR_JUNK:0,OBJECT_TYPE:1,ENTRY_KEY:2,KV_KEY:3,EQUALS:4,KV_VALUE:5};this.DATA_={};this.CALLBACK_=c;this.CHAR_=0;this.LINE_=1;this.CHAR_IN_LINE_=0;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={};this.SKIPTILLEOL_=false;this.VALBRACES_=null;this.BRACETYPE_=null;this.BRACECOUNT_=0;this.STATE_=this.STATES_.ENTRY_OR_JUNK;this.ERRORS_=[];this.ENTRY_TYPES_={inproceedings:1,proceedings:2,article:3,techreport:4,misc:5,mastersthesis:6,book:7,phdthesis:8,incollection:9,unpublished:10,inbook:11,manual:12,periodical:13,booklet:14,masterthesis:15,conference:16};this.MACROS_={jan:"January",feb:"February",mar:"March",apr:"April",may:"May",jun:"June",jul:"July",aug:"August",sep:"September",oct:"October",nov:"November",dec:"December",Jan:"January",Feb:"February",Mar:"March",Apr:"April",May:"May",Jun:"June",Jul:"July",Aug:"August",Sep:"September",Oct:"October",Nov:"November",Dec:"December"};this.getErrors=function(){return this.ERRORS_};this.parse=function(f){for(var g=0;g<f.length;g++){this.processCharacter_(f[g])}};this.error_=function(f){this.ERRORS_.push([this.LINE_,this.CHAR_IN_LINE_,this.CHAR_,f])};this.processEntry_=function(){var h=this.DATA_;if(h.Fields){for(var k in h.Fields){var p=h.Fields[k];for(var j=0;j<this.CHARCONV_.length;j++){var q=this.CHARCONV_[j][0];var n=this.CHARCONV_[j][1];p=p.replace(q,n)}p=p.replace(/[\n\r\t]/g," ").replace(/\s\s+/g," ").replace(/^\s+|\s+$/g,"");var l=p.length;var g="";for(var j=0;j<l;j++){var m=p[j];var o=false;if(m=="\\"&&j<l-1){m=p[++j]}else{if(m=="{"||m=="}"){o=true}}if(!o){g+=m}}h.Fields[k]=g}}if(h.ObjectType=="string"){for(var k in h.Fields){this.MACROS_[k]=h.Fields[k]}}else{this.CALLBACK_(h)}};this.processCharacter_=function(l){this.CHAR_++;this.CHAR_IN_LINE_++;if(l=="\n"){this.LINE_++;this.CHAR_IN_LINE_=1}if(this.SKIPTILLEOL_){if(l=="\n"){this.SKIPTILLEOL_=false}return}if(this.SKIPCOMMENT_&&l=="%"){this.SKIPTILLEOL_=true;return}if(this.SKIPWS_&&/\s/.test(l)){return}this.SKIPWS_=false;this.SKIPCOMMENT_=false;this.SKIPTILLEOL_=false;var f=true;while(f){f=false;switch(this.STATE_){case this.STATES_.ENTRY_OR_JUNK:if(l=="@"){this.STATE_=this.STATES_.OBJECT_TYPE;this.DATA_={ObjectType:""}}this.BRACETYPE_=null;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break;case this.STATES_.OBJECT_TYPE:if(/[A-Za-z]/.test(l)){this.DATA_.ObjectType+=l.toLowerCase();this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{var i=this.DATA_.ObjectType;if(i=="comment"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i=="string"){this.DATA_.ObjectType=i;this.DATA_.Fields={};this.BRACETYPE_=l;this.BRACECOUNT_=1;this.STATE_=this.STATES_.KV_KEY;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={Key:""}}else{if(i=="preamble"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i in this.ENTRY_TYPES_){this.DATA_.ObjectType="entry";this.DATA_.EntryType=i;this.DATA_.EntryKey="";this.STATE_=this.STATES_.ENTRY_KEY;f=true}else{this.error_('Unrecognized object type: "'+this.DATA_.ObjectType+'"');this.STATE_=this.STATES_.ENTRY_OR_JUNK}}}}}break;case this.STATES_.ENTRY_KEY:if((l==="{"||l==="(")&&this.BRACETYPE_==null){this.BRACETYPE_=l;this.BRACECOUNT_=1;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break}if(/[,%\s]/.test(l)){if(this.DATA_.EntryKey.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{if(this.BRACETYPE_==null){this.error_("No opening brace for object.");this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;f=true;this.STATE_=this.STATES_.KV_KEY;this.PARSETMP_.Key="";this.DATA_.Fields={}}}}else{this.DATA_.EntryKey+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}break;case this.STATES_.KV_KEY:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(/[\-A-Za-z:]/.test(l)){this.PARSETMP_.Key+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{if(this.PARSETMP_.Key.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.EQUALS;f=true}}break;case this.STATES_.EQUALS:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.error_('Key-value pair has key "'+this.PARSETMP_.Key+'", but no value.');this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(l=="="){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_VALUE;this.PARSETMP_.Value="";this.VALBRACES_={'"':[],"{":[]}}break;case this.STATES_.KV_VALUE:var k=this.VALBRACES_;var j=this.PARSETMP_.Value;var h=false;if(l=='"'||l=="{"||l=="}"||l==","){if(l==","){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}h=true}}if(l=='"'){if(0===k['"'].length+k["{"].length){k['"'].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false;break}if(k['"'].length==1&&k["{"].length==0&&(j.length==0||j[j.length-1]!="\\")){h=true}else{}}if(l=="{"){if(j.length==0||j[j.length-1]!="\\"){k["{"].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{}}if(l=="}"){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}f=true;h=true}else{if(j.length==0||j[j.length-1]!="\\"){if(k["{"].length>0){k["{"].splice(k["{"].length-1,1);if(0==k["{"].length+k['"'].length){h=true}else{}}}else{}}}}if(h){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_KEY;this.DATA_.Fields[this.PARSETMP_.Key]=this.PARSETMP_.Value;this.PARSETMP_={Key:""};this.VALBRACES_=null}else{this.PARSETMP_.Value+=l}break}}};this.CHARCONV_=[[/\\space /g,"\u0020"],[/\\textdollar /g,"\u0024"],[/\\textquotesingle /g,"\u0027"],[/\\ast /g,"\u002A"],[/\\textbackslash /g,"\u005C"],[/\\\^\{\}/g,"\u005E"],[/\\textasciigrave /g,"\u0060"],[/\\lbrace /g,"\u007B"],[/\\vert /g,"\u007C"],[/\\rbrace /g,"\u007D"],[/\\textasciitilde /g,"\u007E"],[/\\textexclamdown /g,"\u00A1"],[/\\textcent /g,"\u00A2"],[/\\textsterling /g,"\u00A3"],[/\\textcurrency /g,"\u00A4"],[/\\textyen /g,"\u00A5"],[/\\textbrokenbar /g,"\u00A6"],[/\\textsection /g,"\u00A7"],[/\\textasciidieresis /g,"\u00A8"],[/\\textcopyright /g,"\u00A9"],[/\\textordfeminine /g,"\u00AA"],[/\\guillemotleft /g,"\u00AB"],[/\\lnot /g,"\u00AC"],[/\\textregistered /g,"\u00AE"],[/\\textasciimacron /g,"\u00AF"],[/\\textdegree /g,"\u00B0"],[/\\pm /g,"\u00B1"],[/\\textasciiacute /g,"\u00B4"],[/\\mathrm\{\\mu\}/g,"\u00B5"],[/\\textparagraph /g,"\u00B6"],[/\\cdot /g,"\u00B7"],[/\\c\{\}/g,"\u00B8"],[/\\textordmasculine /g,"\u00BA"],[/\\guillemotright /g,"\u00BB"],[/\\textonequarter /g,"\u00BC"],[/\\textonehalf /g,"\u00BD"],[/\\textthreequarters /g,"\u00BE"],[/\\textquestiondown /g,"\u00BF"],[/\\`\{A\}/g,"\u00C0"],[/\\'\{A\}/g,"\u00C1"],[/\\\^\{A\}/g,"\u00C2"],[/\\~\{A\}/g,"\u00C3"],[/\\"\{A\}/g,"\u00C4"],[/\\AA /g,"\u00C5"],[/\\AE /g,"\u00C6"],[/\\c\{C\}/g,"\u00C7"],[/\\`\{E\}/g,"\u00C8"],[/\\'\{E\}/g,"\u00C9"],[/\\\^\{E\}/g,"\u00CA"],[/\\"\{E\}/g,"\u00CB"],[/\\`\{I\}/g,"\u00CC"],[/\\'\{I\}/g,"\u00CD"],[/\\\^\{I\}/g,"\u00CE"],[/\\"\{I\}/g,"\u00CF"],[/\\DH /g,"\u00D0"],[/\\~\{N\}/g,"\u00D1"],[/\\`\{O\}/g,"\u00D2"],[/\\'\{O\}/g,"\u00D3"],[/\\\^\{O\}/g,"\u00D4"],[/\\~\{O\}/g,"\u00D5"],[/\\"\{O\}/g,"\u00D6"],[/\\texttimes /g,"\u00D7"],[/\\O /g,"\u00D8"],[/\\`\{U\}/g,"\u00D9"],[/\\'\{U\}/g,"\u00DA"],[/\\\^\{U\}/g,"\u00DB"],[/\\"\{U\}/g,"\u00DC"],[/\\'\{Y\}/g,"\u00DD"],[/\\TH /g,"\u00DE"],[/\\ss /g,"\u00DF"],[/\\`\{a\}/g,"\u00E0"],[/\\'\{a\}/g,"\u00E1"],[/\\\^\{a\}/g,"\u00E2"],[/\\~\{a\}/g,"\u00E3"],[/\\"\{a\}/g,"\u00E4"],[/\\aa /g,"\u00E5"],[/\\ae /g,"\u00E6"],[/\\c\{c\}/g,"\u00E7"],[/\\`\{e\}/g,"\u00E8"],[/\\'\{e\}/g,"\u00E9"],[/\\\^\{e\}/g,"\u00EA"],[/\\"\{e\}/g,"\u00EB"],[/\\`\{\\i\}/g,"\u00EC"],[/\\'\{\\i\}/g,"\u00ED"],[/\\\^\{\\i\}/g,"\u00EE"],[/\\"\{\\i\}/g,"\u00EF"],[/\\dh /g,"\u00F0"],[/\\~\{n\}/g,"\u00F1"],[/\\`\{o\}/g,"\u00F2"],[/\\'\{o\}/g,"\u00F3"],[/\\\^\{o\}/g,"\u00F4"],[/\\~\{o\}/g,"\u00F5"],[/\\"\{o\}/g,"\u00F6"],[/\\div /g,"\u00F7"],[/\\o /g,"\u00F8"],[/\\`\{u\}/g,"\u00F9"],[/\\'\{u\}/g,"\u00FA"],[/\\\^\{u\}/g,"\u00FB"],[/\\"\{u\}/g,"\u00FC"],[/\\'\{y\}/g,"\u00FD"],[/\\th /g,"\u00FE"],[/\\"\{y\}/g,"\u00FF"],[/\\=\{A\}/g,"\u0100"],[/\\=\{a\}/g,"\u0101"],[/\\u\{A\}/g,"\u0102"],[/\\u\{a\}/g,"\u0103"],[/\\k\{A\}/g,"\u0104"],[/\\k\{a\}/g,"\u0105"],[/\\'\{C\}/g,"\u0106"],[/\\'\{c\}/g,"\u0107"],[/\\\^\{C\}/g,"\u0108"],[/\\\^\{c\}/g,"\u0109"],[/\\.\{C\}/g,"\u010A"],[/\\.\{c\}/g,"\u010B"],[/\\v\{C\}/g,"\u010C"],[/\\v\{c\}/g,"\u010D"],[/\\v\{D\}/g,"\u010E"],[/\\v\{d\}/g,"\u010F"],[/\\DJ /g,"\u0110"],[/\\dj /g,"\u0111"],[/\\=\{E\}/g,"\u0112"],[/\\=\{e\}/g,"\u0113"],[/\\u\{E\}/g,"\u0114"],[/\\u\{e\}/g,"\u0115"],[/\\.\{E\}/g,"\u0116"],[/\\.\{e\}/g,"\u0117"],[/\\k\{E\}/g,"\u0118"],[/\\k\{e\}/g,"\u0119"],[/\\v\{E\}/g,"\u011A"],[/\\v\{e\}/g,"\u011B"],[/\\\^\{G\}/g,"\u011C"],[/\\\^\{g\}/g,"\u011D"],[/\\u\{G\}/g,"\u011E"],[/\\u\{g\}/g,"\u011F"],[/\\.\{G\}/g,"\u0120"],[/\\.\{g\}/g,"\u0121"],[/\\c\{G\}/g,"\u0122"],[/\\c\{g\}/g,"\u0123"],[/\\\^\{H\}/g,"\u0124"],[/\\\^\{h\}/g,"\u0125"],[/\\Elzxh /g,"\u0127"],[/\\~\{I\}/g,"\u0128"],[/\\~\{\\i\}/g,"\u0129"],[/\\=\{I\}/g,"\u012A"],[/\\=\{\\i\}/g,"\u012B"],[/\\u\{I\}/g,"\u012C"],[/\\u\{\\i\}/g,"\u012D"],[/\\k\{I\}/g,"\u012E"],[/\\k\{i\}/g,"\u012F"],[/\\.\{I\}/g,"\u0130"],[/\\i /g,"\u0131"],[/\\\^\{J\}/g,"\u0134"],[/\\\^\{\\j\}/g,"\u0135"],[/\\c\{K\}/g,"\u0136"],[/\\c\{k\}/g,"\u0137"],[/\\'\{L\}/g,"\u0139"],[/\\'\{l\}/g,"\u013A"],[/\\c\{L\}/g,"\u013B"],[/\\c\{l\}/g,"\u013C"],[/\\v\{L\}/g,"\u013D"],[/\\v\{l\}/g,"\u013E"],[/\\L /g,"\u0141"],[/\\l /g,"\u0142"],[/\\'\{N\}/g,"\u0143"],[/\\'\{n\}/g,"\u0144"],[/\\c\{N\}/g,"\u0145"],[/\\c\{n\}/g,"\u0146"],[/\\v\{N\}/g,"\u0147"],[/\\v\{n\}/g,"\u0148"],[/\\NG /g,"\u014A"],[/\\ng /g,"\u014B"],[/\\=\{O\}/g,"\u014C"],[/\\=\{o\}/g,"\u014D"],[/\\u\{O\}/g,"\u014E"],[/\\u\{o\}/g,"\u014F"],[/\\H\{O\}/g,"\u0150"],[/\\H\{o\}/g,"\u0151"],[/\\OE /g,"\u0152"],[/\\oe /g,"\u0153"],[/\\'\{R\}/g,"\u0154"],[/\\'\{r\}/g,"\u0155"],[/\\c\{R\}/g,"\u0156"],[/\\c\{r\}/g,"\u0157"],[/\\v\{R\}/g,"\u0158"],[/\\v\{r\}/g,"\u0159"],[/\\'\{S\}/g,"\u015A"],[/\\'\{s\}/g,"\u015B"],[/\\\^\{S\}/g,"\u015C"],[/\\\^\{s\}/g,"\u015D"],[/\\c\{S\}/g,"\u015E"],[/\\c\{s\}/g,"\u015F"],[/\\v\{S\}/g,"\u0160"],[/\\v\{s\}/g,"\u0161"],[/\\c\{T\}/g,"\u0162"],[/\\c\{t\}/g,"\u0163"],[/\\v\{T\}/g,"\u0164"],[/\\v\{t\}/g,"\u0165"],[/\\~\{U\}/g,"\u0168"],[/\\~\{u\}/g,"\u0169"],[/\\=\{U\}/g,"\u016A"],[/\\=\{u\}/g,"\u016B"],[/\\u\{U\}/g,"\u016C"],[/\\u\{u\}/g,"\u016D"],[/\\r\{U\}/g,"\u016E"],[/\\r\{u\}/g,"\u016F"],[/\\H\{U\}/g,"\u0170"],[/\\H\{u\}/g,"\u0171"],[/\\k\{U\}/g,"\u0172"],[/\\k\{u\}/g,"\u0173"],[/\\\^\{W\}/g,"\u0174"],[/\\\^\{w\}/g,"\u0175"],[/\\\^\{Y\}/g,"\u0176"],[/\\\^\{y\}/g,"\u0177"],[/\\"\{Y\}/g,"\u0178"],[/\\'\{Z\}/g,"\u0179"],[/\\'\{z\}/g,"\u017A"],[/\\.\{Z\}/g,"\u017B"],[/\\.\{z\}/g,"\u017C"],[/\\v\{Z\}/g,"\u017D"],[/\\v\{z\}/g,"\u017E"],[/\\texthvlig /g,"\u0195"],[/\\textnrleg /g,"\u019E"],[/\\eth /g,"\u01AA"],[/\\textdoublepipe /g,"\u01C2"],[/\\'\{g\}/g,"\u01F5"],[/\\Elztrna /g,"\u0250"],[/\\Elztrnsa /g,"\u0252"],[/\\Elzopeno /g,"\u0254"],[/\\Elzrtld /g,"\u0256"],[/\\Elzschwa /g,"\u0259"],[/\\varepsilon /g,"\u025B"],[/\\Elzpgamma /g,"\u0263"],[/\\Elzpbgam /g,"\u0264"],[/\\Elztrnh /g,"\u0265"],[/\\Elzbtdl /g,"\u026C"],[/\\Elzrtll /g,"\u026D"],[/\\Elztrnm /g,"\u026F"],[/\\Elztrnmlr /g,"\u0270"],[/\\Elzltlmr /g,"\u0271"],[/\\Elzltln /g,"\u0272"],[/\\Elzrtln /g,"\u0273"],[/\\Elzclomeg /g,"\u0277"],[/\\textphi /g,"\u0278"],[/\\Elztrnr /g,"\u0279"],[/\\Elztrnrl /g,"\u027A"],[/\\Elzrttrnr /g,"\u027B"],[/\\Elzrl /g,"\u027C"],[/\\Elzrtlr /g,"\u027D"],[/\\Elzfhr /g,"\u027E"],[/\\Elzrtls /g,"\u0282"],[/\\Elzesh /g,"\u0283"],[/\\Elztrnt /g,"\u0287"],[/\\Elzrtlt /g,"\u0288"],[/\\Elzpupsil /g,"\u028A"],[/\\Elzpscrv /g,"\u028B"],[/\\Elzinvv /g,"\u028C"],[/\\Elzinvw /g,"\u028D"],[/\\Elztrny /g,"\u028E"],[/\\Elzrtlz /g,"\u0290"],[/\\Elzyogh /g,"\u0292"],[/\\Elzglst /g,"\u0294"],[/\\Elzreglst /g,"\u0295"],[/\\Elzinglst /g,"\u0296"],[/\\textturnk /g,"\u029E"],[/\\Elzdyogh /g,"\u02A4"],[/\\Elztesh /g,"\u02A7"],[/\\textasciicaron /g,"\u02C7"],[/\\Elzverts /g,"\u02C8"],[/\\Elzverti /g,"\u02CC"],[/\\Elzlmrk /g,"\u02D0"],[/\\Elzhlmrk /g,"\u02D1"],[/\\Elzsbrhr /g,"\u02D2"],[/\\Elzsblhr /g,"\u02D3"],[/\\Elzrais /g,"\u02D4"],[/\\Elzlow /g,"\u02D5"],[/\\textasciibreve /g,"\u02D8"],[/\\textperiodcentered /g,"\u02D9"],[/\\r\{\}/g,"\u02DA"],[/\\k\{\}/g,"\u02DB"],[/\\texttildelow /g,"\u02DC"],[/\\H\{\}/g,"\u02DD"],[/\\tone\{55\}/g,"\u02E5"],[/\\tone\{44\}/g,"\u02E6"],[/\\tone\{33\}/g,"\u02E7"],[/\\tone\{22\}/g,"\u02E8"],[/\\tone\{11\}/g,"\u02E9"],[/\\cyrchar\\C/g,"\u030F"],[/\\Elzpalh /g,"\u0321"],[/\\Elzrh /g,"\u0322"],[/\\Elzsbbrg /g,"\u032A"],[/\\Elzxl /g,"\u0335"],[/\\Elzbar /g,"\u0336"],[/\\'\{A\}/g,"\u0386"],[/\\'\{E\}/g,"\u0388"],[/\\'\{H\}/g,"\u0389"],[/\\'\{\}\{I\}/g,"\u038A"],[/\\'\{\}O/g,"\u038C"],[/\\mathrm\{'Y\}/g,"\u038E"],[/\\mathrm\{'\\Omega\}/g,"\u038F"],[/\\acute\{\\ddot\{\\iota\}\}/g,"\u0390"],[/\\Alpha /g,"\u0391"],[/\\Beta /g,"\u0392"],[/\\Gamma /g,"\u0393"],[/\\Delta /g,"\u0394"],[/\\Epsilon /g,"\u0395"],[/\\Zeta /g,"\u0396"],[/\\Eta /g,"\u0397"],[/\\Theta /g,"\u0398"],[/\\Iota /g,"\u0399"],[/\\Kappa /g,"\u039A"],[/\\Lambda /g,"\u039B"],[/\\Xi /g,"\u039E"],[/\\Pi /g,"\u03A0"],[/\\Rho /g,"\u03A1"],[/\\Sigma /g,"\u03A3"],[/\\Tau /g,"\u03A4"],[/\\Upsilon /g,"\u03A5"],[/\\Phi /g,"\u03A6"],[/\\Chi /g,"\u03A7"],[/\\Psi /g,"\u03A8"],[/\\Omega /g,"\u03A9"],[/\\mathrm\{\\ddot\{I\}\}/g,"\u03AA"],[/\\mathrm\{\\ddot\{Y\}\}/g,"\u03AB"],[/\\'\{\$\\alpha\$\}/g,"\u03AC"],[/\\acute\{\\epsilon\}/g,"\u03AD"],[/\\acute\{\\eta\}/g,"\u03AE"],[/\\acute\{\\iota\}/g,"\u03AF"],[/\\acute\{\\ddot\{\\upsilon\}\}/g,"\u03B0"],[/\\alpha /g,"\u03B1"],[/\\beta /g,"\u03B2"],[/\\gamma /g,"\u03B3"],[/\\delta /g,"\u03B4"],[/\\epsilon /g,"\u03B5"],[/\\zeta /g,"\u03B6"],[/\\eta /g,"\u03B7"],[/\\texttheta /g,"\u03B8"],[/\\iota /g,"\u03B9"],[/\\kappa /g,"\u03BA"],[/\\lambda /g,"\u03BB"],[/\\mu /g,"\u03BC"],[/\\nu /g,"\u03BD"],[/\\xi /g,"\u03BE"],[/\\pi /g,"\u03C0"],[/\\rho /g,"\u03C1"],[/\\varsigma /g,"\u03C2"],[/\\sigma /g,"\u03C3"],[/\\tau /g,"\u03C4"],[/\\upsilon /g,"\u03C5"],[/\\varphi /g,"\u03C6"],[/\\chi /g,"\u03C7"],[/\\psi /g,"\u03C8"],[/\\omega /g,"\u03C9"],[/\\ddot\{\\iota\}/g,"\u03CA"],[/\\ddot\{\\upsilon\}/g,"\u03CB"],[/\\'\{o\}/g,"\u03CC"],[/\\acute\{\\upsilon\}/g,"\u03CD"],[/\\acute\{\\omega\}/g,"\u03CE"],[/\\Pisymbol\{ppi022\}\{87\}/g,"\u03D0"],[/\\textvartheta /g,"\u03D1"],[/\\Upsilon /g,"\u03D2"],[/\\phi /g,"\u03D5"],[/\\varpi /g,"\u03D6"],[/\\Stigma /g,"\u03DA"],[/\\Digamma /g,"\u03DC"],[/\\digamma /g,"\u03DD"],[/\\Koppa /g,"\u03DE"],[/\\Sampi /g,"\u03E0"],[/\\varkappa /g,"\u03F0"],[/\\varrho /g,"\u03F1"],[/\\textTheta /g,"\u03F4"],[/\\backepsilon /g,"\u03F6"],[/\\cyrchar\\CYRYO /g,"\u0401"],[/\\cyrchar\\CYRDJE /g,"\u0402"],[/\\cyrchar\{\\'\\CYRG\}/g,"\u0403"],[/\\cyrchar\\CYRIE /g,"\u0404"],[/\\cyrchar\\CYRDZE /g,"\u0405"],[/\\cyrchar\\CYRII /g,"\u0406"],[/\\cyrchar\\CYRYI /g,"\u0407"],[/\\cyrchar\\CYRJE /g,"\u0408"],[/\\cyrchar\\CYRLJE /g,"\u0409"],[/\\cyrchar\\CYRNJE /g,"\u040A"],[/\\cyrchar\\CYRTSHE /g,"\u040B"],[/\\cyrchar\{\\'\\CYRK\}/g,"\u040C"],[/\\cyrchar\\CYRUSHRT /g,"\u040E"],[/\\cyrchar\\CYRDZHE /g,"\u040F"],[/\\cyrchar\\CYRA /g,"\u0410"],[/\\cyrchar\\CYRB /g,"\u0411"],[/\\cyrchar\\CYRV /g,"\u0412"],[/\\cyrchar\\CYRG /g,"\u0413"],[/\\cyrchar\\CYRD /g,"\u0414"],[/\\cyrchar\\CYRE /g,"\u0415"],[/\\cyrchar\\CYRZH /g,"\u0416"],[/\\cyrchar\\CYRZ /g,"\u0417"],[/\\cyrchar\\CYRI /g,"\u0418"],[/\\cyrchar\\CYRISHRT /g,"\u0419"],[/\\cyrchar\\CYRK /g,"\u041A"],[/\\cyrchar\\CYRL /g,"\u041B"],[/\\cyrchar\\CYRM /g,"\u041C"],[/\\cyrchar\\CYRN /g,"\u041D"],[/\\cyrchar\\CYRO /g,"\u041E"],[/\\cyrchar\\CYRP /g,"\u041F"],[/\\cyrchar\\CYRR /g,"\u0420"],[/\\cyrchar\\CYRS /g,"\u0421"],[/\\cyrchar\\CYRT /g,"\u0422"],[/\\cyrchar\\CYRU /g,"\u0423"],[/\\cyrchar\\CYRF /g,"\u0424"],[/\\cyrchar\\CYRH /g,"\u0425"],[/\\cyrchar\\CYRC /g,"\u0426"],[/\\cyrchar\\CYRCH /g,"\u0427"],[/\\cyrchar\\CYRSH /g,"\u0428"],[/\\cyrchar\\CYRSHCH /g,"\u0429"],[/\\cyrchar\\CYRHRDSN /g,"\u042A"],[/\\cyrchar\\CYRERY /g,"\u042B"],[/\\cyrchar\\CYRSFTSN /g,"\u042C"],[/\\cyrchar\\CYREREV /g,"\u042D"],[/\\cyrchar\\CYRYU /g,"\u042E"],[/\\cyrchar\\CYRYA /g,"\u042F"],[/\\cyrchar\\cyra /g,"\u0430"],[/\\cyrchar\\cyrb /g,"\u0431"],[/\\cyrchar\\cyrv /g,"\u0432"],[/\\cyrchar\\cyrg /g,"\u0433"],[/\\cyrchar\\cyrd /g,"\u0434"],[/\\cyrchar\\cyre /g,"\u0435"],[/\\cyrchar\\cyrzh /g,"\u0436"],[/\\cyrchar\\cyrz /g,"\u0437"],[/\\cyrchar\\cyri /g,"\u0438"],[/\\cyrchar\\cyrishrt /g,"\u0439"],[/\\cyrchar\\cyrk /g,"\u043A"],[/\\cyrchar\\cyrl /g,"\u043B"],[/\\cyrchar\\cyrm /g,"\u043C"],[/\\cyrchar\\cyrn /g,"\u043D"],[/\\cyrchar\\cyro /g,"\u043E"],[/\\cyrchar\\cyrp /g,"\u043F"],[/\\cyrchar\\cyrr /g,"\u0440"],[/\\cyrchar\\cyrs /g,"\u0441"],[/\\cyrchar\\cyrt /g,"\u0442"],[/\\cyrchar\\cyru /g,"\u0443"],[/\\cyrchar\\cyrf /g,"\u0444"],[/\\cyrchar\\cyrh /g,"\u0445"],[/\\cyrchar\\cyrc /g,"\u0446"],[/\\cyrchar\\cyrch /g,"\u0447"],[/\\cyrchar\\cyrsh /g,"\u0448"],[/\\cyrchar\\cyrshch /g,"\u0449"],[/\\cyrchar\\cyrhrdsn /g,"\u044A"],[/\\cyrchar\\cyrery /g,"\u044B"],[/\\cyrchar\\cyrsftsn /g,"\u044C"],[/\\cyrchar\\cyrerev /g,"\u044D"],[/\\cyrchar\\cyryu /g,"\u044E"],[/\\cyrchar\\cyrya /g,"\u044F"],[/\\cyrchar\\cyryo /g,"\u0451"],[/\\cyrchar\\cyrdje /g,"\u0452"],[/\\cyrchar\{\\'\\cyrg\}/g,"\u0453"],[/\\cyrchar\\cyrie /g,"\u0454"],[/\\cyrchar\\cyrdze /g,"\u0455"],[/\\cyrchar\\cyrii /g,"\u0456"],[/\\cyrchar\\cyryi /g,"\u0457"],[/\\cyrchar\\cyrje /g,"\u0458"],[/\\cyrchar\\cyrlje /g,"\u0459"],[/\\cyrchar\\cyrnje /g,"\u045A"],[/\\cyrchar\\cyrtshe /g,"\u045B"],[/\\cyrchar\{\\'\\cyrk\}/g,"\u045C"],[/\\cyrchar\\cyrushrt /g,"\u045E"],[/\\cyrchar\\cyrdzhe /g,"\u045F"],[/\\cyrchar\\CYROMEGA /g,"\u0460"],[/\\cyrchar\\cyromega /g,"\u0461"],[/\\cyrchar\\CYRYAT /g,"\u0462"],[/\\cyrchar\\CYRIOTE /g,"\u0464"],[/\\cyrchar\\cyriote /g,"\u0465"],[/\\cyrchar\\CYRLYUS /g,"\u0466"],[/\\cyrchar\\cyrlyus /g,"\u0467"],[/\\cyrchar\\CYRIOTLYUS /g,"\u0468"],[/\\cyrchar\\cyriotlyus /g,"\u0469"],[/\\cyrchar\\CYRBYUS /g,"\u046A"],[/\\cyrchar\\CYRIOTBYUS /g,"\u046C"],[/\\cyrchar\\cyriotbyus /g,"\u046D"],[/\\cyrchar\\CYRKSI /g,"\u046E"],[/\\cyrchar\\cyrksi /g,"\u046F"],[/\\cyrchar\\CYRPSI /g,"\u0470"],[/\\cyrchar\\cyrpsi /g,"\u0471"],[/\\cyrchar\\CYRFITA /g,"\u0472"],[/\\cyrchar\\CYRIZH /g,"\u0474"],[/\\cyrchar\\CYRUK /g,"\u0478"],[/\\cyrchar\\cyruk /g,"\u0479"],[/\\cyrchar\\CYROMEGARND /g,"\u047A"],[/\\cyrchar\\cyromegarnd /g,"\u047B"],[/\\cyrchar\\CYROMEGATITLO /g,"\u047C"],[/\\cyrchar\\cyromegatitlo /g,"\u047D"],[/\\cyrchar\\CYROT /g,"\u047E"],[/\\cyrchar\\cyrot /g,"\u047F"],[/\\cyrchar\\CYRKOPPA /g,"\u0480"],[/\\cyrchar\\cyrkoppa /g,"\u0481"],[/\\cyrchar\\cyrthousands /g,"\u0482"],[/\\cyrchar\\cyrhundredthousands /g,"\u0488"],[/\\cyrchar\\cyrmillions /g,"\u0489"],[/\\cyrchar\\CYRSEMISFTSN /g,"\u048C"],[/\\cyrchar\\cyrsemisftsn /g,"\u048D"],[/\\cyrchar\\CYRRTICK /g,"\u048E"],[/\\cyrchar\\cyrrtick /g,"\u048F"],[/\\cyrchar\\CYRGUP /g,"\u0490"],[/\\cyrchar\\cyrgup /g,"\u0491"],[/\\cyrchar\\CYRGHCRS /g,"\u0492"],[/\\cyrchar\\cyrghcrs /g,"\u0493"],[/\\cyrchar\\CYRGHK /g,"\u0494"],[/\\cyrchar\\cyrghk /g,"\u0495"],[/\\cyrchar\\CYRZHDSC /g,"\u0496"],[/\\cyrchar\\cyrzhdsc /g,"\u0497"],[/\\cyrchar\\CYRZDSC /g,"\u0498"],[/\\cyrchar\\cyrzdsc /g,"\u0499"],[/\\cyrchar\\CYRKDSC /g,"\u049A"],[/\\cyrchar\\cyrkdsc /g,"\u049B"],[/\\cyrchar\\CYRKVCRS /g,"\u049C"],[/\\cyrchar\\cyrkvcrs /g,"\u049D"],[/\\cyrchar\\CYRKHCRS /g,"\u049E"],[/\\cyrchar\\cyrkhcrs /g,"\u049F"],[/\\cyrchar\\CYRKBEAK /g,"\u04A0"],[/\\cyrchar\\cyrkbeak /g,"\u04A1"],[/\\cyrchar\\CYRNDSC /g,"\u04A2"],[/\\cyrchar\\cyrndsc /g,"\u04A3"],[/\\cyrchar\\CYRNG /g,"\u04A4"],[/\\cyrchar\\cyrng /g,"\u04A5"],[/\\cyrchar\\CYRPHK /g,"\u04A6"],[/\\cyrchar\\cyrphk /g,"\u04A7"],[/\\cyrchar\\CYRABHHA /g,"\u04A8"],[/\\cyrchar\\cyrabhha /g,"\u04A9"],[/\\cyrchar\\CYRSDSC /g,"\u04AA"],[/\\cyrchar\\cyrsdsc /g,"\u04AB"],[/\\cyrchar\\CYRTDSC /g,"\u04AC"],[/\\cyrchar\\cyrtdsc /g,"\u04AD"],[/\\cyrchar\\CYRY /g,"\u04AE"],[/\\cyrchar\\cyry /g,"\u04AF"],[/\\cyrchar\\CYRYHCRS /g,"\u04B0"],[/\\cyrchar\\cyryhcrs /g,"\u04B1"],[/\\cyrchar\\CYRHDSC /g,"\u04B2"],[/\\cyrchar\\cyrhdsc /g,"\u04B3"],[/\\cyrchar\\CYRTETSE /g,"\u04B4"],[/\\cyrchar\\cyrtetse /g,"\u04B5"],[/\\cyrchar\\CYRCHRDSC /g,"\u04B6"],[/\\cyrchar\\cyrchrdsc /g,"\u04B7"],[/\\cyrchar\\CYRCHVCRS /g,"\u04B8"],[/\\cyrchar\\cyrchvcrs /g,"\u04B9"],[/\\cyrchar\\CYRSHHA /g,"\u04BA"],[/\\cyrchar\\cyrshha /g,"\u04BB"],[/\\cyrchar\\CYRABHCH /g,"\u04BC"],[/\\cyrchar\\cyrabhch /g,"\u04BD"],[/\\cyrchar\\CYRABHCHDSC /g,"\u04BE"],[/\\cyrchar\\cyrabhchdsc /g,"\u04BF"],[/\\cyrchar\\CYRpalochka /g,"\u04C0"],[/\\cyrchar\\CYRKHK /g,"\u04C3"],[/\\cyrchar\\cyrkhk /g,"\u04C4"],[/\\cyrchar\\CYRNHK /g,"\u04C7"],[/\\cyrchar\\cyrnhk /g,"\u04C8"],[/\\cyrchar\\CYRCHLDSC /g,"\u04CB"],[/\\cyrchar\\cyrchldsc /g,"\u04CC"],[/\\cyrchar\\CYRAE /g,"\u04D4"],[/\\cyrchar\\cyrae /g,"\u04D5"],[/\\cyrchar\\CYRSCHWA /g,"\u04D8"],[/\\cyrchar\\cyrschwa /g,"\u04D9"],[/\\cyrchar\\CYRABHDZE /g,"\u04E0"],[/\\cyrchar\\cyrabhdze /g,"\u04E1"],[/\\cyrchar\\CYROTLD /g,"\u04E8"],[/\\cyrchar\\cyrotld /g,"\u04E9"],[/\\hspace\{0.6em\}/g,"\u2002"],[/\\hspace\{1em\}/g,"\u2003"],[/\\hspace\{0.33em\}/g,"\u2004"],[/\\hspace\{0.25em\}/g,"\u2005"],[/\\hspace\{0.166em\}/g,"\u2006"],[/\\hphantom\{0\}/g,"\u2007"],[/\\hphantom\{,\}/g,"\u2008"],[/\\hspace\{0.167em\}/g,"\u2009"],[/\\mkern1mu /g,"\u200A"],[/\\textendash /g,"\u2013"],[/\\textemdash /g,"\u2014"],[/\\rule\{1em\}\{1pt\}/g,"\u2015"],[/\\Vert /g,"\u2016"],[/\\Elzreapos /g,"\u201B"],[/\\textquotedblleft /g,"\u201C"],[/\\textquotedblright /g,"\u201D"],[/\\textdagger /g,"\u2020"],[/\\textdaggerdbl /g,"\u2021"],[/\\textbullet /g,"\u2022"],[/\\ldots /g,"\u2026"],[/\\textperthousand /g,"\u2030"],[/\\textpertenthousand /g,"\u2031"],[/\\backprime /g,"\u2035"],[/\\guilsinglleft /g,"\u2039"],[/\\guilsinglright /g,"\u203A"],[/\\mkern4mu /g,"\u205F"],[/\\nolinebreak /g,"\u2060"],[/\\ensuremath\{\\Elzpes\}/g,"\u20A7"],[/\\mbox\{\\texteuro\} /g,"\u20AC"],[/\\dddot /g,"\u20DB"],[/\\ddddot /g,"\u20DC"],[/\\mathbb\{C\}/g,"\u2102"],[/\\mathscr\{g\}/g,"\u210A"],[/\\mathscr\{H\}/g,"\u210B"],[/\\mathfrak\{H\}/g,"\u210C"],[/\\mathbb\{H\}/g,"\u210D"],[/\\hslash /g,"\u210F"],[/\\mathscr\{I\}/g,"\u2110"],[/\\mathfrak\{I\}/g,"\u2111"],[/\\mathscr\{L\}/g,"\u2112"],[/\\mathscr\{l\}/g,"\u2113"],[/\\mathbb\{N\}/g,"\u2115"],[/\\cyrchar\\textnumero /g,"\u2116"],[/\\wp /g,"\u2118"],[/\\mathbb\{P\}/g,"\u2119"],[/\\mathbb\{Q\}/g,"\u211A"],[/\\mathscr\{R\}/g,"\u211B"],[/\\mathfrak\{R\}/g,"\u211C"],[/\\mathbb\{R\}/g,"\u211D"],[/\\Elzxrat /g,"\u211E"],[/\\texttrademark /g,"\u2122"],[/\\mathbb\{Z\}/g,"\u2124"],[/\\Omega /g,"\u2126"],[/\\mho /g,"\u2127"],[/\\mathfrak\{Z\}/g,"\u2128"],[/\\ElsevierGlyph\{2129\}/g,"\u2129"],[/\\AA /g,"\u212B"],[/\\mathscr\{B\}/g,"\u212C"],[/\\mathfrak\{C\}/g,"\u212D"],[/\\mathscr\{e\}/g,"\u212F"],[/\\mathscr\{E\}/g,"\u2130"],[/\\mathscr\{F\}/g,"\u2131"],[/\\mathscr\{M\}/g,"\u2133"],[/\\mathscr\{o\}/g,"\u2134"],[/\\aleph /g,"\u2135"],[/\\beth /g,"\u2136"],[/\\gimel /g,"\u2137"],[/\\daleth /g,"\u2138"],[/\\textfrac\{1\}\{3\}/g,"\u2153"],[/\\textfrac\{2\}\{3\}/g,"\u2154"],[/\\textfrac\{1\}\{5\}/g,"\u2155"],[/\\textfrac\{2\}\{5\}/g,"\u2156"],[/\\textfrac\{3\}\{5\}/g,"\u2157"],[/\\textfrac\{4\}\{5\}/g,"\u2158"],[/\\textfrac\{1\}\{6\}/g,"\u2159"],[/\\textfrac\{5\}\{6\}/g,"\u215A"],[/\\textfrac\{1\}\{8\}/g,"\u215B"],[/\\textfrac\{3\}\{8\}/g,"\u215C"],[/\\textfrac\{5\}\{8\}/g,"\u215D"],[/\\textfrac\{7\}\{8\}/g,"\u215E"],[/\\leftarrow /g,"\u2190"],[/\\uparrow /g,"\u2191"],[/\\rightarrow /g,"\u2192"],[/\\downarrow /g,"\u2193"],[/\\leftrightarrow /g,"\u2194"],[/\\updownarrow /g,"\u2195"],[/\\nwarrow /g,"\u2196"],[/\\nearrow /g,"\u2197"],[/\\searrow /g,"\u2198"],[/\\swarrow /g,"\u2199"],[/\\nleftarrow /g,"\u219A"],[/\\nrightarrow /g,"\u219B"],[/\\arrowwaveright /g,"\u219C"],[/\\arrowwaveright /g,"\u219D"],[/\\twoheadleftarrow /g,"\u219E"],[/\\twoheadrightarrow /g,"\u21A0"],[/\\leftarrowtail /g,"\u21A2"],[/\\rightarrowtail /g,"\u21A3"],[/\\mapsto /g,"\u21A6"],[/\\hookleftarrow /g,"\u21A9"],[/\\hookrightarrow /g,"\u21AA"],[/\\looparrowleft /g,"\u21AB"],[/\\looparrowright /g,"\u21AC"],[/\\leftrightsquigarrow /g,"\u21AD"],[/\\nleftrightarrow /g,"\u21AE"],[/\\Lsh /g,"\u21B0"],[/\\Rsh /g,"\u21B1"],[/\\ElsevierGlyph\{21B3\}/g,"\u21B3"],[/\\curvearrowleft /g,"\u21B6"],[/\\curvearrowright /g,"\u21B7"],[/\\circlearrowleft /g,"\u21BA"],[/\\circlearrowright /g,"\u21BB"],[/\\leftharpoonup /g,"\u21BC"],[/\\leftharpoondown /g,"\u21BD"],[/\\upharpoonright /g,"\u21BE"],[/\\upharpoonleft /g,"\u21BF"],[/\\rightharpoonup /g,"\u21C0"],[/\\rightharpoondown /g,"\u21C1"],[/\\downharpoonright /g,"\u21C2"],[/\\downharpoonleft /g,"\u21C3"],[/\\rightleftarrows /g,"\u21C4"],[/\\dblarrowupdown /g,"\u21C5"],[/\\leftrightarrows /g,"\u21C6"],[/\\leftleftarrows /g,"\u21C7"],[/\\upuparrows /g,"\u21C8"],[/\\rightrightarrows /g,"\u21C9"],[/\\downdownarrows /g,"\u21CA"],[/\\leftrightharpoons /g,"\u21CB"],[/\\rightleftharpoons /g,"\u21CC"],[/\\nLeftarrow /g,"\u21CD"],[/\\nLeftrightarrow /g,"\u21CE"],[/\\nRightarrow /g,"\u21CF"],[/\\Leftarrow /g,"\u21D0"],[/\\Uparrow /g,"\u21D1"],[/\\Rightarrow /g,"\u21D2"],[/\\Downarrow /g,"\u21D3"],[/\\Leftrightarrow /g,"\u21D4"],[/\\Updownarrow /g,"\u21D5"],[/\\Lleftarrow /g,"\u21DA"],[/\\Rrightarrow /g,"\u21DB"],[/\\rightsquigarrow /g,"\u21DD"],[/\\DownArrowUpArrow /g,"\u21F5"],[/\\forall /g,"\u2200"],[/\\complement /g,"\u2201"],[/\\partial /g,"\u2202"],[/\\exists /g,"\u2203"],[/\\nexists /g,"\u2204"],[/\\varnothing /g,"\u2205"],[/\\nabla /g,"\u2207"],[/\\in /g,"\u2208"],[/\\not\\in /g,"\u2209"],[/\\ni /g,"\u220B"],[/\\not\\ni /g,"\u220C"],[/\\prod /g,"\u220F"],[/\\coprod /g,"\u2210"],[/\\sum /g,"\u2211"],[/\\mp /g,"\u2213"],[/\\dotplus /g,"\u2214"],[/\\setminus /g,"\u2216"],[/\\circ /g,"\u2218"],[/\\bullet /g,"\u2219"],[/\\surd /g,"\u221A"],[/\\propto /g,"\u221D"],[/\\infty /g,"\u221E"],[/\\rightangle /g,"\u221F"],[/\\angle /g,"\u2220"],[/\\measuredangle /g,"\u2221"],[/\\sphericalangle /g,"\u2222"],[/\\mid /g,"\u2223"],[/\\nmid /g,"\u2224"],[/\\parallel /g,"\u2225"],[/\\nparallel /g,"\u2226"],[/\\wedge /g,"\u2227"],[/\\vee /g,"\u2228"],[/\\cap /g,"\u2229"],[/\\cup /g,"\u222A"],[/\\int /g,"\u222B"],[/\\int\\!\\int /g,"\u222C"],[/\\int\\!\\int\\!\\int /g,"\u222D"],[/\\oint /g,"\u222E"],[/\\surfintegral /g,"\u222F"],[/\\volintegral /g,"\u2230"],[/\\clwintegral /g,"\u2231"],[/\\ElsevierGlyph\{2232\}/g,"\u2232"],[/\\ElsevierGlyph\{2233\}/g,"\u2233"],[/\\therefore /g,"\u2234"],[/\\because /g,"\u2235"],[/\\Colon /g,"\u2237"],[/\\ElsevierGlyph\{2238\}/g,"\u2238"],[/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g,"\u223A"],[/\\homothetic /g,"\u223B"],[/\\sim /g,"\u223C"],[/\\backsim /g,"\u223D"],[/\\lazysinv /g,"\u223E"],[/\\wr /g,"\u2240"],[/\\not\\sim /g,"\u2241"],[/\\ElsevierGlyph\{2242\}/g,"\u2242"],[/\\NotEqualTilde /g,"\u2242-00338"],[/\\simeq /g,"\u2243"],[/\\not\\simeq /g,"\u2244"],[/\\cong /g,"\u2245"],[/\\approxnotequal /g,"\u2246"],[/\\not\\cong /g,"\u2247"],[/\\approx /g,"\u2248"],[/\\not\\approx /g,"\u2249"],[/\\approxeq /g,"\u224A"],[/\\tildetrpl /g,"\u224B"],[/\\not\\apid /g,"\u224B-00338"],[/\\allequal /g,"\u224C"],[/\\asymp /g,"\u224D"],[/\\Bumpeq /g,"\u224E"],[/\\NotHumpDownHump /g,"\u224E-00338"],[/\\bumpeq /g,"\u224F"],[/\\NotHumpEqual /g,"\u224F-00338"],[/\\doteq /g,"\u2250"],[/\\not\\doteq/g,"\u2250-00338"],[/\\doteqdot /g,"\u2251"],[/\\fallingdotseq /g,"\u2252"],[/\\risingdotseq /g,"\u2253"],[/\\eqcirc /g,"\u2256"],[/\\circeq /g,"\u2257"],[/\\estimates /g,"\u2259"],[/\\ElsevierGlyph\{225A\}/g,"\u225A"],[/\\starequal /g,"\u225B"],[/\\triangleq /g,"\u225C"],[/\\ElsevierGlyph\{225F\}/g,"\u225F"],[/\\not =/g,"\u2260"],[/\\equiv /g,"\u2261"],[/\\not\\equiv /g,"\u2262"],[/\\leq /g,"\u2264"],[/\\geq /g,"\u2265"],[/\\leqq /g,"\u2266"],[/\\geqq /g,"\u2267"],[/\\lneqq /g,"\u2268"],[/\\lvertneqq /g,"\u2268-0FE00"],[/\\gneqq /g,"\u2269"],[/\\gvertneqq /g,"\u2269-0FE00"],[/\\ll /g,"\u226A"],[/\\NotLessLess /g,"\u226A-00338"],[/\\gg /g,"\u226B"],[/\\NotGreaterGreater /g,"\u226B-00338"],[/\\between /g,"\u226C"],[/\\not\\kern\-0.3em\\times /g,"\u226D"],[/\\not</g,"\u226E"],[/\\not>/g,"\u226F"],[/\\not\\leq /g,"\u2270"],[/\\not\\geq /g,"\u2271"],[/\\lessequivlnt /g,"\u2272"],[/\\greaterequivlnt /g,"\u2273"],[/\\ElsevierGlyph\{2274\}/g,"\u2274"],[/\\ElsevierGlyph\{2275\}/g,"\u2275"],[/\\lessgtr /g,"\u2276"],[/\\gtrless /g,"\u2277"],[/\\notlessgreater /g,"\u2278"],[/\\notgreaterless /g,"\u2279"],[/\\prec /g,"\u227A"],[/\\succ /g,"\u227B"],[/\\preccurlyeq /g,"\u227C"],[/\\succcurlyeq /g,"\u227D"],[/\\precapprox /g,"\u227E"],[/\\NotPrecedesTilde /g,"\u227E-00338"],[/\\succapprox /g,"\u227F"],[/\\NotSucceedsTilde /g,"\u227F-00338"],[/\\not\\prec /g,"\u2280"],[/\\not\\succ /g,"\u2281"],[/\\subset /g,"\u2282"],[/\\supset /g,"\u2283"],[/\\not\\subset /g,"\u2284"],[/\\not\\supset /g,"\u2285"],[/\\subseteq /g,"\u2286"],[/\\supseteq /g,"\u2287"],[/\\not\\subseteq /g,"\u2288"],[/\\not\\supseteq /g,"\u2289"],[/\\subsetneq /g,"\u228A"],[/\\varsubsetneqq /g,"\u228A-0FE00"],[/\\supsetneq /g,"\u228B"],[/\\varsupsetneq /g,"\u228B-0FE00"],[/\\uplus /g,"\u228E"],[/\\sqsubset /g,"\u228F"],[/\\NotSquareSubset /g,"\u228F-00338"],[/\\sqsupset /g,"\u2290"],[/\\NotSquareSuperset /g,"\u2290-00338"],[/\\sqsubseteq /g,"\u2291"],[/\\sqsupseteq /g,"\u2292"],[/\\sqcap /g,"\u2293"],[/\\sqcup /g,"\u2294"],[/\\oplus /g,"\u2295"],[/\\ominus /g,"\u2296"],[/\\otimes /g,"\u2297"],[/\\oslash /g,"\u2298"],[/\\odot /g,"\u2299"],[/\\circledcirc /g,"\u229A"],[/\\circledast /g,"\u229B"],[/\\circleddash /g,"\u229D"],[/\\boxplus /g,"\u229E"],[/\\boxminus /g,"\u229F"],[/\\boxtimes /g,"\u22A0"],[/\\boxdot /g,"\u22A1"],[/\\vdash /g,"\u22A2"],[/\\dashv /g,"\u22A3"],[/\\top /g,"\u22A4"],[/\\perp /g,"\u22A5"],[/\\truestate /g,"\u22A7"],[/\\forcesextra /g,"\u22A8"],[/\\Vdash /g,"\u22A9"],[/\\Vvdash /g,"\u22AA"],[/\\VDash /g,"\u22AB"],[/\\nvdash /g,"\u22AC"],[/\\nvDash /g,"\u22AD"],[/\\nVdash /g,"\u22AE"],[/\\nVDash /g,"\u22AF"],[/\\vartriangleleft /g,"\u22B2"],[/\\vartriangleright /g,"\u22B3"],[/\\trianglelefteq /g,"\u22B4"],[/\\trianglerighteq /g,"\u22B5"],[/\\original /g,"\u22B6"],[/\\image /g,"\u22B7"],[/\\multimap /g,"\u22B8"],[/\\hermitconjmatrix /g,"\u22B9"],[/\\intercal /g,"\u22BA"],[/\\veebar /g,"\u22BB"],[/\\rightanglearc /g,"\u22BE"],[/\\ElsevierGlyph\{22C0\}/g,"\u22C0"],[/\\ElsevierGlyph\{22C1\}/g,"\u22C1"],[/\\bigcap /g,"\u22C2"],[/\\bigcup /g,"\u22C3"],[/\\diamond /g,"\u22C4"],[/\\cdot /g,"\u22C5"],[/\\star /g,"\u22C6"],[/\\divideontimes /g,"\u22C7"],[/\\bowtie /g,"\u22C8"],[/\\ltimes /g,"\u22C9"],[/\\rtimes /g,"\u22CA"],[/\\leftthreetimes /g,"\u22CB"],[/\\rightthreetimes /g,"\u22CC"],[/\\backsimeq /g,"\u22CD"],[/\\curlyvee /g,"\u22CE"],[/\\curlywedge /g,"\u22CF"],[/\\Subset /g,"\u22D0"],[/\\Supset /g,"\u22D1"],[/\\Cap /g,"\u22D2"],[/\\Cup /g,"\u22D3"],[/\\pitchfork /g,"\u22D4"],[/\\lessdot /g,"\u22D6"],[/\\gtrdot /g,"\u22D7"],[/\\verymuchless /g,"\u22D8"],[/\\verymuchgreater /g,"\u22D9"],[/\\lesseqgtr /g,"\u22DA"],[/\\gtreqless /g,"\u22DB"],[/\\curlyeqprec /g,"\u22DE"],[/\\curlyeqsucc /g,"\u22DF"],[/\\not\\sqsubseteq /g,"\u22E2"],[/\\not\\sqsupseteq /g,"\u22E3"],[/\\Elzsqspne /g,"\u22E5"],[/\\lnsim /g,"\u22E6"],[/\\gnsim /g,"\u22E7"],[/\\precedesnotsimilar /g,"\u22E8"],[/\\succnsim /g,"\u22E9"],[/\\ntriangleleft /g,"\u22EA"],[/\\ntriangleright /g,"\u22EB"],[/\\ntrianglelefteq /g,"\u22EC"],[/\\ntrianglerighteq /g,"\u22ED"],[/\\vdots /g,"\u22EE"],[/\\cdots /g,"\u22EF"],[/\\upslopeellipsis /g,"\u22F0"],[/\\downslopeellipsis /g,"\u22F1"],[/\\barwedge /g,"\u2305"],[/\\perspcorrespond /g,"\u2306"],[/\\lceil /g,"\u2308"],[/\\rceil /g,"\u2309"],[/\\lfloor /g,"\u230A"],[/\\rfloor /g,"\u230B"],[/\\recorder /g,"\u2315"],[/\\mathchar"2208/g,"\u2316"],[/\\ulcorner /g,"\u231C"],[/\\urcorner /g,"\u231D"],[/\\llcorner /g,"\u231E"],[/\\lrcorner /g,"\u231F"],[/\\frown /g,"\u2322"],[/\\smile /g,"\u2323"],[/\\langle /g,"\u2329"],[/\\rangle /g,"\u232A"],[/\\ElsevierGlyph\{E838\}/g,"\u233D"],[/\\Elzdlcorn /g,"\u23A3"],[/\\lmoustache /g,"\u23B0"],[/\\rmoustache /g,"\u23B1"],[/\\textvisiblespace /g,"\u2423"],[/\\ding\{172\}/g,"\u2460"],[/\\ding\{173\}/g,"\u2461"],[/\\ding\{174\}/g,"\u2462"],[/\\ding\{175\}/g,"\u2463"],[/\\ding\{176\}/g,"\u2464"],[/\\ding\{177\}/g,"\u2465"],[/\\ding\{178\}/g,"\u2466"],[/\\ding\{179\}/g,"\u2467"],[/\\ding\{180\}/g,"\u2468"],[/\\ding\{181\}/g,"\u2469"],[/\\circledS /g,"\u24C8"],[/\\Elzdshfnc /g,"\u2506"],[/\\Elzsqfnw /g,"\u2519"],[/\\diagup /g,"\u2571"],[/\\ding\{110\}/g,"\u25A0"],[/\\square /g,"\u25A1"],[/\\blacksquare /g,"\u25AA"],[/\\fbox\{~~\}/g,"\u25AD"],[/\\Elzvrecto /g,"\u25AF"],[/\\ElsevierGlyph\{E381\}/g,"\u25B1"],[/\\ding\{115\}/g,"\u25B2"],[/\\bigtriangleup /g,"\u25B3"],[/\\blacktriangle /g,"\u25B4"],[/\\vartriangle /g,"\u25B5"],[/\\blacktriangleright /g,"\u25B8"],[/\\triangleright /g,"\u25B9"],[/\\ding\{116\}/g,"\u25BC"],[/\\bigtriangledown /g,"\u25BD"],[/\\blacktriangledown /g,"\u25BE"],[/\\triangledown /g,"\u25BF"],[/\\blacktriangleleft /g,"\u25C2"],[/\\triangleleft /g,"\u25C3"],[/\\ding\{117\}/g,"\u25C6"],[/\\lozenge /g,"\u25CA"],[/\\bigcirc /g,"\u25CB"],[/\\ding\{108\}/g,"\u25CF"],[/\\Elzcirfl /g,"\u25D0"],[/\\Elzcirfr /g,"\u25D1"],[/\\Elzcirfb /g,"\u25D2"],[/\\ding\{119\}/g,"\u25D7"],[/\\Elzrvbull /g,"\u25D8"],[/\\Elzsqfl /g,"\u25E7"],[/\\Elzsqfr /g,"\u25E8"],[/\\Elzsqfse /g,"\u25EA"],[/\\bigcirc /g,"\u25EF"],[/\\ding\{72\}/g,"\u2605"],[/\\ding\{73\}/g,"\u2606"],[/\\ding\{37\}/g,"\u260E"],[/\\ding\{42\}/g,"\u261B"],[/\\ding\{43\}/g,"\u261E"],[/\\rightmoon /g,"\u263E"],[/\\mercury /g,"\u263F"],[/\\venus /g,"\u2640"],[/\\male /g,"\u2642"],[/\\jupiter /g,"\u2643"],[/\\saturn /g,"\u2644"],[/\\uranus /g,"\u2645"],[/\\neptune /g,"\u2646"],[/\\pluto /g,"\u2647"],[/\\aries /g,"\u2648"],[/\\taurus /g,"\u2649"],[/\\gemini /g,"\u264A"],[/\\cancer /g,"\u264B"],[/\\leo /g,"\u264C"],[/\\virgo /g,"\u264D"],[/\\libra /g,"\u264E"],[/\\scorpio /g,"\u264F"],[/\\sagittarius /g,"\u2650"],[/\\capricornus /g,"\u2651"],[/\\aquarius /g,"\u2652"],[/\\pisces /g,"\u2653"],[/\\ding\{171\}/g,"\u2660"],[/\\diamond /g,"\u2662"],[/\\ding\{168\}/g,"\u2663"],[/\\ding\{170\}/g,"\u2665"],[/\\ding\{169\}/g,"\u2666"],[/\\quarternote /g,"\u2669"],[/\\eighthnote /g,"\u266A"],[/\\flat /g,"\u266D"],[/\\natural /g,"\u266E"],[/\\sharp /g,"\u266F"],[/\\ding\{33\}/g,"\u2701"],[/\\ding\{34\}/g,"\u2702"],[/\\ding\{35\}/g,"\u2703"],[/\\ding\{36\}/g,"\u2704"],[/\\ding\{38\}/g,"\u2706"],[/\\ding\{39\}/g,"\u2707"],[/\\ding\{40\}/g,"\u2708"],[/\\ding\{41\}/g,"\u2709"],[/\\ding\{44\}/g,"\u270C"],[/\\ding\{45\}/g,"\u270D"],[/\\ding\{46\}/g,"\u270E"],[/\\ding\{47\}/g,"\u270F"],[/\\ding\{48\}/g,"\u2710"],[/\\ding\{49\}/g,"\u2711"],[/\\ding\{50\}/g,"\u2712"],[/\\ding\{51\}/g,"\u2713"],[/\\ding\{52\}/g,"\u2714"],[/\\ding\{53\}/g,"\u2715"],[/\\ding\{54\}/g,"\u2716"],[/\\ding\{55\}/g,"\u2717"],[/\\ding\{56\}/g,"\u2718"],[/\\ding\{57\}/g,"\u2719"],[/\\ding\{58\}/g,"\u271A"],[/\\ding\{59\}/g,"\u271B"],[/\\ding\{60\}/g,"\u271C"],[/\\ding\{61\}/g,"\u271D"],[/\\ding\{62\}/g,"\u271E"],[/\\ding\{63\}/g,"\u271F"],[/\\ding\{64\}/g,"\u2720"],[/\\ding\{65\}/g,"\u2721"],[/\\ding\{66\}/g,"\u2722"],[/\\ding\{67\}/g,"\u2723"],[/\\ding\{68\}/g,"\u2724"],[/\\ding\{69\}/g,"\u2725"],[/\\ding\{70\}/g,"\u2726"],[/\\ding\{71\}/g,"\u2727"],[/\\ding\{73\}/g,"\u2729"],[/\\ding\{74\}/g,"\u272A"],[/\\ding\{75\}/g,"\u272B"],[/\\ding\{76\}/g,"\u272C"],[/\\ding\{77\}/g,"\u272D"],[/\\ding\{78\}/g,"\u272E"],[/\\ding\{79\}/g,"\u272F"],[/\\ding\{80\}/g,"\u2730"],[/\\ding\{81\}/g,"\u2731"],[/\\ding\{82\}/g,"\u2732"],[/\\ding\{83\}/g,"\u2733"],[/\\ding\{84\}/g,"\u2734"],[/\\ding\{85\}/g,"\u2735"],[/\\ding\{86\}/g,"\u2736"],[/\\ding\{87\}/g,"\u2737"],[/\\ding\{88\}/g,"\u2738"],[/\\ding\{89\}/g,"\u2739"],[/\\ding\{90\}/g,"\u273A"],[/\\ding\{91\}/g,"\u273B"],[/\\ding\{92\}/g,"\u273C"],[/\\ding\{93\}/g,"\u273D"],[/\\ding\{94\}/g,"\u273E"],[/\\ding\{95\}/g,"\u273F"],[/\\ding\{96\}/g,"\u2740"],[/\\ding\{97\}/g,"\u2741"],[/\\ding\{98\}/g,"\u2742"],[/\\ding\{99\}/g,"\u2743"],[/\\ding\{100\}/g,"\u2744"],[/\\ding\{101\}/g,"\u2745"],[/\\ding\{102\}/g,"\u2746"],[/\\ding\{103\}/g,"\u2747"],[/\\ding\{104\}/g,"\u2748"],[/\\ding\{105\}/g,"\u2749"],[/\\ding\{106\}/g,"\u274A"],[/\\ding\{107\}/g,"\u274B"],[/\\ding\{109\}/g,"\u274D"],[/\\ding\{111\}/g,"\u274F"],[/\\ding\{112\}/g,"\u2750"],[/\\ding\{113\}/g,"\u2751"],[/\\ding\{114\}/g,"\u2752"],[/\\ding\{118\}/g,"\u2756"],[/\\ding\{120\}/g,"\u2758"],[/\\ding\{121\}/g,"\u2759"],[/\\ding\{122\}/g,"\u275A"],[/\\ding\{123\}/g,"\u275B"],[/\\ding\{124\}/g,"\u275C"],[/\\ding\{125\}/g,"\u275D"],[/\\ding\{126\}/g,"\u275E"],[/\\ding\{161\}/g,"\u2761"],[/\\ding\{162\}/g,"\u2762"],[/\\ding\{163\}/g,"\u2763"],[/\\ding\{164\}/g,"\u2764"],[/\\ding\{165\}/g,"\u2765"],[/\\ding\{166\}/g,"\u2766"],[/\\ding\{167\}/g,"\u2767"],[/\\ding\{182\}/g,"\u2776"],[/\\ding\{183\}/g,"\u2777"],[/\\ding\{184\}/g,"\u2778"],[/\\ding\{185\}/g,"\u2779"],[/\\ding\{186\}/g,"\u277A"],[/\\ding\{187\}/g,"\u277B"],[/\\ding\{188\}/g,"\u277C"],[/\\ding\{189\}/g,"\u277D"],[/\\ding\{190\}/g,"\u277E"],[/\\ding\{191\}/g,"\u277F"],[/\\ding\{192\}/g,"\u2780"],[/\\ding\{193\}/g,"\u2781"],[/\\ding\{194\}/g,"\u2782"],[/\\ding\{195\}/g,"\u2783"],[/\\ding\{196\}/g,"\u2784"],[/\\ding\{197\}/g,"\u2785"],[/\\ding\{198\}/g,"\u2786"],[/\\ding\{199\}/g,"\u2787"],[/\\ding\{200\}/g,"\u2788"],[/\\ding\{201\}/g,"\u2789"],[/\\ding\{202\}/g,"\u278A"],[/\\ding\{203\}/g,"\u278B"],[/\\ding\{204\}/g,"\u278C"],[/\\ding\{205\}/g,"\u278D"],[/\\ding\{206\}/g,"\u278E"],[/\\ding\{207\}/g,"\u278F"],[/\\ding\{208\}/g,"\u2790"],[/\\ding\{209\}/g,"\u2791"],[/\\ding\{210\}/g,"\u2792"],[/\\ding\{211\}/g,"\u2793"],[/\\ding\{212\}/g,"\u2794"],[/\\ding\{216\}/g,"\u2798"],[/\\ding\{217\}/g,"\u2799"],[/\\ding\{218\}/g,"\u279A"],[/\\ding\{219\}/g,"\u279B"],[/\\ding\{220\}/g,"\u279C"],[/\\ding\{221\}/g,"\u279D"],[/\\ding\{222\}/g,"\u279E"],[/\\ding\{223\}/g,"\u279F"],[/\\ding\{224\}/g,"\u27A0"],[/\\ding\{225\}/g,"\u27A1"],[/\\ding\{226\}/g,"\u27A2"],[/\\ding\{227\}/g,"\u27A3"],[/\\ding\{228\}/g,"\u27A4"],[/\\ding\{229\}/g,"\u27A5"],[/\\ding\{230\}/g,"\u27A6"],[/\\ding\{231\}/g,"\u27A7"],[/\\ding\{232\}/g,"\u27A8"],[/\\ding\{233\}/g,"\u27A9"],[/\\ding\{234\}/g,"\u27AA"],[/\\ding\{235\}/g,"\u27AB"],[/\\ding\{236\}/g,"\u27AC"],[/\\ding\{237\}/g,"\u27AD"],[/\\ding\{238\}/g,"\u27AE"],[/\\ding\{239\}/g,"\u27AF"],[/\\ding\{241\}/g,"\u27B1"],[/\\ding\{242\}/g,"\u27B2"],[/\\ding\{243\}/g,"\u27B3"],[/\\ding\{244\}/g,"\u27B4"],[/\\ding\{245\}/g,"\u27B5"],[/\\ding\{246\}/g,"\u27B6"],[/\\ding\{247\}/g,"\u27B7"],[/\\ding\{248\}/g,"\u27B8"],[/\\ding\{249\}/g,"\u27B9"],[/\\ding\{250\}/g,"\u27BA"],[/\\ding\{251\}/g,"\u27BB"],[/\\ding\{252\}/g,"\u27BC"],[/\\ding\{253\}/g,"\u27BD"],[/\\ding\{254\}/g,"\u27BE"],[/\\longleftarrow /g,"\u27F5"],[/\\longrightarrow /g,"\u27F6"],[/\\longleftrightarrow /g,"\u27F7"],[/\\Longleftarrow /g,"\u27F8"],[/\\Longrightarrow /g,"\u27F9"],[/\\Longleftrightarrow /g,"\u27FA"],[/\\longmapsto /g,"\u27FC"],[/\\sim\\joinrel\\leadsto/g,"\u27FF"],[/\\ElsevierGlyph\{E212\}/g,"\u2905"],[/\\UpArrowBar /g,"\u2912"],[/\\DownArrowBar /g,"\u2913"],[/\\ElsevierGlyph\{E20C\}/g,"\u2923"],[/\\ElsevierGlyph\{E20D\}/g,"\u2924"],[/\\ElsevierGlyph\{E20B\}/g,"\u2925"],[/\\ElsevierGlyph\{E20A\}/g,"\u2926"],[/\\ElsevierGlyph\{E211\}/g,"\u2927"],[/\\ElsevierGlyph\{E20E\}/g,"\u2928"],[/\\ElsevierGlyph\{E20F\}/g,"\u2929"],[/\\ElsevierGlyph\{E210\}/g,"\u292A"],[/\\ElsevierGlyph\{E21C\}/g,"\u2933"],[/\\ElsevierGlyph\{E21D\}/g,"\u2933-00338"],[/\\ElsevierGlyph\{E21A\}/g,"\u2936"],[/\\ElsevierGlyph\{E219\}/g,"\u2937"],[/\\Elolarr /g,"\u2940"],[/\\Elorarr /g,"\u2941"],[/\\ElzRlarr /g,"\u2942"],[/\\ElzrLarr /g,"\u2944"],[/\\Elzrarrx /g,"\u2947"],[/\\LeftRightVector /g,"\u294E"],[/\\RightUpDownVector /g,"\u294F"],[/\\DownLeftRightVector /g,"\u2950"],[/\\LeftUpDownVector /g,"\u2951"],[/\\LeftVectorBar /g,"\u2952"],[/\\RightVectorBar /g,"\u2953"],[/\\RightUpVectorBar /g,"\u2954"],[/\\RightDownVectorBar /g,"\u2955"],[/\\DownLeftVectorBar /g,"\u2956"],[/\\DownRightVectorBar /g,"\u2957"],[/\\LeftUpVectorBar /g,"\u2958"],[/\\LeftDownVectorBar /g,"\u2959"],[/\\LeftTeeVector /g,"\u295A"],[/\\RightTeeVector /g,"\u295B"],[/\\RightUpTeeVector /g,"\u295C"],[/\\RightDownTeeVector /g,"\u295D"],[/\\DownLeftTeeVector /g,"\u295E"],[/\\DownRightTeeVector /g,"\u295F"],[/\\LeftUpTeeVector /g,"\u2960"],[/\\LeftDownTeeVector /g,"\u2961"],[/\\UpEquilibrium /g,"\u296E"],[/\\ReverseUpEquilibrium /g,"\u296F"],[/\\RoundImplies /g,"\u2970"],[/\\ElsevierGlyph\{E214\}/g,"\u297C"],[/\\ElsevierGlyph\{E215\}/g,"\u297D"],[/\\Elztfnc /g,"\u2980"],[/\\ElsevierGlyph\{3018\}/g,"\u2985"],[/\\Elroang /g,"\u2986"],[/\\ElsevierGlyph\{E291\}/g,"\u2994"],[/\\Elzddfnc /g,"\u2999"],[/\\Angle /g,"\u299C"],[/\\Elzlpargt /g,"\u29A0"],[/\\ElsevierGlyph\{E260\}/g,"\u29B5"],[/\\ElsevierGlyph\{E61B\}/g,"\u29B6"],[/\\ElzLap /g,"\u29CA"],[/\\Elzdefas /g,"\u29CB"],[/\\LeftTriangleBar /g,"\u29CF"],[/\\NotLeftTriangleBar /g,"\u29CF-00338"],[/\\RightTriangleBar /g,"\u29D0"],[/\\NotRightTriangleBar /g,"\u29D0-00338"],[/\\ElsevierGlyph\{E372\}/g,"\u29DC"],[/\\blacklozenge /g,"\u29EB"],[/\\RuleDelayed /g,"\u29F4"],[/\\Elxuplus /g,"\u2A04"],[/\\ElzThr /g,"\u2A05"],[/\\Elxsqcup /g,"\u2A06"],[/\\ElzInf /g,"\u2A07"],[/\\ElzSup /g,"\u2A08"],[/\\ElzCint /g,"\u2A0D"],[/\\clockoint /g,"\u2A0F"],[/\\ElsevierGlyph\{E395\}/g,"\u2A10"],[/\\sqrint /g,"\u2A16"],[/\\ElsevierGlyph\{E25A\}/g,"\u2A25"],[/\\ElsevierGlyph\{E25B\}/g,"\u2A2A"],[/\\ElsevierGlyph\{E25C\}/g,"\u2A2D"],[/\\ElsevierGlyph\{E25D\}/g,"\u2A2E"],[/\\ElzTimes /g,"\u2A2F"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A34"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A35"],[/\\ElsevierGlyph\{E259\}/g,"\u2A3C"],[/\\amalg /g,"\u2A3F"],[/\\ElzAnd /g,"\u2A53"],[/\\ElzOr /g,"\u2A54"],[/\\ElsevierGlyph\{E36E\}/g,"\u2A55"],[/\\ElOr /g,"\u2A56"],[/\\perspcorrespond /g,"\u2A5E"],[/\\Elzminhat /g,"\u2A5F"],[/\\ElsevierGlyph\{225A\}/g,"\u2A63"],[/\\stackrel\{*\}\{=\}/g,"\u2A6E"],[/\\Equal /g,"\u2A75"],[/\\leqslant /g,"\u2A7D"],[/\\nleqslant /g,"\u2A7D-00338"],[/\\geqslant /g,"\u2A7E"],[/\\ngeqslant /g,"\u2A7E-00338"],[/\\lessapprox /g,"\u2A85"],[/\\gtrapprox /g,"\u2A86"],[/\\lneq /g,"\u2A87"],[/\\gneq /g,"\u2A88"],[/\\lnapprox /g,"\u2A89"],[/\\gnapprox /g,"\u2A8A"],[/\\lesseqqgtr /g,"\u2A8B"],[/\\gtreqqless /g,"\u2A8C"],[/\\eqslantless /g,"\u2A95"],[/\\eqslantgtr /g,"\u2A96"],[/\\Pisymbol\{ppi020\}\{117\}/g,"\u2A9D"],[/\\Pisymbol\{ppi020\}\{105\}/g,"\u2A9E"],[/\\NestedLessLess /g,"\u2AA1"],[/\\NotNestedLessLess /g,"\u2AA1-00338"],[/\\NestedGreaterGreater /g,"\u2AA2"],[/\\NotNestedGreaterGreater /g,"\u2AA2-00338"],[/\\preceq /g,"\u2AAF"],[/\\not\\preceq /g,"\u2AAF-00338"],[/\\succeq /g,"\u2AB0"],[/\\not\\succeq /g,"\u2AB0-00338"],[/\\precneqq /g,"\u2AB5"],[/\\succneqq /g,"\u2AB6"],[/\\precapprox /g,"\u2AB7"],[/\\succapprox /g,"\u2AB8"],[/\\precnapprox /g,"\u2AB9"],[/\\succnapprox /g,"\u2ABA"],[/\\subseteqq /g,"\u2AC5"],[/\\nsubseteqq /g,"\u2AC5-00338"],[/\\supseteqq /g,"\u2AC6"],[/\\nsupseteqq/g,"\u2AC6-00338"],[/\\subsetneqq /g,"\u2ACB"],[/\\supsetneqq /g,"\u2ACC"],[/\\ElsevierGlyph\{E30D\}/g,"\u2AEB"],[/\\Elztdcol /g,"\u2AF6"],[/\\ElsevierGlyph\{300A\}/g,"\u300A"],[/\\ElsevierGlyph\{300B\}/g,"\u300B"],[/\\ElsevierGlyph\{3018\}/g,"\u3018"],[/\\ElsevierGlyph\{3019\}/g,"\u3019"],[/\\openbracketleft /g,"\u301A"],[/\\openbracketright /g,"\u301B"]];return this}if(typeof module!=="undefined"&&module.exports){module.exports=BibtexParser};
\ No newline at end of file
+function BibtexParser(c){if(typeof c=="string"){var d={};var a=[];function b(f){a.push(f)}var e=BibtexParser.call(d,b);e.parse(c);return{entries:a,errors:e.getErrors()}}if(typeof c!="function"){throw"Invalid parser construction."}this.STATES_={ENTRY_OR_JUNK:0,OBJECT_TYPE:1,ENTRY_KEY:2,KV_KEY:3,EQUALS:4,KV_VALUE:5};this.DATA_={};this.CALLBACK_=c;this.CHAR_=0;this.LINE_=1;this.CHAR_IN_LINE_=0;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={};this.SKIPTILLEOL_=false;this.VALBRACES_=null;this.BRACETYPE_=null;this.BRACECOUNT_=0;this.STATE_=this.STATES_.ENTRY_OR_JUNK;this.ERRORS_=[];this.ENTRY_TYPES_={inproceedings:1,proceedings:2,article:3,techreport:4,misc:5,mastersthesis:6,book:7,phdthesis:8,incollection:9,unpublished:10,inbook:11,manual:12,periodical:13,booklet:14,masterthesis:15,conference:16,data:999};this.MACROS_={jan:"January",feb:"February",mar:"March",apr:"April",may:"May",jun:"June",jul:"July",aug:"August",sep:"September",oct:"October",nov:"November",dec:"December",Jan:"January",Feb:"February",Mar:"March",Apr:"April",May:"May",Jun:"June",Jul:"July",Aug:"August",Sep:"September",Oct:"October",Nov:"November",Dec:"December"};this.getErrors=function(){return this.ERRORS_};this.parse=function(f){for(var g=0;g<f.length;g++){this.processCharacter_(f[g])}};this.error_=function(f){this.ERRORS_.push([this.LINE_,this.CHAR_IN_LINE_,this.CHAR_,f])};this.processEntry_=function(){var h=this.DATA_;if(h.Fields){for(var k in h.Fields){var p=h.Fields[k];for(var j=0;j<this.CHARCONV_.length;j++){var q=this.CHARCONV_[j][0];var n=this.CHARCONV_[j][1];p=p.replace(q,n)}p=p.replace(/[\n\r\t]/g," ").replace(/\s\s+/g," ").replace(/^\s+|\s+$/g,"");var l=p.length;var g="";for(var j=0;j<l;j++){var m=p[j];var o=false;if(m=="\\"&&j<l-1){m=p[++j]}else{if(m=="{"||m=="}"){o=true}}if(!o){g+=m}}h.Fields[k]=g}}if(h.ObjectType=="string"){for(var k in h.Fields){this.MACROS_[k]=h.Fields[k]}}else{this.CALLBACK_(h)}};this.processCharacter_=function(l){this.CHAR_++;this.CHAR_IN_LINE_++;if(l=="\n"){this.LINE_++;this.CHAR_IN_LINE_=1}if(this.SKIPTILLEOL_){if(l=="\n"){this.SKIPTILLEOL_=false}return}if(this.SKIPCOMMENT_&&l=="%"){this.SKIPTILLEOL_=true;return}if(this.SKIPWS_&&/\s/.test(l)){return}this.SKIPWS_=false;this.SKIPCOMMENT_=false;this.SKIPTILLEOL_=false;var f=true;while(f){f=false;switch(this.STATE_){case this.STATES_.ENTRY_OR_JUNK:if(l=="@"){this.STATE_=this.STATES_.OBJECT_TYPE;this.DATA_={ObjectType:""}}this.BRACETYPE_=null;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break;case this.STATES_.OBJECT_TYPE:if(/[A-Za-z]/.test(l)){this.DATA_.ObjectType+=l.toLowerCase();this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{var i=this.DATA_.ObjectType;if(i=="comment"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i=="string"){this.DATA_.ObjectType=i;this.DATA_.Fields={};this.BRACETYPE_=l;this.BRACECOUNT_=1;this.STATE_=this.STATES_.KV_KEY;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={Key:""}}else{if(i=="preamble"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i in this.ENTRY_TYPES_){this.DATA_.ObjectType="entry";this.DATA_.EntryType=i;this.DATA_.EntryKey="";this.STATE_=this.STATES_.ENTRY_KEY;f=true}else{this.error_('Unrecognized object type: "'+this.DATA_.ObjectType+'"');this.STATE_=this.STATES_.ENTRY_OR_JUNK}}}}}break;case this.STATES_.ENTRY_KEY:if((l==="{"||l==="(")&&this.BRACETYPE_==null){this.BRACETYPE_=l;this.BRACECOUNT_=1;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break}if(/[,%\s]/.test(l)){if(this.DATA_.EntryKey.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{if(this.BRACETYPE_==null){this.error_("No opening brace for object.");this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;f=true;this.STATE_=this.STATES_.KV_KEY;this.PARSETMP_.Key="";this.DATA_.Fields={}}}}else{this.DATA_.EntryKey+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}break;case this.STATES_.KV_KEY:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(/[\-A-Za-z:]/.test(l)){this.PARSETMP_.Key+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{if(this.PARSETMP_.Key.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.EQUALS;f=true}}break;case this.STATES_.EQUALS:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.error_('Key-value pair has key "'+this.PARSETMP_.Key+'", but no value.');this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(l=="="){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_VALUE;this.PARSETMP_.Value="";this.VALBRACES_={'"':[],"{":[]}}break;case this.STATES_.KV_VALUE:var k=this.VALBRACES_;var j=this.PARSETMP_.Value;var h=false;if(l=='"'||l=="{"||l=="}"||l==","){if(l==","){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}h=true}}if(l=='"'){if(0===k['"'].length+k["{"].length){k['"'].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false;break}if(k['"'].length==1&&k["{"].length==0&&(j.length==0||j[j.length-1]!="\\")){h=true}else{}}if(l=="{"){if(j.length==0||j[j.length-1]!="\\"){k["{"].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{}}if(l=="}"){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}f=true;h=true}else{if(j.length==0||j[j.length-1]!="\\"){if(k["{"].length>0){k["{"].splice(k["{"].length-1,1);if(0==k["{"].length+k['"'].length){h=true}else{}}}else{}}}}if(h){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_KEY;this.DATA_.Fields[this.PARSETMP_.Key]=this.PARSETMP_.Value;this.PARSETMP_={Key:""};this.VALBRACES_=null}else{this.PARSETMP_.Value+=l}break}}};this.CHARCONV_=[[/\\space /g,"\u0020"],[/\\textdollar /g,"\u0024"],[/\\textquotesingle /g,"\u0027"],[/\\ast /g,"\u002A"],[/\\textbackslash /g,"\u005C"],[/\\\^\{\}/g,"\u005E"],[/\\textasciigrave /g,"\u0060"],[/\\lbrace /g,"\u007B"],[/\\vert /g,"\u007C"],[/\\rbrace /g,"\u007D"],[/\\textasciitilde /g,"\u007E"],[/\\textexclamdown /g,"\u00A1"],[/\\textcent /g,"\u00A2"],[/\\textsterling /g,"\u00A3"],[/\\textcurrency /g,"\u00A4"],[/\\textyen /g,"\u00A5"],[/\\textbrokenbar /g,"\u00A6"],[/\\textsection /g,"\u00A7"],[/\\textasciidieresis /g,"\u00A8"],[/\\textcopyright /g,"\u00A9"],[/\\textordfeminine /g,"\u00AA"],[/\\guillemotleft /g,"\u00AB"],[/\\lnot /g,"\u00AC"],[/\\textregistered /g,"\u00AE"],[/\\textasciimacron /g,"\u00AF"],[/\\textdegree /g,"\u00B0"],[/\\pm /g,"\u00B1"],[/\\textasciiacute /g,"\u00B4"],[/\\mathrm\{\\mu\}/g,"\u00B5"],[/\\textparagraph /g,"\u00B6"],[/\\cdot /g,"\u00B7"],[/\\c\{\}/g,"\u00B8"],[/\\textordmasculine /g,"\u00BA"],[/\\guillemotright /g,"\u00BB"],[/\\textonequarter /g,"\u00BC"],[/\\textonehalf /g,"\u00BD"],[/\\textthreequarters /g,"\u00BE"],[/\\textquestiondown /g,"\u00BF"],[/\\`\{A\}/g,"\u00C0"],[/\\'\{A\}/g,"\u00C1"],[/\\\^\{A\}/g,"\u00C2"],[/\\~\{A\}/g,"\u00C3"],[/\\"\{A\}/g,"\u00C4"],[/\\AA /g,"\u00C5"],[/\\AE /g,"\u00C6"],[/\\c\{C\}/g,"\u00C7"],[/\\`\{E\}/g,"\u00C8"],[/\\'\{E\}/g,"\u00C9"],[/\\\^\{E\}/g,"\u00CA"],[/\\"\{E\}/g,"\u00CB"],[/\\`\{I\}/g,"\u00CC"],[/\\'\{I\}/g,"\u00CD"],[/\\\^\{I\}/g,"\u00CE"],[/\\"\{I\}/g,"\u00CF"],[/\\DH /g,"\u00D0"],[/\\~\{N\}/g,"\u00D1"],[/\\`\{O\}/g,"\u00D2"],[/\\'\{O\}/g,"\u00D3"],[/\\\^\{O\}/g,"\u00D4"],[/\\~\{O\}/g,"\u00D5"],[/\\"\{O\}/g,"\u00D6"],[/\\texttimes /g,"\u00D7"],[/\\O /g,"\u00D8"],[/\\`\{U\}/g,"\u00D9"],[/\\'\{U\}/g,"\u00DA"],[/\\\^\{U\}/g,"\u00DB"],[/\\"\{U\}/g,"\u00DC"],[/\\'\{Y\}/g,"\u00DD"],[/\\TH /g,"\u00DE"],[/\\ss /g,"\u00DF"],[/\\`\{a\}/g,"\u00E0"],[/\\'\{a\}/g,"\u00E1"],[/\\\^\{a\}/g,"\u00E2"],[/\\~\{a\}/g,"\u00E3"],[/\\"\{a\}/g,"\u00E4"],[/\\aa /g,"\u00E5"],[/\\ae /g,"\u00E6"],[/\\c\{c\}/g,"\u00E7"],[/\\`\{e\}/g,"\u00E8"],[/\\'\{e\}/g,"\u00E9"],[/\\\^\{e\}/g,"\u00EA"],[/\\"\{e\}/g,"\u00EB"],[/\\`\{\\i\}/g,"\u00EC"],[/\\'\{\\i\}/g,"\u00ED"],[/\\\^\{\\i\}/g,"\u00EE"],[/\\"\{\\i\}/g,"\u00EF"],[/\\dh /g,"\u00F0"],[/\\~\{n\}/g,"\u00F1"],[/\\`\{o\}/g,"\u00F2"],[/\\'\{o\}/g,"\u00F3"],[/\\\^\{o\}/g,"\u00F4"],[/\\~\{o\}/g,"\u00F5"],[/\\"\{o\}/g,"\u00F6"],[/\\div /g,"\u00F7"],[/\\o /g,"\u00F8"],[/\\`\{u\}/g,"\u00F9"],[/\\'\{u\}/g,"\u00FA"],[/\\\^\{u\}/g,"\u00FB"],[/\\"\{u\}/g,"\u00FC"],[/\\'\{y\}/g,"\u00FD"],[/\\th /g,"\u00FE"],[/\\"\{y\}/g,"\u00FF"],[/\\=\{A\}/g,"\u0100"],[/\\=\{a\}/g,"\u0101"],[/\\u\{A\}/g,"\u0102"],[/\\u\{a\}/g,"\u0103"],[/\\k\{A\}/g,"\u0104"],[/\\k\{a\}/g,"\u0105"],[/\\'\{C\}/g,"\u0106"],[/\\'\{c\}/g,"\u0107"],[/\\\^\{C\}/g,"\u0108"],[/\\\^\{c\}/g,"\u0109"],[/\\.\{C\}/g,"\u010A"],[/\\.\{c\}/g,"\u010B"],[/\\v\{C\}/g,"\u010C"],[/\\v\{c\}/g,"\u010D"],[/\\v\{D\}/g,"\u010E"],[/\\v\{d\}/g,"\u010F"],[/\\DJ /g,"\u0110"],[/\\dj /g,"\u0111"],[/\\=\{E\}/g,"\u0112"],[/\\=\{e\}/g,"\u0113"],[/\\u\{E\}/g,"\u0114"],[/\\u\{e\}/g,"\u0115"],[/\\.\{E\}/g,"\u0116"],[/\\.\{e\}/g,"\u0117"],[/\\k\{E\}/g,"\u0118"],[/\\k\{e\}/g,"\u0119"],[/\\v\{E\}/g,"\u011A"],[/\\v\{e\}/g,"\u011B"],[/\\\^\{G\}/g,"\u011C"],[/\\\^\{g\}/g,"\u011D"],[/\\u\{G\}/g,"\u011E"],[/\\u\{g\}/g,"\u011F"],[/\\.\{G\}/g,"\u0120"],[/\\.\{g\}/g,"\u0121"],[/\\c\{G\}/g,"\u0122"],[/\\c\{g\}/g,"\u0123"],[/\\\^\{H\}/g,"\u0124"],[/\\\^\{h\}/g,"\u0125"],[/\\Elzxh /g,"\u0127"],[/\\~\{I\}/g,"\u0128"],[/\\~\{\\i\}/g,"\u0129"],[/\\=\{I\}/g,"\u012A"],[/\\=\{\\i\}/g,"\u012B"],[/\\u\{I\}/g,"\u012C"],[/\\u\{\\i\}/g,"\u012D"],[/\\k\{I\}/g,"\u012E"],[/\\k\{i\}/g,"\u012F"],[/\\.\{I\}/g,"\u0130"],[/\\i /g,"\u0131"],[/\\\^\{J\}/g,"\u0134"],[/\\\^\{\\j\}/g,"\u0135"],[/\\c\{K\}/g,"\u0136"],[/\\c\{k\}/g,"\u0137"],[/\\'\{L\}/g,"\u0139"],[/\\'\{l\}/g,"\u013A"],[/\\c\{L\}/g,"\u013B"],[/\\c\{l\}/g,"\u013C"],[/\\v\{L\}/g,"\u013D"],[/\\v\{l\}/g,"\u013E"],[/\\L /g,"\u0141"],[/\\l /g,"\u0142"],[/\\'\{N\}/g,"\u0143"],[/\\'\{n\}/g,"\u0144"],[/\\c\{N\}/g,"\u0145"],[/\\c\{n\}/g,"\u0146"],[/\\v\{N\}/g,"\u0147"],[/\\v\{n\}/g,"\u0148"],[/\\NG /g,"\u014A"],[/\\ng /g,"\u014B"],[/\\=\{O\}/g,"\u014C"],[/\\=\{o\}/g,"\u014D"],[/\\u\{O\}/g,"\u014E"],[/\\u\{o\}/g,"\u014F"],[/\\H\{O\}/g,"\u0150"],[/\\H\{o\}/g,"\u0151"],[/\\OE /g,"\u0152"],[/\\oe /g,"\u0153"],[/\\'\{R\}/g,"\u0154"],[/\\'\{r\}/g,"\u0155"],[/\\c\{R\}/g,"\u0156"],[/\\c\{r\}/g,"\u0157"],[/\\v\{R\}/g,"\u0158"],[/\\v\{r\}/g,"\u0159"],[/\\'\{S\}/g,"\u015A"],[/\\'\{s\}/g,"\u015B"],[/\\\^\{S\}/g,"\u015C"],[/\\\^\{s\}/g,"\u015D"],[/\\c\{S\}/g,"\u015E"],[/\\c\{s\}/g,"\u015F"],[/\\v\{S\}/g,"\u0160"],[/\\v\{s\}/g,"\u0161"],[/\\c\{T\}/g,"\u0162"],[/\\c\{t\}/g,"\u0163"],[/\\v\{T\}/g,"\u0164"],[/\\v\{t\}/g,"\u0165"],[/\\~\{U\}/g,"\u0168"],[/\\~\{u\}/g,"\u0169"],[/\\=\{U\}/g,"\u016A"],[/\\=\{u\}/g,"\u016B"],[/\\u\{U\}/g,"\u016C"],[/\\u\{u\}/g,"\u016D"],[/\\r\{U\}/g,"\u016E"],[/\\r\{u\}/g,"\u016F"],[/\\H\{U\}/g,"\u0170"],[/\\H\{u\}/g,"\u0171"],[/\\k\{U\}/g,"\u0172"],[/\\k\{u\}/g,"\u0173"],[/\\\^\{W\}/g,"\u0174"],[/\\\^\{w\}/g,"\u0175"],[/\\\^\{Y\}/g,"\u0176"],[/\\\^\{y\}/g,"\u0177"],[/\\"\{Y\}/g,"\u0178"],[/\\'\{Z\}/g,"\u0179"],[/\\'\{z\}/g,"\u017A"],[/\\.\{Z\}/g,"\u017B"],[/\\.\{z\}/g,"\u017C"],[/\\v\{Z\}/g,"\u017D"],[/\\v\{z\}/g,"\u017E"],[/\\texthvlig /g,"\u0195"],[/\\textnrleg /g,"\u019E"],[/\\eth /g,"\u01AA"],[/\\textdoublepipe /g,"\u01C2"],[/\\'\{g\}/g,"\u01F5"],[/\\Elztrna /g,"\u0250"],[/\\Elztrnsa /g,"\u0252"],[/\\Elzopeno /g,"\u0254"],[/\\Elzrtld /g,"\u0256"],[/\\Elzschwa /g,"\u0259"],[/\\varepsilon /g,"\u025B"],[/\\Elzpgamma /g,"\u0263"],[/\\Elzpbgam /g,"\u0264"],[/\\Elztrnh /g,"\u0265"],[/\\Elzbtdl /g,"\u026C"],[/\\Elzrtll /g,"\u026D"],[/\\Elztrnm /g,"\u026F"],[/\\Elztrnmlr /g,"\u0270"],[/\\Elzltlmr /g,"\u0271"],[/\\Elzltln /g,"\u0272"],[/\\Elzrtln /g,"\u0273"],[/\\Elzclomeg /g,"\u0277"],[/\\textphi /g,"\u0278"],[/\\Elztrnr /g,"\u0279"],[/\\Elztrnrl /g,"\u027A"],[/\\Elzrttrnr /g,"\u027B"],[/\\Elzrl /g,"\u027C"],[/\\Elzrtlr /g,"\u027D"],[/\\Elzfhr /g,"\u027E"],[/\\Elzrtls /g,"\u0282"],[/\\Elzesh /g,"\u0283"],[/\\Elztrnt /g,"\u0287"],[/\\Elzrtlt /g,"\u0288"],[/\\Elzpupsil /g,"\u028A"],[/\\Elzpscrv /g,"\u028B"],[/\\Elzinvv /g,"\u028C"],[/\\Elzinvw /g,"\u028D"],[/\\Elztrny /g,"\u028E"],[/\\Elzrtlz /g,"\u0290"],[/\\Elzyogh /g,"\u0292"],[/\\Elzglst /g,"\u0294"],[/\\Elzreglst /g,"\u0295"],[/\\Elzinglst /g,"\u0296"],[/\\textturnk /g,"\u029E"],[/\\Elzdyogh /g,"\u02A4"],[/\\Elztesh /g,"\u02A7"],[/\\textasciicaron /g,"\u02C7"],[/\\Elzverts /g,"\u02C8"],[/\\Elzverti /g,"\u02CC"],[/\\Elzlmrk /g,"\u02D0"],[/\\Elzhlmrk /g,"\u02D1"],[/\\Elzsbrhr /g,"\u02D2"],[/\\Elzsblhr /g,"\u02D3"],[/\\Elzrais /g,"\u02D4"],[/\\Elzlow /g,"\u02D5"],[/\\textasciibreve /g,"\u02D8"],[/\\textperiodcentered /g,"\u02D9"],[/\\r\{\}/g,"\u02DA"],[/\\k\{\}/g,"\u02DB"],[/\\texttildelow /g,"\u02DC"],[/\\H\{\}/g,"\u02DD"],[/\\tone\{55\}/g,"\u02E5"],[/\\tone\{44\}/g,"\u02E6"],[/\\tone\{33\}/g,"\u02E7"],[/\\tone\{22\}/g,"\u02E8"],[/\\tone\{11\}/g,"\u02E9"],[/\\cyrchar\\C/g,"\u030F"],[/\\Elzpalh /g,"\u0321"],[/\\Elzrh /g,"\u0322"],[/\\Elzsbbrg /g,"\u032A"],[/\\Elzxl /g,"\u0335"],[/\\Elzbar /g,"\u0336"],[/\\'\{A\}/g,"\u0386"],[/\\'\{E\}/g,"\u0388"],[/\\'\{H\}/g,"\u0389"],[/\\'\{\}\{I\}/g,"\u038A"],[/\\'\{\}O/g,"\u038C"],[/\\mathrm\{'Y\}/g,"\u038E"],[/\\mathrm\{'\\Omega\}/g,"\u038F"],[/\\acute\{\\ddot\{\\iota\}\}/g,"\u0390"],[/\\Alpha /g,"\u0391"],[/\\Beta /g,"\u0392"],[/\\Gamma /g,"\u0393"],[/\\Delta /g,"\u0394"],[/\\Epsilon /g,"\u0395"],[/\\Zeta /g,"\u0396"],[/\\Eta /g,"\u0397"],[/\\Theta /g,"\u0398"],[/\\Iota /g,"\u0399"],[/\\Kappa /g,"\u039A"],[/\\Lambda /g,"\u039B"],[/\\Xi /g,"\u039E"],[/\\Pi /g,"\u03A0"],[/\\Rho /g,"\u03A1"],[/\\Sigma /g,"\u03A3"],[/\\Tau /g,"\u03A4"],[/\\Upsilon /g,"\u03A5"],[/\\Phi /g,"\u03A6"],[/\\Chi /g,"\u03A7"],[/\\Psi /g,"\u03A8"],[/\\Omega /g,"\u03A9"],[/\\mathrm\{\\ddot\{I\}\}/g,"\u03AA"],[/\\mathrm\{\\ddot\{Y\}\}/g,"\u03AB"],[/\\'\{\$\\alpha\$\}/g,"\u03AC"],[/\\acute\{\\epsilon\}/g,"\u03AD"],[/\\acute\{\\eta\}/g,"\u03AE"],[/\\acute\{\\iota\}/g,"\u03AF"],[/\\acute\{\\ddot\{\\upsilon\}\}/g,"\u03B0"],[/\\alpha /g,"\u03B1"],[/\\beta /g,"\u03B2"],[/\\gamma /g,"\u03B3"],[/\\delta /g,"\u03B4"],[/\\epsilon /g,"\u03B5"],[/\\zeta /g,"\u03B6"],[/\\eta /g,"\u03B7"],[/\\texttheta /g,"\u03B8"],[/\\iota /g,"\u03B9"],[/\\kappa /g,"\u03BA"],[/\\lambda /g,"\u03BB"],[/\\mu /g,"\u03BC"],[/\\nu /g,"\u03BD"],[/\\xi /g,"\u03BE"],[/\\pi /g,"\u03C0"],[/\\rho /g,"\u03C1"],[/\\varsigma /g,"\u03C2"],[/\\sigma /g,"\u03C3"],[/\\tau /g,"\u03C4"],[/\\upsilon /g,"\u03C5"],[/\\varphi /g,"\u03C6"],[/\\chi /g,"\u03C7"],[/\\psi /g,"\u03C8"],[/\\omega /g,"\u03C9"],[/\\ddot\{\\iota\}/g,"\u03CA"],[/\\ddot\{\\upsilon\}/g,"\u03CB"],[/\\'\{o\}/g,"\u03CC"],[/\\acute\{\\upsilon\}/g,"\u03CD"],[/\\acute\{\\omega\}/g,"\u03CE"],[/\\Pisymbol\{ppi022\}\{87\}/g,"\u03D0"],[/\\textvartheta /g,"\u03D1"],[/\\Upsilon /g,"\u03D2"],[/\\phi /g,"\u03D5"],[/\\varpi /g,"\u03D6"],[/\\Stigma /g,"\u03DA"],[/\\Digamma /g,"\u03DC"],[/\\digamma /g,"\u03DD"],[/\\Koppa /g,"\u03DE"],[/\\Sampi /g,"\u03E0"],[/\\varkappa /g,"\u03F0"],[/\\varrho /g,"\u03F1"],[/\\textTheta /g,"\u03F4"],[/\\backepsilon /g,"\u03F6"],[/\\cyrchar\\CYRYO /g,"\u0401"],[/\\cyrchar\\CYRDJE /g,"\u0402"],[/\\cyrchar\{\\'\\CYRG\}/g,"\u0403"],[/\\cyrchar\\CYRIE /g,"\u0404"],[/\\cyrchar\\CYRDZE /g,"\u0405"],[/\\cyrchar\\CYRII /g,"\u0406"],[/\\cyrchar\\CYRYI /g,"\u0407"],[/\\cyrchar\\CYRJE /g,"\u0408"],[/\\cyrchar\\CYRLJE /g,"\u0409"],[/\\cyrchar\\CYRNJE /g,"\u040A"],[/\\cyrchar\\CYRTSHE /g,"\u040B"],[/\\cyrchar\{\\'\\CYRK\}/g,"\u040C"],[/\\cyrchar\\CYRUSHRT /g,"\u040E"],[/\\cyrchar\\CYRDZHE /g,"\u040F"],[/\\cyrchar\\CYRA /g,"\u0410"],[/\\cyrchar\\CYRB /g,"\u0411"],[/\\cyrchar\\CYRV /g,"\u0412"],[/\\cyrchar\\CYRG /g,"\u0413"],[/\\cyrchar\\CYRD /g,"\u0414"],[/\\cyrchar\\CYRE /g,"\u0415"],[/\\cyrchar\\CYRZH /g,"\u0416"],[/\\cyrchar\\CYRZ /g,"\u0417"],[/\\cyrchar\\CYRI /g,"\u0418"],[/\\cyrchar\\CYRISHRT /g,"\u0419"],[/\\cyrchar\\CYRK /g,"\u041A"],[/\\cyrchar\\CYRL /g,"\u041B"],[/\\cyrchar\\CYRM /g,"\u041C"],[/\\cyrchar\\CYRN /g,"\u041D"],[/\\cyrchar\\CYRO /g,"\u041E"],[/\\cyrchar\\CYRP /g,"\u041F"],[/\\cyrchar\\CYRR /g,"\u0420"],[/\\cyrchar\\CYRS /g,"\u0421"],[/\\cyrchar\\CYRT /g,"\u0422"],[/\\cyrchar\\CYRU /g,"\u0423"],[/\\cyrchar\\CYRF /g,"\u0424"],[/\\cyrchar\\CYRH /g,"\u0425"],[/\\cyrchar\\CYRC /g,"\u0426"],[/\\cyrchar\\CYRCH /g,"\u0427"],[/\\cyrchar\\CYRSH /g,"\u0428"],[/\\cyrchar\\CYRSHCH /g,"\u0429"],[/\\cyrchar\\CYRHRDSN /g,"\u042A"],[/\\cyrchar\\CYRERY /g,"\u042B"],[/\\cyrchar\\CYRSFTSN /g,"\u042C"],[/\\cyrchar\\CYREREV /g,"\u042D"],[/\\cyrchar\\CYRYU /g,"\u042E"],[/\\cyrchar\\CYRYA /g,"\u042F"],[/\\cyrchar\\cyra /g,"\u0430"],[/\\cyrchar\\cyrb /g,"\u0431"],[/\\cyrchar\\cyrv /g,"\u0432"],[/\\cyrchar\\cyrg /g,"\u0433"],[/\\cyrchar\\cyrd /g,"\u0434"],[/\\cyrchar\\cyre /g,"\u0435"],[/\\cyrchar\\cyrzh /g,"\u0436"],[/\\cyrchar\\cyrz /g,"\u0437"],[/\\cyrchar\\cyri /g,"\u0438"],[/\\cyrchar\\cyrishrt /g,"\u0439"],[/\\cyrchar\\cyrk /g,"\u043A"],[/\\cyrchar\\cyrl /g,"\u043B"],[/\\cyrchar\\cyrm /g,"\u043C"],[/\\cyrchar\\cyrn /g,"\u043D"],[/\\cyrchar\\cyro /g,"\u043E"],[/\\cyrchar\\cyrp /g,"\u043F"],[/\\cyrchar\\cyrr /g,"\u0440"],[/\\cyrchar\\cyrs /g,"\u0441"],[/\\cyrchar\\cyrt /g,"\u0442"],[/\\cyrchar\\cyru /g,"\u0443"],[/\\cyrchar\\cyrf /g,"\u0444"],[/\\cyrchar\\cyrh /g,"\u0445"],[/\\cyrchar\\cyrc /g,"\u0446"],[/\\cyrchar\\cyrch /g,"\u0447"],[/\\cyrchar\\cyrsh /g,"\u0448"],[/\\cyrchar\\cyrshch /g,"\u0449"],[/\\cyrchar\\cyrhrdsn /g,"\u044A"],[/\\cyrchar\\cyrery /g,"\u044B"],[/\\cyrchar\\cyrsftsn /g,"\u044C"],[/\\cyrchar\\cyrerev /g,"\u044D"],[/\\cyrchar\\cyryu /g,"\u044E"],[/\\cyrchar\\cyrya /g,"\u044F"],[/\\cyrchar\\cyryo /g,"\u0451"],[/\\cyrchar\\cyrdje /g,"\u0452"],[/\\cyrchar\{\\'\\cyrg\}/g,"\u0453"],[/\\cyrchar\\cyrie /g,"\u0454"],[/\\cyrchar\\cyrdze /g,"\u0455"],[/\\cyrchar\\cyrii /g,"\u0456"],[/\\cyrchar\\cyryi /g,"\u0457"],[/\\cyrchar\\cyrje /g,"\u0458"],[/\\cyrchar\\cyrlje /g,"\u0459"],[/\\cyrchar\\cyrnje /g,"\u045A"],[/\\cyrchar\\cyrtshe /g,"\u045B"],[/\\cyrchar\{\\'\\cyrk\}/g,"\u045C"],[/\\cyrchar\\cyrushrt /g,"\u045E"],[/\\cyrchar\\cyrdzhe /g,"\u045F"],[/\\cyrchar\\CYROMEGA /g,"\u0460"],[/\\cyrchar\\cyromega /g,"\u0461"],[/\\cyrchar\\CYRYAT /g,"\u0462"],[/\\cyrchar\\CYRIOTE /g,"\u0464"],[/\\cyrchar\\cyriote /g,"\u0465"],[/\\cyrchar\\CYRLYUS /g,"\u0466"],[/\\cyrchar\\cyrlyus /g,"\u0467"],[/\\cyrchar\\CYRIOTLYUS /g,"\u0468"],[/\\cyrchar\\cyriotlyus /g,"\u0469"],[/\\cyrchar\\CYRBYUS /g,"\u046A"],[/\\cyrchar\\CYRIOTBYUS /g,"\u046C"],[/\\cyrchar\\cyriotbyus /g,"\u046D"],[/\\cyrchar\\CYRKSI /g,"\u046E"],[/\\cyrchar\\cyrksi /g,"\u046F"],[/\\cyrchar\\CYRPSI /g,"\u0470"],[/\\cyrchar\\cyrpsi /g,"\u0471"],[/\\cyrchar\\CYRFITA /g,"\u0472"],[/\\cyrchar\\CYRIZH /g,"\u0474"],[/\\cyrchar\\CYRUK /g,"\u0478"],[/\\cyrchar\\cyruk /g,"\u0479"],[/\\cyrchar\\CYROMEGARND /g,"\u047A"],[/\\cyrchar\\cyromegarnd /g,"\u047B"],[/\\cyrchar\\CYROMEGATITLO /g,"\u047C"],[/\\cyrchar\\cyromegatitlo /g,"\u047D"],[/\\cyrchar\\CYROT /g,"\u047E"],[/\\cyrchar\\cyrot /g,"\u047F"],[/\\cyrchar\\CYRKOPPA /g,"\u0480"],[/\\cyrchar\\cyrkoppa /g,"\u0481"],[/\\cyrchar\\cyrthousands /g,"\u0482"],[/\\cyrchar\\cyrhundredthousands /g,"\u0488"],[/\\cyrchar\\cyrmillions /g,"\u0489"],[/\\cyrchar\\CYRSEMISFTSN /g,"\u048C"],[/\\cyrchar\\cyrsemisftsn /g,"\u048D"],[/\\cyrchar\\CYRRTICK /g,"\u048E"],[/\\cyrchar\\cyrrtick /g,"\u048F"],[/\\cyrchar\\CYRGUP /g,"\u0490"],[/\\cyrchar\\cyrgup /g,"\u0491"],[/\\cyrchar\\CYRGHCRS /g,"\u0492"],[/\\cyrchar\\cyrghcrs /g,"\u0493"],[/\\cyrchar\\CYRGHK /g,"\u0494"],[/\\cyrchar\\cyrghk /g,"\u0495"],[/\\cyrchar\\CYRZHDSC /g,"\u0496"],[/\\cyrchar\\cyrzhdsc /g,"\u0497"],[/\\cyrchar\\CYRZDSC /g,"\u0498"],[/\\cyrchar\\cyrzdsc /g,"\u0499"],[/\\cyrchar\\CYRKDSC /g,"\u049A"],[/\\cyrchar\\cyrkdsc /g,"\u049B"],[/\\cyrchar\\CYRKVCRS /g,"\u049C"],[/\\cyrchar\\cyrkvcrs /g,"\u049D"],[/\\cyrchar\\CYRKHCRS /g,"\u049E"],[/\\cyrchar\\cyrkhcrs /g,"\u049F"],[/\\cyrchar\\CYRKBEAK /g,"\u04A0"],[/\\cyrchar\\cyrkbeak /g,"\u04A1"],[/\\cyrchar\\CYRNDSC /g,"\u04A2"],[/\\cyrchar\\cyrndsc /g,"\u04A3"],[/\\cyrchar\\CYRNG /g,"\u04A4"],[/\\cyrchar\\cyrng /g,"\u04A5"],[/\\cyrchar\\CYRPHK /g,"\u04A6"],[/\\cyrchar\\cyrphk /g,"\u04A7"],[/\\cyrchar\\CYRABHHA /g,"\u04A8"],[/\\cyrchar\\cyrabhha /g,"\u04A9"],[/\\cyrchar\\CYRSDSC /g,"\u04AA"],[/\\cyrchar\\cyrsdsc /g,"\u04AB"],[/\\cyrchar\\CYRTDSC /g,"\u04AC"],[/\\cyrchar\\cyrtdsc /g,"\u04AD"],[/\\cyrchar\\CYRY /g,"\u04AE"],[/\\cyrchar\\cyry /g,"\u04AF"],[/\\cyrchar\\CYRYHCRS /g,"\u04B0"],[/\\cyrchar\\cyryhcrs /g,"\u04B1"],[/\\cyrchar\\CYRHDSC /g,"\u04B2"],[/\\cyrchar\\cyrhdsc /g,"\u04B3"],[/\\cyrchar\\CYRTETSE /g,"\u04B4"],[/\\cyrchar\\cyrtetse /g,"\u04B5"],[/\\cyrchar\\CYRCHRDSC /g,"\u04B6"],[/\\cyrchar\\cyrchrdsc /g,"\u04B7"],[/\\cyrchar\\CYRCHVCRS /g,"\u04B8"],[/\\cyrchar\\cyrchvcrs /g,"\u04B9"],[/\\cyrchar\\CYRSHHA /g,"\u04BA"],[/\\cyrchar\\cyrshha /g,"\u04BB"],[/\\cyrchar\\CYRABHCH /g,"\u04BC"],[/\\cyrchar\\cyrabhch /g,"\u04BD"],[/\\cyrchar\\CYRABHCHDSC /g,"\u04BE"],[/\\cyrchar\\cyrabhchdsc /g,"\u04BF"],[/\\cyrchar\\CYRpalochka /g,"\u04C0"],[/\\cyrchar\\CYRKHK /g,"\u04C3"],[/\\cyrchar\\cyrkhk /g,"\u04C4"],[/\\cyrchar\\CYRNHK /g,"\u04C7"],[/\\cyrchar\\cyrnhk /g,"\u04C8"],[/\\cyrchar\\CYRCHLDSC /g,"\u04CB"],[/\\cyrchar\\cyrchldsc /g,"\u04CC"],[/\\cyrchar\\CYRAE /g,"\u04D4"],[/\\cyrchar\\cyrae /g,"\u04D5"],[/\\cyrchar\\CYRSCHWA /g,"\u04D8"],[/\\cyrchar\\cyrschwa /g,"\u04D9"],[/\\cyrchar\\CYRABHDZE /g,"\u04E0"],[/\\cyrchar\\cyrabhdze /g,"\u04E1"],[/\\cyrchar\\CYROTLD /g,"\u04E8"],[/\\cyrchar\\cyrotld /g,"\u04E9"],[/\\hspace\{0.6em\}/g,"\u2002"],[/\\hspace\{1em\}/g,"\u2003"],[/\\hspace\{0.33em\}/g,"\u2004"],[/\\hspace\{0.25em\}/g,"\u2005"],[/\\hspace\{0.166em\}/g,"\u2006"],[/\\hphantom\{0\}/g,"\u2007"],[/\\hphantom\{,\}/g,"\u2008"],[/\\hspace\{0.167em\}/g,"\u2009"],[/\\mkern1mu /g,"\u200A"],[/\\textendash /g,"\u2013"],[/\\textemdash /g,"\u2014"],[/\\rule\{1em\}\{1pt\}/g,"\u2015"],[/\\Vert /g,"\u2016"],[/\\Elzreapos /g,"\u201B"],[/\\textquotedblleft /g,"\u201C"],[/\\textquotedblright /g,"\u201D"],[/\\textdagger /g,"\u2020"],[/\\textdaggerdbl /g,"\u2021"],[/\\textbullet /g,"\u2022"],[/\\ldots /g,"\u2026"],[/\\textperthousand /g,"\u2030"],[/\\textpertenthousand /g,"\u2031"],[/\\backprime /g,"\u2035"],[/\\guilsinglleft /g,"\u2039"],[/\\guilsinglright /g,"\u203A"],[/\\mkern4mu /g,"\u205F"],[/\\nolinebreak /g,"\u2060"],[/\\ensuremath\{\\Elzpes\}/g,"\u20A7"],[/\\mbox\{\\texteuro\} /g,"\u20AC"],[/\\dddot /g,"\u20DB"],[/\\ddddot /g,"\u20DC"],[/\\mathbb\{C\}/g,"\u2102"],[/\\mathscr\{g\}/g,"\u210A"],[/\\mathscr\{H\}/g,"\u210B"],[/\\mathfrak\{H\}/g,"\u210C"],[/\\mathbb\{H\}/g,"\u210D"],[/\\hslash /g,"\u210F"],[/\\mathscr\{I\}/g,"\u2110"],[/\\mathfrak\{I\}/g,"\u2111"],[/\\mathscr\{L\}/g,"\u2112"],[/\\mathscr\{l\}/g,"\u2113"],[/\\mathbb\{N\}/g,"\u2115"],[/\\cyrchar\\textnumero /g,"\u2116"],[/\\wp /g,"\u2118"],[/\\mathbb\{P\}/g,"\u2119"],[/\\mathbb\{Q\}/g,"\u211A"],[/\\mathscr\{R\}/g,"\u211B"],[/\\mathfrak\{R\}/g,"\u211C"],[/\\mathbb\{R\}/g,"\u211D"],[/\\Elzxrat /g,"\u211E"],[/\\texttrademark /g,"\u2122"],[/\\mathbb\{Z\}/g,"\u2124"],[/\\Omega /g,"\u2126"],[/\\mho /g,"\u2127"],[/\\mathfrak\{Z\}/g,"\u2128"],[/\\ElsevierGlyph\{2129\}/g,"\u2129"],[/\\AA /g,"\u212B"],[/\\mathscr\{B\}/g,"\u212C"],[/\\mathfrak\{C\}/g,"\u212D"],[/\\mathscr\{e\}/g,"\u212F"],[/\\mathscr\{E\}/g,"\u2130"],[/\\mathscr\{F\}/g,"\u2131"],[/\\mathscr\{M\}/g,"\u2133"],[/\\mathscr\{o\}/g,"\u2134"],[/\\aleph /g,"\u2135"],[/\\beth /g,"\u2136"],[/\\gimel /g,"\u2137"],[/\\daleth /g,"\u2138"],[/\\textfrac\{1\}\{3\}/g,"\u2153"],[/\\textfrac\{2\}\{3\}/g,"\u2154"],[/\\textfrac\{1\}\{5\}/g,"\u2155"],[/\\textfrac\{2\}\{5\}/g,"\u2156"],[/\\textfrac\{3\}\{5\}/g,"\u2157"],[/\\textfrac\{4\}\{5\}/g,"\u2158"],[/\\textfrac\{1\}\{6\}/g,"\u2159"],[/\\textfrac\{5\}\{6\}/g,"\u215A"],[/\\textfrac\{1\}\{8\}/g,"\u215B"],[/\\textfrac\{3\}\{8\}/g,"\u215C"],[/\\textfrac\{5\}\{8\}/g,"\u215D"],[/\\textfrac\{7\}\{8\}/g,"\u215E"],[/\\leftarrow /g,"\u2190"],[/\\uparrow /g,"\u2191"],[/\\rightarrow /g,"\u2192"],[/\\downarrow /g,"\u2193"],[/\\leftrightarrow /g,"\u2194"],[/\\updownarrow /g,"\u2195"],[/\\nwarrow /g,"\u2196"],[/\\nearrow /g,"\u2197"],[/\\searrow /g,"\u2198"],[/\\swarrow /g,"\u2199"],[/\\nleftarrow /g,"\u219A"],[/\\nrightarrow /g,"\u219B"],[/\\arrowwaveright /g,"\u219C"],[/\\arrowwaveright /g,"\u219D"],[/\\twoheadleftarrow /g,"\u219E"],[/\\twoheadrightarrow /g,"\u21A0"],[/\\leftarrowtail /g,"\u21A2"],[/\\rightarrowtail /g,"\u21A3"],[/\\mapsto /g,"\u21A6"],[/\\hookleftarrow /g,"\u21A9"],[/\\hookrightarrow /g,"\u21AA"],[/\\looparrowleft /g,"\u21AB"],[/\\looparrowright /g,"\u21AC"],[/\\leftrightsquigarrow /g,"\u21AD"],[/\\nleftrightarrow /g,"\u21AE"],[/\\Lsh /g,"\u21B0"],[/\\Rsh /g,"\u21B1"],[/\\ElsevierGlyph\{21B3\}/g,"\u21B3"],[/\\curvearrowleft /g,"\u21B6"],[/\\curvearrowright /g,"\u21B7"],[/\\circlearrowleft /g,"\u21BA"],[/\\circlearrowright /g,"\u21BB"],[/\\leftharpoonup /g,"\u21BC"],[/\\leftharpoondown /g,"\u21BD"],[/\\upharpoonright /g,"\u21BE"],[/\\upharpoonleft /g,"\u21BF"],[/\\rightharpoonup /g,"\u21C0"],[/\\rightharpoondown /g,"\u21C1"],[/\\downharpoonright /g,"\u21C2"],[/\\downharpoonleft /g,"\u21C3"],[/\\rightleftarrows /g,"\u21C4"],[/\\dblarrowupdown /g,"\u21C5"],[/\\leftrightarrows /g,"\u21C6"],[/\\leftleftarrows /g,"\u21C7"],[/\\upuparrows /g,"\u21C8"],[/\\rightrightarrows /g,"\u21C9"],[/\\downdownarrows /g,"\u21CA"],[/\\leftrightharpoons /g,"\u21CB"],[/\\rightleftharpoons /g,"\u21CC"],[/\\nLeftarrow /g,"\u21CD"],[/\\nLeftrightarrow /g,"\u21CE"],[/\\nRightarrow /g,"\u21CF"],[/\\Leftarrow /g,"\u21D0"],[/\\Uparrow /g,"\u21D1"],[/\\Rightarrow /g,"\u21D2"],[/\\Downarrow /g,"\u21D3"],[/\\Leftrightarrow /g,"\u21D4"],[/\\Updownarrow /g,"\u21D5"],[/\\Lleftarrow /g,"\u21DA"],[/\\Rrightarrow /g,"\u21DB"],[/\\rightsquigarrow /g,"\u21DD"],[/\\DownArrowUpArrow /g,"\u21F5"],[/\\forall /g,"\u2200"],[/\\complement /g,"\u2201"],[/\\partial /g,"\u2202"],[/\\exists /g,"\u2203"],[/\\nexists /g,"\u2204"],[/\\varnothing /g,"\u2205"],[/\\nabla /g,"\u2207"],[/\\in /g,"\u2208"],[/\\not\\in /g,"\u2209"],[/\\ni /g,"\u220B"],[/\\not\\ni /g,"\u220C"],[/\\prod /g,"\u220F"],[/\\coprod /g,"\u2210"],[/\\sum /g,"\u2211"],[/\\mp /g,"\u2213"],[/\\dotplus /g,"\u2214"],[/\\setminus /g,"\u2216"],[/\\circ /g,"\u2218"],[/\\bullet /g,"\u2219"],[/\\surd /g,"\u221A"],[/\\propto /g,"\u221D"],[/\\infty /g,"\u221E"],[/\\rightangle /g,"\u221F"],[/\\angle /g,"\u2220"],[/\\measuredangle /g,"\u2221"],[/\\sphericalangle /g,"\u2222"],[/\\mid /g,"\u2223"],[/\\nmid /g,"\u2224"],[/\\parallel /g,"\u2225"],[/\\nparallel /g,"\u2226"],[/\\wedge /g,"\u2227"],[/\\vee /g,"\u2228"],[/\\cap /g,"\u2229"],[/\\cup /g,"\u222A"],[/\\int /g,"\u222B"],[/\\int\\!\\int /g,"\u222C"],[/\\int\\!\\int\\!\\int /g,"\u222D"],[/\\oint /g,"\u222E"],[/\\surfintegral /g,"\u222F"],[/\\volintegral /g,"\u2230"],[/\\clwintegral /g,"\u2231"],[/\\ElsevierGlyph\{2232\}/g,"\u2232"],[/\\ElsevierGlyph\{2233\}/g,"\u2233"],[/\\therefore /g,"\u2234"],[/\\because /g,"\u2235"],[/\\Colon /g,"\u2237"],[/\\ElsevierGlyph\{2238\}/g,"\u2238"],[/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g,"\u223A"],[/\\homothetic /g,"\u223B"],[/\\sim /g,"\u223C"],[/\\backsim /g,"\u223D"],[/\\lazysinv /g,"\u223E"],[/\\wr /g,"\u2240"],[/\\not\\sim /g,"\u2241"],[/\\ElsevierGlyph\{2242\}/g,"\u2242"],[/\\NotEqualTilde /g,"\u2242-00338"],[/\\simeq /g,"\u2243"],[/\\not\\simeq /g,"\u2244"],[/\\cong /g,"\u2245"],[/\\approxnotequal /g,"\u2246"],[/\\not\\cong /g,"\u2247"],[/\\approx /g,"\u2248"],[/\\not\\approx /g,"\u2249"],[/\\approxeq /g,"\u224A"],[/\\tildetrpl /g,"\u224B"],[/\\not\\apid /g,"\u224B-00338"],[/\\allequal /g,"\u224C"],[/\\asymp /g,"\u224D"],[/\\Bumpeq /g,"\u224E"],[/\\NotHumpDownHump /g,"\u224E-00338"],[/\\bumpeq /g,"\u224F"],[/\\NotHumpEqual /g,"\u224F-00338"],[/\\doteq /g,"\u2250"],[/\\not\\doteq/g,"\u2250-00338"],[/\\doteqdot /g,"\u2251"],[/\\fallingdotseq /g,"\u2252"],[/\\risingdotseq /g,"\u2253"],[/\\eqcirc /g,"\u2256"],[/\\circeq /g,"\u2257"],[/\\estimates /g,"\u2259"],[/\\ElsevierGlyph\{225A\}/g,"\u225A"],[/\\starequal /g,"\u225B"],[/\\triangleq /g,"\u225C"],[/\\ElsevierGlyph\{225F\}/g,"\u225F"],[/\\not =/g,"\u2260"],[/\\equiv /g,"\u2261"],[/\\not\\equiv /g,"\u2262"],[/\\leq /g,"\u2264"],[/\\geq /g,"\u2265"],[/\\leqq /g,"\u2266"],[/\\geqq /g,"\u2267"],[/\\lneqq /g,"\u2268"],[/\\lvertneqq /g,"\u2268-0FE00"],[/\\gneqq /g,"\u2269"],[/\\gvertneqq /g,"\u2269-0FE00"],[/\\ll /g,"\u226A"],[/\\NotLessLess /g,"\u226A-00338"],[/\\gg /g,"\u226B"],[/\\NotGreaterGreater /g,"\u226B-00338"],[/\\between /g,"\u226C"],[/\\not\\kern\-0.3em\\times /g,"\u226D"],[/\\not</g,"\u226E"],[/\\not>/g,"\u226F"],[/\\not\\leq /g,"\u2270"],[/\\not\\geq /g,"\u2271"],[/\\lessequivlnt /g,"\u2272"],[/\\greaterequivlnt /g,"\u2273"],[/\\ElsevierGlyph\{2274\}/g,"\u2274"],[/\\ElsevierGlyph\{2275\}/g,"\u2275"],[/\\lessgtr /g,"\u2276"],[/\\gtrless /g,"\u2277"],[/\\notlessgreater /g,"\u2278"],[/\\notgreaterless /g,"\u2279"],[/\\prec /g,"\u227A"],[/\\succ /g,"\u227B"],[/\\preccurlyeq /g,"\u227C"],[/\\succcurlyeq /g,"\u227D"],[/\\precapprox /g,"\u227E"],[/\\NotPrecedesTilde /g,"\u227E-00338"],[/\\succapprox /g,"\u227F"],[/\\NotSucceedsTilde /g,"\u227F-00338"],[/\\not\\prec /g,"\u2280"],[/\\not\\succ /g,"\u2281"],[/\\subset /g,"\u2282"],[/\\supset /g,"\u2283"],[/\\not\\subset /g,"\u2284"],[/\\not\\supset /g,"\u2285"],[/\\subseteq /g,"\u2286"],[/\\supseteq /g,"\u2287"],[/\\not\\subseteq /g,"\u2288"],[/\\not\\supseteq /g,"\u2289"],[/\\subsetneq /g,"\u228A"],[/\\varsubsetneqq /g,"\u228A-0FE00"],[/\\supsetneq /g,"\u228B"],[/\\varsupsetneq /g,"\u228B-0FE00"],[/\\uplus /g,"\u228E"],[/\\sqsubset /g,"\u228F"],[/\\NotSquareSubset /g,"\u228F-00338"],[/\\sqsupset /g,"\u2290"],[/\\NotSquareSuperset /g,"\u2290-00338"],[/\\sqsubseteq /g,"\u2291"],[/\\sqsupseteq /g,"\u2292"],[/\\sqcap /g,"\u2293"],[/\\sqcup /g,"\u2294"],[/\\oplus /g,"\u2295"],[/\\ominus /g,"\u2296"],[/\\otimes /g,"\u2297"],[/\\oslash /g,"\u2298"],[/\\odot /g,"\u2299"],[/\\circledcirc /g,"\u229A"],[/\\circledast /g,"\u229B"],[/\\circleddash /g,"\u229D"],[/\\boxplus /g,"\u229E"],[/\\boxminus /g,"\u229F"],[/\\boxtimes /g,"\u22A0"],[/\\boxdot /g,"\u22A1"],[/\\vdash /g,"\u22A2"],[/\\dashv /g,"\u22A3"],[/\\top /g,"\u22A4"],[/\\perp /g,"\u22A5"],[/\\truestate /g,"\u22A7"],[/\\forcesextra /g,"\u22A8"],[/\\Vdash /g,"\u22A9"],[/\\Vvdash /g,"\u22AA"],[/\\VDash /g,"\u22AB"],[/\\nvdash /g,"\u22AC"],[/\\nvDash /g,"\u22AD"],[/\\nVdash /g,"\u22AE"],[/\\nVDash /g,"\u22AF"],[/\\vartriangleleft /g,"\u22B2"],[/\\vartriangleright /g,"\u22B3"],[/\\trianglelefteq /g,"\u22B4"],[/\\trianglerighteq /g,"\u22B5"],[/\\original /g,"\u22B6"],[/\\image /g,"\u22B7"],[/\\multimap /g,"\u22B8"],[/\\hermitconjmatrix /g,"\u22B9"],[/\\intercal /g,"\u22BA"],[/\\veebar /g,"\u22BB"],[/\\rightanglearc /g,"\u22BE"],[/\\ElsevierGlyph\{22C0\}/g,"\u22C0"],[/\\ElsevierGlyph\{22C1\}/g,"\u22C1"],[/\\bigcap /g,"\u22C2"],[/\\bigcup /g,"\u22C3"],[/\\diamond /g,"\u22C4"],[/\\cdot /g,"\u22C5"],[/\\star /g,"\u22C6"],[/\\divideontimes /g,"\u22C7"],[/\\bowtie /g,"\u22C8"],[/\\ltimes /g,"\u22C9"],[/\\rtimes /g,"\u22CA"],[/\\leftthreetimes /g,"\u22CB"],[/\\rightthreetimes /g,"\u22CC"],[/\\backsimeq /g,"\u22CD"],[/\\curlyvee /g,"\u22CE"],[/\\curlywedge /g,"\u22CF"],[/\\Subset /g,"\u22D0"],[/\\Supset /g,"\u22D1"],[/\\Cap /g,"\u22D2"],[/\\Cup /g,"\u22D3"],[/\\pitchfork /g,"\u22D4"],[/\\lessdot /g,"\u22D6"],[/\\gtrdot /g,"\u22D7"],[/\\verymuchless /g,"\u22D8"],[/\\verymuchgreater /g,"\u22D9"],[/\\lesseqgtr /g,"\u22DA"],[/\\gtreqless /g,"\u22DB"],[/\\curlyeqprec /g,"\u22DE"],[/\\curlyeqsucc /g,"\u22DF"],[/\\not\\sqsubseteq /g,"\u22E2"],[/\\not\\sqsupseteq /g,"\u22E3"],[/\\Elzsqspne /g,"\u22E5"],[/\\lnsim /g,"\u22E6"],[/\\gnsim /g,"\u22E7"],[/\\precedesnotsimilar /g,"\u22E8"],[/\\succnsim /g,"\u22E9"],[/\\ntriangleleft /g,"\u22EA"],[/\\ntriangleright /g,"\u22EB"],[/\\ntrianglelefteq /g,"\u22EC"],[/\\ntrianglerighteq /g,"\u22ED"],[/\\vdots /g,"\u22EE"],[/\\cdots /g,"\u22EF"],[/\\upslopeellipsis /g,"\u22F0"],[/\\downslopeellipsis /g,"\u22F1"],[/\\barwedge /g,"\u2305"],[/\\perspcorrespond /g,"\u2306"],[/\\lceil /g,"\u2308"],[/\\rceil /g,"\u2309"],[/\\lfloor /g,"\u230A"],[/\\rfloor /g,"\u230B"],[/\\recorder /g,"\u2315"],[/\\mathchar"2208/g,"\u2316"],[/\\ulcorner /g,"\u231C"],[/\\urcorner /g,"\u231D"],[/\\llcorner /g,"\u231E"],[/\\lrcorner /g,"\u231F"],[/\\frown /g,"\u2322"],[/\\smile /g,"\u2323"],[/\\langle /g,"\u2329"],[/\\rangle /g,"\u232A"],[/\\ElsevierGlyph\{E838\}/g,"\u233D"],[/\\Elzdlcorn /g,"\u23A3"],[/\\lmoustache /g,"\u23B0"],[/\\rmoustache /g,"\u23B1"],[/\\textvisiblespace /g,"\u2423"],[/\\ding\{172\}/g,"\u2460"],[/\\ding\{173\}/g,"\u2461"],[/\\ding\{174\}/g,"\u2462"],[/\\ding\{175\}/g,"\u2463"],[/\\ding\{176\}/g,"\u2464"],[/\\ding\{177\}/g,"\u2465"],[/\\ding\{178\}/g,"\u2466"],[/\\ding\{179\}/g,"\u2467"],[/\\ding\{180\}/g,"\u2468"],[/\\ding\{181\}/g,"\u2469"],[/\\circledS /g,"\u24C8"],[/\\Elzdshfnc /g,"\u2506"],[/\\Elzsqfnw /g,"\u2519"],[/\\diagup /g,"\u2571"],[/\\ding\{110\}/g,"\u25A0"],[/\\square /g,"\u25A1"],[/\\blacksquare /g,"\u25AA"],[/\\fbox\{~~\}/g,"\u25AD"],[/\\Elzvrecto /g,"\u25AF"],[/\\ElsevierGlyph\{E381\}/g,"\u25B1"],[/\\ding\{115\}/g,"\u25B2"],[/\\bigtriangleup /g,"\u25B3"],[/\\blacktriangle /g,"\u25B4"],[/\\vartriangle /g,"\u25B5"],[/\\blacktriangleright /g,"\u25B8"],[/\\triangleright /g,"\u25B9"],[/\\ding\{116\}/g,"\u25BC"],[/\\bigtriangledown /g,"\u25BD"],[/\\blacktriangledown /g,"\u25BE"],[/\\triangledown /g,"\u25BF"],[/\\blacktriangleleft /g,"\u25C2"],[/\\triangleleft /g,"\u25C3"],[/\\ding\{117\}/g,"\u25C6"],[/\\lozenge /g,"\u25CA"],[/\\bigcirc /g,"\u25CB"],[/\\ding\{108\}/g,"\u25CF"],[/\\Elzcirfl /g,"\u25D0"],[/\\Elzcirfr /g,"\u25D1"],[/\\Elzcirfb /g,"\u25D2"],[/\\ding\{119\}/g,"\u25D7"],[/\\Elzrvbull /g,"\u25D8"],[/\\Elzsqfl /g,"\u25E7"],[/\\Elzsqfr /g,"\u25E8"],[/\\Elzsqfse /g,"\u25EA"],[/\\bigcirc /g,"\u25EF"],[/\\ding\{72\}/g,"\u2605"],[/\\ding\{73\}/g,"\u2606"],[/\\ding\{37\}/g,"\u260E"],[/\\ding\{42\}/g,"\u261B"],[/\\ding\{43\}/g,"\u261E"],[/\\rightmoon /g,"\u263E"],[/\\mercury /g,"\u263F"],[/\\venus /g,"\u2640"],[/\\male /g,"\u2642"],[/\\jupiter /g,"\u2643"],[/\\saturn /g,"\u2644"],[/\\uranus /g,"\u2645"],[/\\neptune /g,"\u2646"],[/\\pluto /g,"\u2647"],[/\\aries /g,"\u2648"],[/\\taurus /g,"\u2649"],[/\\gemini /g,"\u264A"],[/\\cancer /g,"\u264B"],[/\\leo /g,"\u264C"],[/\\virgo /g,"\u264D"],[/\\libra /g,"\u264E"],[/\\scorpio /g,"\u264F"],[/\\sagittarius /g,"\u2650"],[/\\capricornus /g,"\u2651"],[/\\aquarius /g,"\u2652"],[/\\pisces /g,"\u2653"],[/\\ding\{171\}/g,"\u2660"],[/\\diamond /g,"\u2662"],[/\\ding\{168\}/g,"\u2663"],[/\\ding\{170\}/g,"\u2665"],[/\\ding\{169\}/g,"\u2666"],[/\\quarternote /g,"\u2669"],[/\\eighthnote /g,"\u266A"],[/\\flat /g,"\u266D"],[/\\natural /g,"\u266E"],[/\\sharp /g,"\u266F"],[/\\ding\{33\}/g,"\u2701"],[/\\ding\{34\}/g,"\u2702"],[/\\ding\{35\}/g,"\u2703"],[/\\ding\{36\}/g,"\u2704"],[/\\ding\{38\}/g,"\u2706"],[/\\ding\{39\}/g,"\u2707"],[/\\ding\{40\}/g,"\u2708"],[/\\ding\{41\}/g,"\u2709"],[/\\ding\{44\}/g,"\u270C"],[/\\ding\{45\}/g,"\u270D"],[/\\ding\{46\}/g,"\u270E"],[/\\ding\{47\}/g,"\u270F"],[/\\ding\{48\}/g,"\u2710"],[/\\ding\{49\}/g,"\u2711"],[/\\ding\{50\}/g,"\u2712"],[/\\ding\{51\}/g,"\u2713"],[/\\ding\{52\}/g,"\u2714"],[/\\ding\{53\}/g,"\u2715"],[/\\ding\{54\}/g,"\u2716"],[/\\ding\{55\}/g,"\u2717"],[/\\ding\{56\}/g,"\u2718"],[/\\ding\{57\}/g,"\u2719"],[/\\ding\{58\}/g,"\u271A"],[/\\ding\{59\}/g,"\u271B"],[/\\ding\{60\}/g,"\u271C"],[/\\ding\{61\}/g,"\u271D"],[/\\ding\{62\}/g,"\u271E"],[/\\ding\{63\}/g,"\u271F"],[/\\ding\{64\}/g,"\u2720"],[/\\ding\{65\}/g,"\u2721"],[/\\ding\{66\}/g,"\u2722"],[/\\ding\{67\}/g,"\u2723"],[/\\ding\{68\}/g,"\u2724"],[/\\ding\{69\}/g,"\u2725"],[/\\ding\{70\}/g,"\u2726"],[/\\ding\{71\}/g,"\u2727"],[/\\ding\{73\}/g,"\u2729"],[/\\ding\{74\}/g,"\u272A"],[/\\ding\{75\}/g,"\u272B"],[/\\ding\{76\}/g,"\u272C"],[/\\ding\{77\}/g,"\u272D"],[/\\ding\{78\}/g,"\u272E"],[/\\ding\{79\}/g,"\u272F"],[/\\ding\{80\}/g,"\u2730"],[/\\ding\{81\}/g,"\u2731"],[/\\ding\{82\}/g,"\u2732"],[/\\ding\{83\}/g,"\u2733"],[/\\ding\{84\}/g,"\u2734"],[/\\ding\{85\}/g,"\u2735"],[/\\ding\{86\}/g,"\u2736"],[/\\ding\{87\}/g,"\u2737"],[/\\ding\{88\}/g,"\u2738"],[/\\ding\{89\}/g,"\u2739"],[/\\ding\{90\}/g,"\u273A"],[/\\ding\{91\}/g,"\u273B"],[/\\ding\{92\}/g,"\u273C"],[/\\ding\{93\}/g,"\u273D"],[/\\ding\{94\}/g,"\u273E"],[/\\ding\{95\}/g,"\u273F"],[/\\ding\{96\}/g,"\u2740"],[/\\ding\{97\}/g,"\u2741"],[/\\ding\{98\}/g,"\u2742"],[/\\ding\{99\}/g,"\u2743"],[/\\ding\{100\}/g,"\u2744"],[/\\ding\{101\}/g,"\u2745"],[/\\ding\{102\}/g,"\u2746"],[/\\ding\{103\}/g,"\u2747"],[/\\ding\{104\}/g,"\u2748"],[/\\ding\{105\}/g,"\u2749"],[/\\ding\{106\}/g,"\u274A"],[/\\ding\{107\}/g,"\u274B"],[/\\ding\{109\}/g,"\u274D"],[/\\ding\{111\}/g,"\u274F"],[/\\ding\{112\}/g,"\u2750"],[/\\ding\{113\}/g,"\u2751"],[/\\ding\{114\}/g,"\u2752"],[/\\ding\{118\}/g,"\u2756"],[/\\ding\{120\}/g,"\u2758"],[/\\ding\{121\}/g,"\u2759"],[/\\ding\{122\}/g,"\u275A"],[/\\ding\{123\}/g,"\u275B"],[/\\ding\{124\}/g,"\u275C"],[/\\ding\{125\}/g,"\u275D"],[/\\ding\{126\}/g,"\u275E"],[/\\ding\{161\}/g,"\u2761"],[/\\ding\{162\}/g,"\u2762"],[/\\ding\{163\}/g,"\u2763"],[/\\ding\{164\}/g,"\u2764"],[/\\ding\{165\}/g,"\u2765"],[/\\ding\{166\}/g,"\u2766"],[/\\ding\{167\}/g,"\u2767"],[/\\ding\{182\}/g,"\u2776"],[/\\ding\{183\}/g,"\u2777"],[/\\ding\{184\}/g,"\u2778"],[/\\ding\{185\}/g,"\u2779"],[/\\ding\{186\}/g,"\u277A"],[/\\ding\{187\}/g,"\u277B"],[/\\ding\{188\}/g,"\u277C"],[/\\ding\{189\}/g,"\u277D"],[/\\ding\{190\}/g,"\u277E"],[/\\ding\{191\}/g,"\u277F"],[/\\ding\{192\}/g,"\u2780"],[/\\ding\{193\}/g,"\u2781"],[/\\ding\{194\}/g,"\u2782"],[/\\ding\{195\}/g,"\u2783"],[/\\ding\{196\}/g,"\u2784"],[/\\ding\{197\}/g,"\u2785"],[/\\ding\{198\}/g,"\u2786"],[/\\ding\{199\}/g,"\u2787"],[/\\ding\{200\}/g,"\u2788"],[/\\ding\{201\}/g,"\u2789"],[/\\ding\{202\}/g,"\u278A"],[/\\ding\{203\}/g,"\u278B"],[/\\ding\{204\}/g,"\u278C"],[/\\ding\{205\}/g,"\u278D"],[/\\ding\{206\}/g,"\u278E"],[/\\ding\{207\}/g,"\u278F"],[/\\ding\{208\}/g,"\u2790"],[/\\ding\{209\}/g,"\u2791"],[/\\ding\{210\}/g,"\u2792"],[/\\ding\{211\}/g,"\u2793"],[/\\ding\{212\}/g,"\u2794"],[/\\ding\{216\}/g,"\u2798"],[/\\ding\{217\}/g,"\u2799"],[/\\ding\{218\}/g,"\u279A"],[/\\ding\{219\}/g,"\u279B"],[/\\ding\{220\}/g,"\u279C"],[/\\ding\{221\}/g,"\u279D"],[/\\ding\{222\}/g,"\u279E"],[/\\ding\{223\}/g,"\u279F"],[/\\ding\{224\}/g,"\u27A0"],[/\\ding\{225\}/g,"\u27A1"],[/\\ding\{226\}/g,"\u27A2"],[/\\ding\{227\}/g,"\u27A3"],[/\\ding\{228\}/g,"\u27A4"],[/\\ding\{229\}/g,"\u27A5"],[/\\ding\{230\}/g,"\u27A6"],[/\\ding\{231\}/g,"\u27A7"],[/\\ding\{232\}/g,"\u27A8"],[/\\ding\{233\}/g,"\u27A9"],[/\\ding\{234\}/g,"\u27AA"],[/\\ding\{235\}/g,"\u27AB"],[/\\ding\{236\}/g,"\u27AC"],[/\\ding\{237\}/g,"\u27AD"],[/\\ding\{238\}/g,"\u27AE"],[/\\ding\{239\}/g,"\u27AF"],[/\\ding\{241\}/g,"\u27B1"],[/\\ding\{242\}/g,"\u27B2"],[/\\ding\{243\}/g,"\u27B3"],[/\\ding\{244\}/g,"\u27B4"],[/\\ding\{245\}/g,"\u27B5"],[/\\ding\{246\}/g,"\u27B6"],[/\\ding\{247\}/g,"\u27B7"],[/\\ding\{248\}/g,"\u27B8"],[/\\ding\{249\}/g,"\u27B9"],[/\\ding\{250\}/g,"\u27BA"],[/\\ding\{251\}/g,"\u27BB"],[/\\ding\{252\}/g,"\u27BC"],[/\\ding\{253\}/g,"\u27BD"],[/\\ding\{254\}/g,"\u27BE"],[/\\longleftarrow /g,"\u27F5"],[/\\longrightarrow /g,"\u27F6"],[/\\longleftrightarrow /g,"\u27F7"],[/\\Longleftarrow /g,"\u27F8"],[/\\Longrightarrow /g,"\u27F9"],[/\\Longleftrightarrow /g,"\u27FA"],[/\\longmapsto /g,"\u27FC"],[/\\sim\\joinrel\\leadsto/g,"\u27FF"],[/\\ElsevierGlyph\{E212\}/g,"\u2905"],[/\\UpArrowBar /g,"\u2912"],[/\\DownArrowBar /g,"\u2913"],[/\\ElsevierGlyph\{E20C\}/g,"\u2923"],[/\\ElsevierGlyph\{E20D\}/g,"\u2924"],[/\\ElsevierGlyph\{E20B\}/g,"\u2925"],[/\\ElsevierGlyph\{E20A\}/g,"\u2926"],[/\\ElsevierGlyph\{E211\}/g,"\u2927"],[/\\ElsevierGlyph\{E20E\}/g,"\u2928"],[/\\ElsevierGlyph\{E20F\}/g,"\u2929"],[/\\ElsevierGlyph\{E210\}/g,"\u292A"],[/\\ElsevierGlyph\{E21C\}/g,"\u2933"],[/\\ElsevierGlyph\{E21D\}/g,"\u2933-00338"],[/\\ElsevierGlyph\{E21A\}/g,"\u2936"],[/\\ElsevierGlyph\{E219\}/g,"\u2937"],[/\\Elolarr /g,"\u2940"],[/\\Elorarr /g,"\u2941"],[/\\ElzRlarr /g,"\u2942"],[/\\ElzrLarr /g,"\u2944"],[/\\Elzrarrx /g,"\u2947"],[/\\LeftRightVector /g,"\u294E"],[/\\RightUpDownVector /g,"\u294F"],[/\\DownLeftRightVector /g,"\u2950"],[/\\LeftUpDownVector /g,"\u2951"],[/\\LeftVectorBar /g,"\u2952"],[/\\RightVectorBar /g,"\u2953"],[/\\RightUpVectorBar /g,"\u2954"],[/\\RightDownVectorBar /g,"\u2955"],[/\\DownLeftVectorBar /g,"\u2956"],[/\\DownRightVectorBar /g,"\u2957"],[/\\LeftUpVectorBar /g,"\u2958"],[/\\LeftDownVectorBar /g,"\u2959"],[/\\LeftTeeVector /g,"\u295A"],[/\\RightTeeVector /g,"\u295B"],[/\\RightUpTeeVector /g,"\u295C"],[/\\RightDownTeeVector /g,"\u295D"],[/\\DownLeftTeeVector /g,"\u295E"],[/\\DownRightTeeVector /g,"\u295F"],[/\\LeftUpTeeVector /g,"\u2960"],[/\\LeftDownTeeVector /g,"\u2961"],[/\\UpEquilibrium /g,"\u296E"],[/\\ReverseUpEquilibrium /g,"\u296F"],[/\\RoundImplies /g,"\u2970"],[/\\ElsevierGlyph\{E214\}/g,"\u297C"],[/\\ElsevierGlyph\{E215\}/g,"\u297D"],[/\\Elztfnc /g,"\u2980"],[/\\ElsevierGlyph\{3018\}/g,"\u2985"],[/\\Elroang /g,"\u2986"],[/\\ElsevierGlyph\{E291\}/g,"\u2994"],[/\\Elzddfnc /g,"\u2999"],[/\\Angle /g,"\u299C"],[/\\Elzlpargt /g,"\u29A0"],[/\\ElsevierGlyph\{E260\}/g,"\u29B5"],[/\\ElsevierGlyph\{E61B\}/g,"\u29B6"],[/\\ElzLap /g,"\u29CA"],[/\\Elzdefas /g,"\u29CB"],[/\\LeftTriangleBar /g,"\u29CF"],[/\\NotLeftTriangleBar /g,"\u29CF-00338"],[/\\RightTriangleBar /g,"\u29D0"],[/\\NotRightTriangleBar /g,"\u29D0-00338"],[/\\ElsevierGlyph\{E372\}/g,"\u29DC"],[/\\blacklozenge /g,"\u29EB"],[/\\RuleDelayed /g,"\u29F4"],[/\\Elxuplus /g,"\u2A04"],[/\\ElzThr /g,"\u2A05"],[/\\Elxsqcup /g,"\u2A06"],[/\\ElzInf /g,"\u2A07"],[/\\ElzSup /g,"\u2A08"],[/\\ElzCint /g,"\u2A0D"],[/\\clockoint /g,"\u2A0F"],[/\\ElsevierGlyph\{E395\}/g,"\u2A10"],[/\\sqrint /g,"\u2A16"],[/\\ElsevierGlyph\{E25A\}/g,"\u2A25"],[/\\ElsevierGlyph\{E25B\}/g,"\u2A2A"],[/\\ElsevierGlyph\{E25C\}/g,"\u2A2D"],[/\\ElsevierGlyph\{E25D\}/g,"\u2A2E"],[/\\ElzTimes /g,"\u2A2F"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A34"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A35"],[/\\ElsevierGlyph\{E259\}/g,"\u2A3C"],[/\\amalg /g,"\u2A3F"],[/\\ElzAnd /g,"\u2A53"],[/\\ElzOr /g,"\u2A54"],[/\\ElsevierGlyph\{E36E\}/g,"\u2A55"],[/\\ElOr /g,"\u2A56"],[/\\perspcorrespond /g,"\u2A5E"],[/\\Elzminhat /g,"\u2A5F"],[/\\ElsevierGlyph\{225A\}/g,"\u2A63"],[/\\stackrel\{*\}\{=\}/g,"\u2A6E"],[/\\Equal /g,"\u2A75"],[/\\leqslant /g,"\u2A7D"],[/\\nleqslant /g,"\u2A7D-00338"],[/\\geqslant /g,"\u2A7E"],[/\\ngeqslant /g,"\u2A7E-00338"],[/\\lessapprox /g,"\u2A85"],[/\\gtrapprox /g,"\u2A86"],[/\\lneq /g,"\u2A87"],[/\\gneq /g,"\u2A88"],[/\\lnapprox /g,"\u2A89"],[/\\gnapprox /g,"\u2A8A"],[/\\lesseqqgtr /g,"\u2A8B"],[/\\gtreqqless /g,"\u2A8C"],[/\\eqslantless /g,"\u2A95"],[/\\eqslantgtr /g,"\u2A96"],[/\\Pisymbol\{ppi020\}\{117\}/g,"\u2A9D"],[/\\Pisymbol\{ppi020\}\{105\}/g,"\u2A9E"],[/\\NestedLessLess /g,"\u2AA1"],[/\\NotNestedLessLess /g,"\u2AA1-00338"],[/\\NestedGreaterGreater /g,"\u2AA2"],[/\\NotNestedGreaterGreater /g,"\u2AA2-00338"],[/\\preceq /g,"\u2AAF"],[/\\not\\preceq /g,"\u2AAF-00338"],[/\\succeq /g,"\u2AB0"],[/\\not\\succeq /g,"\u2AB0-00338"],[/\\precneqq /g,"\u2AB5"],[/\\succneqq /g,"\u2AB6"],[/\\precapprox /g,"\u2AB7"],[/\\succapprox /g,"\u2AB8"],[/\\precnapprox /g,"\u2AB9"],[/\\succnapprox /g,"\u2ABA"],[/\\subseteqq /g,"\u2AC5"],[/\\nsubseteqq /g,"\u2AC5-00338"],[/\\supseteqq /g,"\u2AC6"],[/\\nsupseteqq/g,"\u2AC6-00338"],[/\\subsetneqq /g,"\u2ACB"],[/\\supsetneqq /g,"\u2ACC"],[/\\ElsevierGlyph\{E30D\}/g,"\u2AEB"],[/\\Elztdcol /g,"\u2AF6"],[/\\ElsevierGlyph\{300A\}/g,"\u300A"],[/\\ElsevierGlyph\{300B\}/g,"\u300B"],[/\\ElsevierGlyph\{3018\}/g,"\u3018"],[/\\ElsevierGlyph\{3019\}/g,"\u3019"],[/\\openbracketleft /g,"\u301A"],[/\\openbracketright /g,"\u301B"]];return this}if(typeof module!=="undefined"&&module.exports){module.exports=BibtexParser};
\ No newline at end of file
diff -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e -r 990bc0688199410ab08d5e8a418770b516c6f4e2 static/scripts/packed/mvc/citation/citation-model.js
--- a/static/scripts/packed/mvc/citation/citation-model.js
+++ b/static/scripts/packed/mvc/citation/citation-model.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
+define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var i=new BibtexParser(g).entries[0];this.entry=i;this._fields={};var k=i.Fields;for(key in k){var j=k[key];var h=key.toLowerCase();this._fields[h]=j}},entryType:function(){return this.entry.EntryType},fields:function(){return this._fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
diff -r ee8efcfd787f93c77eb4e451084d64ce4dc6b85e -r 990bc0688199410ab08d5e8a418770b516c6f4e2 static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.doi){l="http://dx.doi.org/"+k.doi;g+='[<a href="'+l+'">doi:'+k.doi+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/commits/103697ebdd33/
Changeset: 103697ebdd33
User: jmchilton
Date: 2014-08-07 15:36:41
Summary: Merge next-stable.
Affected #: 7 files
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c lib/galaxy/managers/citations.py
--- a/lib/galaxy/managers/citations.py
+++ b/lib/galaxy/managers/citations.py
@@ -49,7 +49,7 @@
def _raw_get_bibtex( self, doi ):
dx_url = "http://dx.doi.org/" + doi
- headers = {'Accept': "text/bibliography; style=bibtex" }
+ headers = {'Accept': 'text/bibliography; style=bibtex, application/x-bibtex'}
req = urllib2.Request(dx_url, data="", headers=headers)
response = urllib2.urlopen(req)
bibtex = response.read()
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/libs/bibtex.js
--- a/static/scripts/libs/bibtex.js
+++ b/static/scripts/libs/bibtex.js
@@ -93,6 +93,7 @@
'booklet' : 14,
'masterthesis' : 15,
'conference' : 16
+ ,'data' : 999 // Galaxy MOD: Handle @data citations coming from figshare.
}
/** @private */ this.MACROS_ = {
'jan' : 'January',
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/mvc/citation/citation-model.js
--- a/static/scripts/mvc/citation/citation-model.js
+++ b/static/scripts/mvc/citation/citation-model.js
@@ -18,12 +18,19 @@
var bibtex = this.attributes.content;
var entry = new BibtexParser(bibtex).entries[0];
this.entry = entry;
+ this._fields = {};
+ var rawFields = entry.Fields;
+ for(key in rawFields) {
+ var value = rawFields[ key ];
+ var lowerKey = key.toLowerCase();
+ this._fields[ lowerKey ] = value;
+ }
},
entryType: function() {
return this.entry.EntryType;
},
fields: function() {
- return this.entry.Fields;
+ return this._fields;
}
} );
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -55,9 +55,9 @@
this._asSentence(fields.note);
}
var doiUrl = "";
- if( fields.DOI ) {
- doiUrl = 'http://dx.doi.org/' + fields.DOI;
- ref += '[<a href="' + doiUrl + '">doi:' + fields.DOI + "</a>]";
+ if( fields.doi ) {
+ doiUrl = 'http://dx.doi.org/' + fields.doi;
+ ref += '[<a href="' + doiUrl + '">doi:' + fields.doi + "</a>]";
}
var url = fields.url || doiUrl;
if( url ) {
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/packed/libs/bibtex.js
--- a/static/scripts/packed/libs/bibtex.js
+++ b/static/scripts/packed/libs/bibtex.js
@@ -1,1 +1,1 @@
-function BibtexParser(c){if(typeof c=="string"){var d={};var a=[];function b(f){a.push(f)}var e=BibtexParser.call(d,b);e.parse(c);return{entries:a,errors:e.getErrors()}}if(typeof c!="function"){throw"Invalid parser construction."}this.STATES_={ENTRY_OR_JUNK:0,OBJECT_TYPE:1,ENTRY_KEY:2,KV_KEY:3,EQUALS:4,KV_VALUE:5};this.DATA_={};this.CALLBACK_=c;this.CHAR_=0;this.LINE_=1;this.CHAR_IN_LINE_=0;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={};this.SKIPTILLEOL_=false;this.VALBRACES_=null;this.BRACETYPE_=null;this.BRACECOUNT_=0;this.STATE_=this.STATES_.ENTRY_OR_JUNK;this.ERRORS_=[];this.ENTRY_TYPES_={inproceedings:1,proceedings:2,article:3,techreport:4,misc:5,mastersthesis:6,book:7,phdthesis:8,incollection:9,unpublished:10,inbook:11,manual:12,periodical:13,booklet:14,masterthesis:15,conference:16};this.MACROS_={jan:"January",feb:"February",mar:"March",apr:"April",may:"May",jun:"June",jul:"July",aug:"August",sep:"September",oct:"October",nov:"November",dec:"December",Jan:"January",Feb:"February",Mar:"March",Apr:"April",May:"May",Jun:"June",Jul:"July",Aug:"August",Sep:"September",Oct:"October",Nov:"November",Dec:"December"};this.getErrors=function(){return this.ERRORS_};this.parse=function(f){for(var g=0;g<f.length;g++){this.processCharacter_(f[g])}};this.error_=function(f){this.ERRORS_.push([this.LINE_,this.CHAR_IN_LINE_,this.CHAR_,f])};this.processEntry_=function(){var h=this.DATA_;if(h.Fields){for(var k in h.Fields){var p=h.Fields[k];for(var j=0;j<this.CHARCONV_.length;j++){var q=this.CHARCONV_[j][0];var n=this.CHARCONV_[j][1];p=p.replace(q,n)}p=p.replace(/[\n\r\t]/g," ").replace(/\s\s+/g," ").replace(/^\s+|\s+$/g,"");var l=p.length;var g="";for(var j=0;j<l;j++){var m=p[j];var o=false;if(m=="\\"&&j<l-1){m=p[++j]}else{if(m=="{"||m=="}"){o=true}}if(!o){g+=m}}h.Fields[k]=g}}if(h.ObjectType=="string"){for(var k in h.Fields){this.MACROS_[k]=h.Fields[k]}}else{this.CALLBACK_(h)}};this.processCharacter_=function(l){this.CHAR_++;this.CHAR_IN_LINE_++;if(l=="\n"){this.LINE_++;this.CHAR_IN_LINE_=1}if(this.SKIPTILLEOL_){if(l=="\n"){this.SKIPTILLEOL_=false}return}if(this.SKIPCOMMENT_&&l=="%"){this.SKIPTILLEOL_=true;return}if(this.SKIPWS_&&/\s/.test(l)){return}this.SKIPWS_=false;this.SKIPCOMMENT_=false;this.SKIPTILLEOL_=false;var f=true;while(f){f=false;switch(this.STATE_){case this.STATES_.ENTRY_OR_JUNK:if(l=="@"){this.STATE_=this.STATES_.OBJECT_TYPE;this.DATA_={ObjectType:""}}this.BRACETYPE_=null;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break;case this.STATES_.OBJECT_TYPE:if(/[A-Za-z]/.test(l)){this.DATA_.ObjectType+=l.toLowerCase();this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{var i=this.DATA_.ObjectType;if(i=="comment"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i=="string"){this.DATA_.ObjectType=i;this.DATA_.Fields={};this.BRACETYPE_=l;this.BRACECOUNT_=1;this.STATE_=this.STATES_.KV_KEY;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={Key:""}}else{if(i=="preamble"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i in this.ENTRY_TYPES_){this.DATA_.ObjectType="entry";this.DATA_.EntryType=i;this.DATA_.EntryKey="";this.STATE_=this.STATES_.ENTRY_KEY;f=true}else{this.error_('Unrecognized object type: "'+this.DATA_.ObjectType+'"');this.STATE_=this.STATES_.ENTRY_OR_JUNK}}}}}break;case this.STATES_.ENTRY_KEY:if((l==="{"||l==="(")&&this.BRACETYPE_==null){this.BRACETYPE_=l;this.BRACECOUNT_=1;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break}if(/[,%\s]/.test(l)){if(this.DATA_.EntryKey.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{if(this.BRACETYPE_==null){this.error_("No opening brace for object.");this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;f=true;this.STATE_=this.STATES_.KV_KEY;this.PARSETMP_.Key="";this.DATA_.Fields={}}}}else{this.DATA_.EntryKey+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}break;case this.STATES_.KV_KEY:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(/[\-A-Za-z:]/.test(l)){this.PARSETMP_.Key+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{if(this.PARSETMP_.Key.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.EQUALS;f=true}}break;case this.STATES_.EQUALS:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.error_('Key-value pair has key "'+this.PARSETMP_.Key+'", but no value.');this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(l=="="){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_VALUE;this.PARSETMP_.Value="";this.VALBRACES_={'"':[],"{":[]}}break;case this.STATES_.KV_VALUE:var k=this.VALBRACES_;var j=this.PARSETMP_.Value;var h=false;if(l=='"'||l=="{"||l=="}"||l==","){if(l==","){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}h=true}}if(l=='"'){if(0===k['"'].length+k["{"].length){k['"'].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false;break}if(k['"'].length==1&&k["{"].length==0&&(j.length==0||j[j.length-1]!="\\")){h=true}else{}}if(l=="{"){if(j.length==0||j[j.length-1]!="\\"){k["{"].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{}}if(l=="}"){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}f=true;h=true}else{if(j.length==0||j[j.length-1]!="\\"){if(k["{"].length>0){k["{"].splice(k["{"].length-1,1);if(0==k["{"].length+k['"'].length){h=true}else{}}}else{}}}}if(h){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_KEY;this.DATA_.Fields[this.PARSETMP_.Key]=this.PARSETMP_.Value;this.PARSETMP_={Key:""};this.VALBRACES_=null}else{this.PARSETMP_.Value+=l}break}}};this.CHARCONV_=[[/\\space /g,"\u0020"],[/\\textdollar /g,"\u0024"],[/\\textquotesingle /g,"\u0027"],[/\\ast /g,"\u002A"],[/\\textbackslash /g,"\u005C"],[/\\\^\{\}/g,"\u005E"],[/\\textasciigrave /g,"\u0060"],[/\\lbrace /g,"\u007B"],[/\\vert /g,"\u007C"],[/\\rbrace /g,"\u007D"],[/\\textasciitilde /g,"\u007E"],[/\\textexclamdown /g,"\u00A1"],[/\\textcent /g,"\u00A2"],[/\\textsterling /g,"\u00A3"],[/\\textcurrency /g,"\u00A4"],[/\\textyen /g,"\u00A5"],[/\\textbrokenbar /g,"\u00A6"],[/\\textsection /g,"\u00A7"],[/\\textasciidieresis /g,"\u00A8"],[/\\textcopyright /g,"\u00A9"],[/\\textordfeminine /g,"\u00AA"],[/\\guillemotleft /g,"\u00AB"],[/\\lnot /g,"\u00AC"],[/\\textregistered /g,"\u00AE"],[/\\textasciimacron /g,"\u00AF"],[/\\textdegree /g,"\u00B0"],[/\\pm /g,"\u00B1"],[/\\textasciiacute /g,"\u00B4"],[/\\mathrm\{\\mu\}/g,"\u00B5"],[/\\textparagraph /g,"\u00B6"],[/\\cdot /g,"\u00B7"],[/\\c\{\}/g,"\u00B8"],[/\\textordmasculine /g,"\u00BA"],[/\\guillemotright /g,"\u00BB"],[/\\textonequarter /g,"\u00BC"],[/\\textonehalf /g,"\u00BD"],[/\\textthreequarters /g,"\u00BE"],[/\\textquestiondown /g,"\u00BF"],[/\\`\{A\}/g,"\u00C0"],[/\\'\{A\}/g,"\u00C1"],[/\\\^\{A\}/g,"\u00C2"],[/\\~\{A\}/g,"\u00C3"],[/\\"\{A\}/g,"\u00C4"],[/\\AA /g,"\u00C5"],[/\\AE /g,"\u00C6"],[/\\c\{C\}/g,"\u00C7"],[/\\`\{E\}/g,"\u00C8"],[/\\'\{E\}/g,"\u00C9"],[/\\\^\{E\}/g,"\u00CA"],[/\\"\{E\}/g,"\u00CB"],[/\\`\{I\}/g,"\u00CC"],[/\\'\{I\}/g,"\u00CD"],[/\\\^\{I\}/g,"\u00CE"],[/\\"\{I\}/g,"\u00CF"],[/\\DH /g,"\u00D0"],[/\\~\{N\}/g,"\u00D1"],[/\\`\{O\}/g,"\u00D2"],[/\\'\{O\}/g,"\u00D3"],[/\\\^\{O\}/g,"\u00D4"],[/\\~\{O\}/g,"\u00D5"],[/\\"\{O\}/g,"\u00D6"],[/\\texttimes /g,"\u00D7"],[/\\O /g,"\u00D8"],[/\\`\{U\}/g,"\u00D9"],[/\\'\{U\}/g,"\u00DA"],[/\\\^\{U\}/g,"\u00DB"],[/\\"\{U\}/g,"\u00DC"],[/\\'\{Y\}/g,"\u00DD"],[/\\TH /g,"\u00DE"],[/\\ss /g,"\u00DF"],[/\\`\{a\}/g,"\u00E0"],[/\\'\{a\}/g,"\u00E1"],[/\\\^\{a\}/g,"\u00E2"],[/\\~\{a\}/g,"\u00E3"],[/\\"\{a\}/g,"\u00E4"],[/\\aa /g,"\u00E5"],[/\\ae /g,"\u00E6"],[/\\c\{c\}/g,"\u00E7"],[/\\`\{e\}/g,"\u00E8"],[/\\'\{e\}/g,"\u00E9"],[/\\\^\{e\}/g,"\u00EA"],[/\\"\{e\}/g,"\u00EB"],[/\\`\{\\i\}/g,"\u00EC"],[/\\'\{\\i\}/g,"\u00ED"],[/\\\^\{\\i\}/g,"\u00EE"],[/\\"\{\\i\}/g,"\u00EF"],[/\\dh /g,"\u00F0"],[/\\~\{n\}/g,"\u00F1"],[/\\`\{o\}/g,"\u00F2"],[/\\'\{o\}/g,"\u00F3"],[/\\\^\{o\}/g,"\u00F4"],[/\\~\{o\}/g,"\u00F5"],[/\\"\{o\}/g,"\u00F6"],[/\\div /g,"\u00F7"],[/\\o /g,"\u00F8"],[/\\`\{u\}/g,"\u00F9"],[/\\'\{u\}/g,"\u00FA"],[/\\\^\{u\}/g,"\u00FB"],[/\\"\{u\}/g,"\u00FC"],[/\\'\{y\}/g,"\u00FD"],[/\\th /g,"\u00FE"],[/\\"\{y\}/g,"\u00FF"],[/\\=\{A\}/g,"\u0100"],[/\\=\{a\}/g,"\u0101"],[/\\u\{A\}/g,"\u0102"],[/\\u\{a\}/g,"\u0103"],[/\\k\{A\}/g,"\u0104"],[/\\k\{a\}/g,"\u0105"],[/\\'\{C\}/g,"\u0106"],[/\\'\{c\}/g,"\u0107"],[/\\\^\{C\}/g,"\u0108"],[/\\\^\{c\}/g,"\u0109"],[/\\.\{C\}/g,"\u010A"],[/\\.\{c\}/g,"\u010B"],[/\\v\{C\}/g,"\u010C"],[/\\v\{c\}/g,"\u010D"],[/\\v\{D\}/g,"\u010E"],[/\\v\{d\}/g,"\u010F"],[/\\DJ /g,"\u0110"],[/\\dj /g,"\u0111"],[/\\=\{E\}/g,"\u0112"],[/\\=\{e\}/g,"\u0113"],[/\\u\{E\}/g,"\u0114"],[/\\u\{e\}/g,"\u0115"],[/\\.\{E\}/g,"\u0116"],[/\\.\{e\}/g,"\u0117"],[/\\k\{E\}/g,"\u0118"],[/\\k\{e\}/g,"\u0119"],[/\\v\{E\}/g,"\u011A"],[/\\v\{e\}/g,"\u011B"],[/\\\^\{G\}/g,"\u011C"],[/\\\^\{g\}/g,"\u011D"],[/\\u\{G\}/g,"\u011E"],[/\\u\{g\}/g,"\u011F"],[/\\.\{G\}/g,"\u0120"],[/\\.\{g\}/g,"\u0121"],[/\\c\{G\}/g,"\u0122"],[/\\c\{g\}/g,"\u0123"],[/\\\^\{H\}/g,"\u0124"],[/\\\^\{h\}/g,"\u0125"],[/\\Elzxh /g,"\u0127"],[/\\~\{I\}/g,"\u0128"],[/\\~\{\\i\}/g,"\u0129"],[/\\=\{I\}/g,"\u012A"],[/\\=\{\\i\}/g,"\u012B"],[/\\u\{I\}/g,"\u012C"],[/\\u\{\\i\}/g,"\u012D"],[/\\k\{I\}/g,"\u012E"],[/\\k\{i\}/g,"\u012F"],[/\\.\{I\}/g,"\u0130"],[/\\i /g,"\u0131"],[/\\\^\{J\}/g,"\u0134"],[/\\\^\{\\j\}/g,"\u0135"],[/\\c\{K\}/g,"\u0136"],[/\\c\{k\}/g,"\u0137"],[/\\'\{L\}/g,"\u0139"],[/\\'\{l\}/g,"\u013A"],[/\\c\{L\}/g,"\u013B"],[/\\c\{l\}/g,"\u013C"],[/\\v\{L\}/g,"\u013D"],[/\\v\{l\}/g,"\u013E"],[/\\L /g,"\u0141"],[/\\l /g,"\u0142"],[/\\'\{N\}/g,"\u0143"],[/\\'\{n\}/g,"\u0144"],[/\\c\{N\}/g,"\u0145"],[/\\c\{n\}/g,"\u0146"],[/\\v\{N\}/g,"\u0147"],[/\\v\{n\}/g,"\u0148"],[/\\NG /g,"\u014A"],[/\\ng /g,"\u014B"],[/\\=\{O\}/g,"\u014C"],[/\\=\{o\}/g,"\u014D"],[/\\u\{O\}/g,"\u014E"],[/\\u\{o\}/g,"\u014F"],[/\\H\{O\}/g,"\u0150"],[/\\H\{o\}/g,"\u0151"],[/\\OE /g,"\u0152"],[/\\oe /g,"\u0153"],[/\\'\{R\}/g,"\u0154"],[/\\'\{r\}/g,"\u0155"],[/\\c\{R\}/g,"\u0156"],[/\\c\{r\}/g,"\u0157"],[/\\v\{R\}/g,"\u0158"],[/\\v\{r\}/g,"\u0159"],[/\\'\{S\}/g,"\u015A"],[/\\'\{s\}/g,"\u015B"],[/\\\^\{S\}/g,"\u015C"],[/\\\^\{s\}/g,"\u015D"],[/\\c\{S\}/g,"\u015E"],[/\\c\{s\}/g,"\u015F"],[/\\v\{S\}/g,"\u0160"],[/\\v\{s\}/g,"\u0161"],[/\\c\{T\}/g,"\u0162"],[/\\c\{t\}/g,"\u0163"],[/\\v\{T\}/g,"\u0164"],[/\\v\{t\}/g,"\u0165"],[/\\~\{U\}/g,"\u0168"],[/\\~\{u\}/g,"\u0169"],[/\\=\{U\}/g,"\u016A"],[/\\=\{u\}/g,"\u016B"],[/\\u\{U\}/g,"\u016C"],[/\\u\{u\}/g,"\u016D"],[/\\r\{U\}/g,"\u016E"],[/\\r\{u\}/g,"\u016F"],[/\\H\{U\}/g,"\u0170"],[/\\H\{u\}/g,"\u0171"],[/\\k\{U\}/g,"\u0172"],[/\\k\{u\}/g,"\u0173"],[/\\\^\{W\}/g,"\u0174"],[/\\\^\{w\}/g,"\u0175"],[/\\\^\{Y\}/g,"\u0176"],[/\\\^\{y\}/g,"\u0177"],[/\\"\{Y\}/g,"\u0178"],[/\\'\{Z\}/g,"\u0179"],[/\\'\{z\}/g,"\u017A"],[/\\.\{Z\}/g,"\u017B"],[/\\.\{z\}/g,"\u017C"],[/\\v\{Z\}/g,"\u017D"],[/\\v\{z\}/g,"\u017E"],[/\\texthvlig /g,"\u0195"],[/\\textnrleg /g,"\u019E"],[/\\eth /g,"\u01AA"],[/\\textdoublepipe /g,"\u01C2"],[/\\'\{g\}/g,"\u01F5"],[/\\Elztrna /g,"\u0250"],[/\\Elztrnsa /g,"\u0252"],[/\\Elzopeno /g,"\u0254"],[/\\Elzrtld /g,"\u0256"],[/\\Elzschwa /g,"\u0259"],[/\\varepsilon /g,"\u025B"],[/\\Elzpgamma /g,"\u0263"],[/\\Elzpbgam /g,"\u0264"],[/\\Elztrnh /g,"\u0265"],[/\\Elzbtdl /g,"\u026C"],[/\\Elzrtll /g,"\u026D"],[/\\Elztrnm /g,"\u026F"],[/\\Elztrnmlr /g,"\u0270"],[/\\Elzltlmr /g,"\u0271"],[/\\Elzltln /g,"\u0272"],[/\\Elzrtln /g,"\u0273"],[/\\Elzclomeg /g,"\u0277"],[/\\textphi /g,"\u0278"],[/\\Elztrnr /g,"\u0279"],[/\\Elztrnrl /g,"\u027A"],[/\\Elzrttrnr /g,"\u027B"],[/\\Elzrl /g,"\u027C"],[/\\Elzrtlr /g,"\u027D"],[/\\Elzfhr /g,"\u027E"],[/\\Elzrtls /g,"\u0282"],[/\\Elzesh /g,"\u0283"],[/\\Elztrnt /g,"\u0287"],[/\\Elzrtlt /g,"\u0288"],[/\\Elzpupsil /g,"\u028A"],[/\\Elzpscrv /g,"\u028B"],[/\\Elzinvv /g,"\u028C"],[/\\Elzinvw /g,"\u028D"],[/\\Elztrny /g,"\u028E"],[/\\Elzrtlz /g,"\u0290"],[/\\Elzyogh /g,"\u0292"],[/\\Elzglst /g,"\u0294"],[/\\Elzreglst /g,"\u0295"],[/\\Elzinglst /g,"\u0296"],[/\\textturnk /g,"\u029E"],[/\\Elzdyogh /g,"\u02A4"],[/\\Elztesh /g,"\u02A7"],[/\\textasciicaron /g,"\u02C7"],[/\\Elzverts /g,"\u02C8"],[/\\Elzverti /g,"\u02CC"],[/\\Elzlmrk /g,"\u02D0"],[/\\Elzhlmrk /g,"\u02D1"],[/\\Elzsbrhr /g,"\u02D2"],[/\\Elzsblhr /g,"\u02D3"],[/\\Elzrais /g,"\u02D4"],[/\\Elzlow /g,"\u02D5"],[/\\textasciibreve /g,"\u02D8"],[/\\textperiodcentered /g,"\u02D9"],[/\\r\{\}/g,"\u02DA"],[/\\k\{\}/g,"\u02DB"],[/\\texttildelow /g,"\u02DC"],[/\\H\{\}/g,"\u02DD"],[/\\tone\{55\}/g,"\u02E5"],[/\\tone\{44\}/g,"\u02E6"],[/\\tone\{33\}/g,"\u02E7"],[/\\tone\{22\}/g,"\u02E8"],[/\\tone\{11\}/g,"\u02E9"],[/\\cyrchar\\C/g,"\u030F"],[/\\Elzpalh /g,"\u0321"],[/\\Elzrh /g,"\u0322"],[/\\Elzsbbrg /g,"\u032A"],[/\\Elzxl /g,"\u0335"],[/\\Elzbar /g,"\u0336"],[/\\'\{A\}/g,"\u0386"],[/\\'\{E\}/g,"\u0388"],[/\\'\{H\}/g,"\u0389"],[/\\'\{\}\{I\}/g,"\u038A"],[/\\'\{\}O/g,"\u038C"],[/\\mathrm\{'Y\}/g,"\u038E"],[/\\mathrm\{'\\Omega\}/g,"\u038F"],[/\\acute\{\\ddot\{\\iota\}\}/g,"\u0390"],[/\\Alpha /g,"\u0391"],[/\\Beta /g,"\u0392"],[/\\Gamma /g,"\u0393"],[/\\Delta /g,"\u0394"],[/\\Epsilon /g,"\u0395"],[/\\Zeta /g,"\u0396"],[/\\Eta /g,"\u0397"],[/\\Theta /g,"\u0398"],[/\\Iota /g,"\u0399"],[/\\Kappa /g,"\u039A"],[/\\Lambda /g,"\u039B"],[/\\Xi /g,"\u039E"],[/\\Pi /g,"\u03A0"],[/\\Rho /g,"\u03A1"],[/\\Sigma /g,"\u03A3"],[/\\Tau /g,"\u03A4"],[/\\Upsilon /g,"\u03A5"],[/\\Phi /g,"\u03A6"],[/\\Chi /g,"\u03A7"],[/\\Psi /g,"\u03A8"],[/\\Omega /g,"\u03A9"],[/\\mathrm\{\\ddot\{I\}\}/g,"\u03AA"],[/\\mathrm\{\\ddot\{Y\}\}/g,"\u03AB"],[/\\'\{\$\\alpha\$\}/g,"\u03AC"],[/\\acute\{\\epsilon\}/g,"\u03AD"],[/\\acute\{\\eta\}/g,"\u03AE"],[/\\acute\{\\iota\}/g,"\u03AF"],[/\\acute\{\\ddot\{\\upsilon\}\}/g,"\u03B0"],[/\\alpha /g,"\u03B1"],[/\\beta /g,"\u03B2"],[/\\gamma /g,"\u03B3"],[/\\delta /g,"\u03B4"],[/\\epsilon /g,"\u03B5"],[/\\zeta /g,"\u03B6"],[/\\eta /g,"\u03B7"],[/\\texttheta /g,"\u03B8"],[/\\iota /g,"\u03B9"],[/\\kappa /g,"\u03BA"],[/\\lambda /g,"\u03BB"],[/\\mu /g,"\u03BC"],[/\\nu /g,"\u03BD"],[/\\xi /g,"\u03BE"],[/\\pi /g,"\u03C0"],[/\\rho /g,"\u03C1"],[/\\varsigma /g,"\u03C2"],[/\\sigma /g,"\u03C3"],[/\\tau /g,"\u03C4"],[/\\upsilon /g,"\u03C5"],[/\\varphi /g,"\u03C6"],[/\\chi /g,"\u03C7"],[/\\psi /g,"\u03C8"],[/\\omega /g,"\u03C9"],[/\\ddot\{\\iota\}/g,"\u03CA"],[/\\ddot\{\\upsilon\}/g,"\u03CB"],[/\\'\{o\}/g,"\u03CC"],[/\\acute\{\\upsilon\}/g,"\u03CD"],[/\\acute\{\\omega\}/g,"\u03CE"],[/\\Pisymbol\{ppi022\}\{87\}/g,"\u03D0"],[/\\textvartheta /g,"\u03D1"],[/\\Upsilon /g,"\u03D2"],[/\\phi /g,"\u03D5"],[/\\varpi /g,"\u03D6"],[/\\Stigma /g,"\u03DA"],[/\\Digamma /g,"\u03DC"],[/\\digamma /g,"\u03DD"],[/\\Koppa /g,"\u03DE"],[/\\Sampi /g,"\u03E0"],[/\\varkappa /g,"\u03F0"],[/\\varrho /g,"\u03F1"],[/\\textTheta /g,"\u03F4"],[/\\backepsilon /g,"\u03F6"],[/\\cyrchar\\CYRYO /g,"\u0401"],[/\\cyrchar\\CYRDJE /g,"\u0402"],[/\\cyrchar\{\\'\\CYRG\}/g,"\u0403"],[/\\cyrchar\\CYRIE /g,"\u0404"],[/\\cyrchar\\CYRDZE /g,"\u0405"],[/\\cyrchar\\CYRII /g,"\u0406"],[/\\cyrchar\\CYRYI /g,"\u0407"],[/\\cyrchar\\CYRJE /g,"\u0408"],[/\\cyrchar\\CYRLJE /g,"\u0409"],[/\\cyrchar\\CYRNJE /g,"\u040A"],[/\\cyrchar\\CYRTSHE /g,"\u040B"],[/\\cyrchar\{\\'\\CYRK\}/g,"\u040C"],[/\\cyrchar\\CYRUSHRT /g,"\u040E"],[/\\cyrchar\\CYRDZHE /g,"\u040F"],[/\\cyrchar\\CYRA /g,"\u0410"],[/\\cyrchar\\CYRB /g,"\u0411"],[/\\cyrchar\\CYRV /g,"\u0412"],[/\\cyrchar\\CYRG /g,"\u0413"],[/\\cyrchar\\CYRD /g,"\u0414"],[/\\cyrchar\\CYRE /g,"\u0415"],[/\\cyrchar\\CYRZH /g,"\u0416"],[/\\cyrchar\\CYRZ /g,"\u0417"],[/\\cyrchar\\CYRI /g,"\u0418"],[/\\cyrchar\\CYRISHRT /g,"\u0419"],[/\\cyrchar\\CYRK /g,"\u041A"],[/\\cyrchar\\CYRL /g,"\u041B"],[/\\cyrchar\\CYRM /g,"\u041C"],[/\\cyrchar\\CYRN /g,"\u041D"],[/\\cyrchar\\CYRO /g,"\u041E"],[/\\cyrchar\\CYRP /g,"\u041F"],[/\\cyrchar\\CYRR /g,"\u0420"],[/\\cyrchar\\CYRS /g,"\u0421"],[/\\cyrchar\\CYRT /g,"\u0422"],[/\\cyrchar\\CYRU /g,"\u0423"],[/\\cyrchar\\CYRF /g,"\u0424"],[/\\cyrchar\\CYRH /g,"\u0425"],[/\\cyrchar\\CYRC /g,"\u0426"],[/\\cyrchar\\CYRCH /g,"\u0427"],[/\\cyrchar\\CYRSH /g,"\u0428"],[/\\cyrchar\\CYRSHCH /g,"\u0429"],[/\\cyrchar\\CYRHRDSN /g,"\u042A"],[/\\cyrchar\\CYRERY /g,"\u042B"],[/\\cyrchar\\CYRSFTSN /g,"\u042C"],[/\\cyrchar\\CYREREV /g,"\u042D"],[/\\cyrchar\\CYRYU /g,"\u042E"],[/\\cyrchar\\CYRYA /g,"\u042F"],[/\\cyrchar\\cyra /g,"\u0430"],[/\\cyrchar\\cyrb /g,"\u0431"],[/\\cyrchar\\cyrv /g,"\u0432"],[/\\cyrchar\\cyrg /g,"\u0433"],[/\\cyrchar\\cyrd /g,"\u0434"],[/\\cyrchar\\cyre /g,"\u0435"],[/\\cyrchar\\cyrzh /g,"\u0436"],[/\\cyrchar\\cyrz /g,"\u0437"],[/\\cyrchar\\cyri /g,"\u0438"],[/\\cyrchar\\cyrishrt /g,"\u0439"],[/\\cyrchar\\cyrk /g,"\u043A"],[/\\cyrchar\\cyrl /g,"\u043B"],[/\\cyrchar\\cyrm /g,"\u043C"],[/\\cyrchar\\cyrn /g,"\u043D"],[/\\cyrchar\\cyro /g,"\u043E"],[/\\cyrchar\\cyrp /g,"\u043F"],[/\\cyrchar\\cyrr /g,"\u0440"],[/\\cyrchar\\cyrs /g,"\u0441"],[/\\cyrchar\\cyrt /g,"\u0442"],[/\\cyrchar\\cyru /g,"\u0443"],[/\\cyrchar\\cyrf /g,"\u0444"],[/\\cyrchar\\cyrh /g,"\u0445"],[/\\cyrchar\\cyrc /g,"\u0446"],[/\\cyrchar\\cyrch /g,"\u0447"],[/\\cyrchar\\cyrsh /g,"\u0448"],[/\\cyrchar\\cyrshch /g,"\u0449"],[/\\cyrchar\\cyrhrdsn /g,"\u044A"],[/\\cyrchar\\cyrery /g,"\u044B"],[/\\cyrchar\\cyrsftsn /g,"\u044C"],[/\\cyrchar\\cyrerev /g,"\u044D"],[/\\cyrchar\\cyryu /g,"\u044E"],[/\\cyrchar\\cyrya /g,"\u044F"],[/\\cyrchar\\cyryo /g,"\u0451"],[/\\cyrchar\\cyrdje /g,"\u0452"],[/\\cyrchar\{\\'\\cyrg\}/g,"\u0453"],[/\\cyrchar\\cyrie /g,"\u0454"],[/\\cyrchar\\cyrdze /g,"\u0455"],[/\\cyrchar\\cyrii /g,"\u0456"],[/\\cyrchar\\cyryi /g,"\u0457"],[/\\cyrchar\\cyrje /g,"\u0458"],[/\\cyrchar\\cyrlje /g,"\u0459"],[/\\cyrchar\\cyrnje /g,"\u045A"],[/\\cyrchar\\cyrtshe /g,"\u045B"],[/\\cyrchar\{\\'\\cyrk\}/g,"\u045C"],[/\\cyrchar\\cyrushrt /g,"\u045E"],[/\\cyrchar\\cyrdzhe /g,"\u045F"],[/\\cyrchar\\CYROMEGA /g,"\u0460"],[/\\cyrchar\\cyromega /g,"\u0461"],[/\\cyrchar\\CYRYAT /g,"\u0462"],[/\\cyrchar\\CYRIOTE /g,"\u0464"],[/\\cyrchar\\cyriote /g,"\u0465"],[/\\cyrchar\\CYRLYUS /g,"\u0466"],[/\\cyrchar\\cyrlyus /g,"\u0467"],[/\\cyrchar\\CYRIOTLYUS /g,"\u0468"],[/\\cyrchar\\cyriotlyus /g,"\u0469"],[/\\cyrchar\\CYRBYUS /g,"\u046A"],[/\\cyrchar\\CYRIOTBYUS /g,"\u046C"],[/\\cyrchar\\cyriotbyus /g,"\u046D"],[/\\cyrchar\\CYRKSI /g,"\u046E"],[/\\cyrchar\\cyrksi /g,"\u046F"],[/\\cyrchar\\CYRPSI /g,"\u0470"],[/\\cyrchar\\cyrpsi /g,"\u0471"],[/\\cyrchar\\CYRFITA /g,"\u0472"],[/\\cyrchar\\CYRIZH /g,"\u0474"],[/\\cyrchar\\CYRUK /g,"\u0478"],[/\\cyrchar\\cyruk /g,"\u0479"],[/\\cyrchar\\CYROMEGARND /g,"\u047A"],[/\\cyrchar\\cyromegarnd /g,"\u047B"],[/\\cyrchar\\CYROMEGATITLO /g,"\u047C"],[/\\cyrchar\\cyromegatitlo /g,"\u047D"],[/\\cyrchar\\CYROT /g,"\u047E"],[/\\cyrchar\\cyrot /g,"\u047F"],[/\\cyrchar\\CYRKOPPA /g,"\u0480"],[/\\cyrchar\\cyrkoppa /g,"\u0481"],[/\\cyrchar\\cyrthousands /g,"\u0482"],[/\\cyrchar\\cyrhundredthousands /g,"\u0488"],[/\\cyrchar\\cyrmillions /g,"\u0489"],[/\\cyrchar\\CYRSEMISFTSN /g,"\u048C"],[/\\cyrchar\\cyrsemisftsn /g,"\u048D"],[/\\cyrchar\\CYRRTICK /g,"\u048E"],[/\\cyrchar\\cyrrtick /g,"\u048F"],[/\\cyrchar\\CYRGUP /g,"\u0490"],[/\\cyrchar\\cyrgup /g,"\u0491"],[/\\cyrchar\\CYRGHCRS /g,"\u0492"],[/\\cyrchar\\cyrghcrs /g,"\u0493"],[/\\cyrchar\\CYRGHK /g,"\u0494"],[/\\cyrchar\\cyrghk /g,"\u0495"],[/\\cyrchar\\CYRZHDSC /g,"\u0496"],[/\\cyrchar\\cyrzhdsc /g,"\u0497"],[/\\cyrchar\\CYRZDSC /g,"\u0498"],[/\\cyrchar\\cyrzdsc /g,"\u0499"],[/\\cyrchar\\CYRKDSC /g,"\u049A"],[/\\cyrchar\\cyrkdsc /g,"\u049B"],[/\\cyrchar\\CYRKVCRS /g,"\u049C"],[/\\cyrchar\\cyrkvcrs /g,"\u049D"],[/\\cyrchar\\CYRKHCRS /g,"\u049E"],[/\\cyrchar\\cyrkhcrs /g,"\u049F"],[/\\cyrchar\\CYRKBEAK /g,"\u04A0"],[/\\cyrchar\\cyrkbeak /g,"\u04A1"],[/\\cyrchar\\CYRNDSC /g,"\u04A2"],[/\\cyrchar\\cyrndsc /g,"\u04A3"],[/\\cyrchar\\CYRNG /g,"\u04A4"],[/\\cyrchar\\cyrng /g,"\u04A5"],[/\\cyrchar\\CYRPHK /g,"\u04A6"],[/\\cyrchar\\cyrphk /g,"\u04A7"],[/\\cyrchar\\CYRABHHA /g,"\u04A8"],[/\\cyrchar\\cyrabhha /g,"\u04A9"],[/\\cyrchar\\CYRSDSC /g,"\u04AA"],[/\\cyrchar\\cyrsdsc /g,"\u04AB"],[/\\cyrchar\\CYRTDSC /g,"\u04AC"],[/\\cyrchar\\cyrtdsc /g,"\u04AD"],[/\\cyrchar\\CYRY /g,"\u04AE"],[/\\cyrchar\\cyry /g,"\u04AF"],[/\\cyrchar\\CYRYHCRS /g,"\u04B0"],[/\\cyrchar\\cyryhcrs /g,"\u04B1"],[/\\cyrchar\\CYRHDSC /g,"\u04B2"],[/\\cyrchar\\cyrhdsc /g,"\u04B3"],[/\\cyrchar\\CYRTETSE /g,"\u04B4"],[/\\cyrchar\\cyrtetse /g,"\u04B5"],[/\\cyrchar\\CYRCHRDSC /g,"\u04B6"],[/\\cyrchar\\cyrchrdsc /g,"\u04B7"],[/\\cyrchar\\CYRCHVCRS /g,"\u04B8"],[/\\cyrchar\\cyrchvcrs /g,"\u04B9"],[/\\cyrchar\\CYRSHHA /g,"\u04BA"],[/\\cyrchar\\cyrshha /g,"\u04BB"],[/\\cyrchar\\CYRABHCH /g,"\u04BC"],[/\\cyrchar\\cyrabhch /g,"\u04BD"],[/\\cyrchar\\CYRABHCHDSC /g,"\u04BE"],[/\\cyrchar\\cyrabhchdsc /g,"\u04BF"],[/\\cyrchar\\CYRpalochka /g,"\u04C0"],[/\\cyrchar\\CYRKHK /g,"\u04C3"],[/\\cyrchar\\cyrkhk /g,"\u04C4"],[/\\cyrchar\\CYRNHK /g,"\u04C7"],[/\\cyrchar\\cyrnhk /g,"\u04C8"],[/\\cyrchar\\CYRCHLDSC /g,"\u04CB"],[/\\cyrchar\\cyrchldsc /g,"\u04CC"],[/\\cyrchar\\CYRAE /g,"\u04D4"],[/\\cyrchar\\cyrae /g,"\u04D5"],[/\\cyrchar\\CYRSCHWA /g,"\u04D8"],[/\\cyrchar\\cyrschwa /g,"\u04D9"],[/\\cyrchar\\CYRABHDZE /g,"\u04E0"],[/\\cyrchar\\cyrabhdze /g,"\u04E1"],[/\\cyrchar\\CYROTLD /g,"\u04E8"],[/\\cyrchar\\cyrotld /g,"\u04E9"],[/\\hspace\{0.6em\}/g,"\u2002"],[/\\hspace\{1em\}/g,"\u2003"],[/\\hspace\{0.33em\}/g,"\u2004"],[/\\hspace\{0.25em\}/g,"\u2005"],[/\\hspace\{0.166em\}/g,"\u2006"],[/\\hphantom\{0\}/g,"\u2007"],[/\\hphantom\{,\}/g,"\u2008"],[/\\hspace\{0.167em\}/g,"\u2009"],[/\\mkern1mu /g,"\u200A"],[/\\textendash /g,"\u2013"],[/\\textemdash /g,"\u2014"],[/\\rule\{1em\}\{1pt\}/g,"\u2015"],[/\\Vert /g,"\u2016"],[/\\Elzreapos /g,"\u201B"],[/\\textquotedblleft /g,"\u201C"],[/\\textquotedblright /g,"\u201D"],[/\\textdagger /g,"\u2020"],[/\\textdaggerdbl /g,"\u2021"],[/\\textbullet /g,"\u2022"],[/\\ldots /g,"\u2026"],[/\\textperthousand /g,"\u2030"],[/\\textpertenthousand /g,"\u2031"],[/\\backprime /g,"\u2035"],[/\\guilsinglleft /g,"\u2039"],[/\\guilsinglright /g,"\u203A"],[/\\mkern4mu /g,"\u205F"],[/\\nolinebreak /g,"\u2060"],[/\\ensuremath\{\\Elzpes\}/g,"\u20A7"],[/\\mbox\{\\texteuro\} /g,"\u20AC"],[/\\dddot /g,"\u20DB"],[/\\ddddot /g,"\u20DC"],[/\\mathbb\{C\}/g,"\u2102"],[/\\mathscr\{g\}/g,"\u210A"],[/\\mathscr\{H\}/g,"\u210B"],[/\\mathfrak\{H\}/g,"\u210C"],[/\\mathbb\{H\}/g,"\u210D"],[/\\hslash /g,"\u210F"],[/\\mathscr\{I\}/g,"\u2110"],[/\\mathfrak\{I\}/g,"\u2111"],[/\\mathscr\{L\}/g,"\u2112"],[/\\mathscr\{l\}/g,"\u2113"],[/\\mathbb\{N\}/g,"\u2115"],[/\\cyrchar\\textnumero /g,"\u2116"],[/\\wp /g,"\u2118"],[/\\mathbb\{P\}/g,"\u2119"],[/\\mathbb\{Q\}/g,"\u211A"],[/\\mathscr\{R\}/g,"\u211B"],[/\\mathfrak\{R\}/g,"\u211C"],[/\\mathbb\{R\}/g,"\u211D"],[/\\Elzxrat /g,"\u211E"],[/\\texttrademark /g,"\u2122"],[/\\mathbb\{Z\}/g,"\u2124"],[/\\Omega /g,"\u2126"],[/\\mho /g,"\u2127"],[/\\mathfrak\{Z\}/g,"\u2128"],[/\\ElsevierGlyph\{2129\}/g,"\u2129"],[/\\AA /g,"\u212B"],[/\\mathscr\{B\}/g,"\u212C"],[/\\mathfrak\{C\}/g,"\u212D"],[/\\mathscr\{e\}/g,"\u212F"],[/\\mathscr\{E\}/g,"\u2130"],[/\\mathscr\{F\}/g,"\u2131"],[/\\mathscr\{M\}/g,"\u2133"],[/\\mathscr\{o\}/g,"\u2134"],[/\\aleph /g,"\u2135"],[/\\beth /g,"\u2136"],[/\\gimel /g,"\u2137"],[/\\daleth /g,"\u2138"],[/\\textfrac\{1\}\{3\}/g,"\u2153"],[/\\textfrac\{2\}\{3\}/g,"\u2154"],[/\\textfrac\{1\}\{5\}/g,"\u2155"],[/\\textfrac\{2\}\{5\}/g,"\u2156"],[/\\textfrac\{3\}\{5\}/g,"\u2157"],[/\\textfrac\{4\}\{5\}/g,"\u2158"],[/\\textfrac\{1\}\{6\}/g,"\u2159"],[/\\textfrac\{5\}\{6\}/g,"\u215A"],[/\\textfrac\{1\}\{8\}/g,"\u215B"],[/\\textfrac\{3\}\{8\}/g,"\u215C"],[/\\textfrac\{5\}\{8\}/g,"\u215D"],[/\\textfrac\{7\}\{8\}/g,"\u215E"],[/\\leftarrow /g,"\u2190"],[/\\uparrow /g,"\u2191"],[/\\rightarrow /g,"\u2192"],[/\\downarrow /g,"\u2193"],[/\\leftrightarrow /g,"\u2194"],[/\\updownarrow /g,"\u2195"],[/\\nwarrow /g,"\u2196"],[/\\nearrow /g,"\u2197"],[/\\searrow /g,"\u2198"],[/\\swarrow /g,"\u2199"],[/\\nleftarrow /g,"\u219A"],[/\\nrightarrow /g,"\u219B"],[/\\arrowwaveright /g,"\u219C"],[/\\arrowwaveright /g,"\u219D"],[/\\twoheadleftarrow /g,"\u219E"],[/\\twoheadrightarrow /g,"\u21A0"],[/\\leftarrowtail /g,"\u21A2"],[/\\rightarrowtail /g,"\u21A3"],[/\\mapsto /g,"\u21A6"],[/\\hookleftarrow /g,"\u21A9"],[/\\hookrightarrow /g,"\u21AA"],[/\\looparrowleft /g,"\u21AB"],[/\\looparrowright /g,"\u21AC"],[/\\leftrightsquigarrow /g,"\u21AD"],[/\\nleftrightarrow /g,"\u21AE"],[/\\Lsh /g,"\u21B0"],[/\\Rsh /g,"\u21B1"],[/\\ElsevierGlyph\{21B3\}/g,"\u21B3"],[/\\curvearrowleft /g,"\u21B6"],[/\\curvearrowright /g,"\u21B7"],[/\\circlearrowleft /g,"\u21BA"],[/\\circlearrowright /g,"\u21BB"],[/\\leftharpoonup /g,"\u21BC"],[/\\leftharpoondown /g,"\u21BD"],[/\\upharpoonright /g,"\u21BE"],[/\\upharpoonleft /g,"\u21BF"],[/\\rightharpoonup /g,"\u21C0"],[/\\rightharpoondown /g,"\u21C1"],[/\\downharpoonright /g,"\u21C2"],[/\\downharpoonleft /g,"\u21C3"],[/\\rightleftarrows /g,"\u21C4"],[/\\dblarrowupdown /g,"\u21C5"],[/\\leftrightarrows /g,"\u21C6"],[/\\leftleftarrows /g,"\u21C7"],[/\\upuparrows /g,"\u21C8"],[/\\rightrightarrows /g,"\u21C9"],[/\\downdownarrows /g,"\u21CA"],[/\\leftrightharpoons /g,"\u21CB"],[/\\rightleftharpoons /g,"\u21CC"],[/\\nLeftarrow /g,"\u21CD"],[/\\nLeftrightarrow /g,"\u21CE"],[/\\nRightarrow /g,"\u21CF"],[/\\Leftarrow /g,"\u21D0"],[/\\Uparrow /g,"\u21D1"],[/\\Rightarrow /g,"\u21D2"],[/\\Downarrow /g,"\u21D3"],[/\\Leftrightarrow /g,"\u21D4"],[/\\Updownarrow /g,"\u21D5"],[/\\Lleftarrow /g,"\u21DA"],[/\\Rrightarrow /g,"\u21DB"],[/\\rightsquigarrow /g,"\u21DD"],[/\\DownArrowUpArrow /g,"\u21F5"],[/\\forall /g,"\u2200"],[/\\complement /g,"\u2201"],[/\\partial /g,"\u2202"],[/\\exists /g,"\u2203"],[/\\nexists /g,"\u2204"],[/\\varnothing /g,"\u2205"],[/\\nabla /g,"\u2207"],[/\\in /g,"\u2208"],[/\\not\\in /g,"\u2209"],[/\\ni /g,"\u220B"],[/\\not\\ni /g,"\u220C"],[/\\prod /g,"\u220F"],[/\\coprod /g,"\u2210"],[/\\sum /g,"\u2211"],[/\\mp /g,"\u2213"],[/\\dotplus /g,"\u2214"],[/\\setminus /g,"\u2216"],[/\\circ /g,"\u2218"],[/\\bullet /g,"\u2219"],[/\\surd /g,"\u221A"],[/\\propto /g,"\u221D"],[/\\infty /g,"\u221E"],[/\\rightangle /g,"\u221F"],[/\\angle /g,"\u2220"],[/\\measuredangle /g,"\u2221"],[/\\sphericalangle /g,"\u2222"],[/\\mid /g,"\u2223"],[/\\nmid /g,"\u2224"],[/\\parallel /g,"\u2225"],[/\\nparallel /g,"\u2226"],[/\\wedge /g,"\u2227"],[/\\vee /g,"\u2228"],[/\\cap /g,"\u2229"],[/\\cup /g,"\u222A"],[/\\int /g,"\u222B"],[/\\int\\!\\int /g,"\u222C"],[/\\int\\!\\int\\!\\int /g,"\u222D"],[/\\oint /g,"\u222E"],[/\\surfintegral /g,"\u222F"],[/\\volintegral /g,"\u2230"],[/\\clwintegral /g,"\u2231"],[/\\ElsevierGlyph\{2232\}/g,"\u2232"],[/\\ElsevierGlyph\{2233\}/g,"\u2233"],[/\\therefore /g,"\u2234"],[/\\because /g,"\u2235"],[/\\Colon /g,"\u2237"],[/\\ElsevierGlyph\{2238\}/g,"\u2238"],[/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g,"\u223A"],[/\\homothetic /g,"\u223B"],[/\\sim /g,"\u223C"],[/\\backsim /g,"\u223D"],[/\\lazysinv /g,"\u223E"],[/\\wr /g,"\u2240"],[/\\not\\sim /g,"\u2241"],[/\\ElsevierGlyph\{2242\}/g,"\u2242"],[/\\NotEqualTilde /g,"\u2242-00338"],[/\\simeq /g,"\u2243"],[/\\not\\simeq /g,"\u2244"],[/\\cong /g,"\u2245"],[/\\approxnotequal /g,"\u2246"],[/\\not\\cong /g,"\u2247"],[/\\approx /g,"\u2248"],[/\\not\\approx /g,"\u2249"],[/\\approxeq /g,"\u224A"],[/\\tildetrpl /g,"\u224B"],[/\\not\\apid /g,"\u224B-00338"],[/\\allequal /g,"\u224C"],[/\\asymp /g,"\u224D"],[/\\Bumpeq /g,"\u224E"],[/\\NotHumpDownHump /g,"\u224E-00338"],[/\\bumpeq /g,"\u224F"],[/\\NotHumpEqual /g,"\u224F-00338"],[/\\doteq /g,"\u2250"],[/\\not\\doteq/g,"\u2250-00338"],[/\\doteqdot /g,"\u2251"],[/\\fallingdotseq /g,"\u2252"],[/\\risingdotseq /g,"\u2253"],[/\\eqcirc /g,"\u2256"],[/\\circeq /g,"\u2257"],[/\\estimates /g,"\u2259"],[/\\ElsevierGlyph\{225A\}/g,"\u225A"],[/\\starequal /g,"\u225B"],[/\\triangleq /g,"\u225C"],[/\\ElsevierGlyph\{225F\}/g,"\u225F"],[/\\not =/g,"\u2260"],[/\\equiv /g,"\u2261"],[/\\not\\equiv /g,"\u2262"],[/\\leq /g,"\u2264"],[/\\geq /g,"\u2265"],[/\\leqq /g,"\u2266"],[/\\geqq /g,"\u2267"],[/\\lneqq /g,"\u2268"],[/\\lvertneqq /g,"\u2268-0FE00"],[/\\gneqq /g,"\u2269"],[/\\gvertneqq /g,"\u2269-0FE00"],[/\\ll /g,"\u226A"],[/\\NotLessLess /g,"\u226A-00338"],[/\\gg /g,"\u226B"],[/\\NotGreaterGreater /g,"\u226B-00338"],[/\\between /g,"\u226C"],[/\\not\\kern\-0.3em\\times /g,"\u226D"],[/\\not</g,"\u226E"],[/\\not>/g,"\u226F"],[/\\not\\leq /g,"\u2270"],[/\\not\\geq /g,"\u2271"],[/\\lessequivlnt /g,"\u2272"],[/\\greaterequivlnt /g,"\u2273"],[/\\ElsevierGlyph\{2274\}/g,"\u2274"],[/\\ElsevierGlyph\{2275\}/g,"\u2275"],[/\\lessgtr /g,"\u2276"],[/\\gtrless /g,"\u2277"],[/\\notlessgreater /g,"\u2278"],[/\\notgreaterless /g,"\u2279"],[/\\prec /g,"\u227A"],[/\\succ /g,"\u227B"],[/\\preccurlyeq /g,"\u227C"],[/\\succcurlyeq /g,"\u227D"],[/\\precapprox /g,"\u227E"],[/\\NotPrecedesTilde /g,"\u227E-00338"],[/\\succapprox /g,"\u227F"],[/\\NotSucceedsTilde /g,"\u227F-00338"],[/\\not\\prec /g,"\u2280"],[/\\not\\succ /g,"\u2281"],[/\\subset /g,"\u2282"],[/\\supset /g,"\u2283"],[/\\not\\subset /g,"\u2284"],[/\\not\\supset /g,"\u2285"],[/\\subseteq /g,"\u2286"],[/\\supseteq /g,"\u2287"],[/\\not\\subseteq /g,"\u2288"],[/\\not\\supseteq /g,"\u2289"],[/\\subsetneq /g,"\u228A"],[/\\varsubsetneqq /g,"\u228A-0FE00"],[/\\supsetneq /g,"\u228B"],[/\\varsupsetneq /g,"\u228B-0FE00"],[/\\uplus /g,"\u228E"],[/\\sqsubset /g,"\u228F"],[/\\NotSquareSubset /g,"\u228F-00338"],[/\\sqsupset /g,"\u2290"],[/\\NotSquareSuperset /g,"\u2290-00338"],[/\\sqsubseteq /g,"\u2291"],[/\\sqsupseteq /g,"\u2292"],[/\\sqcap /g,"\u2293"],[/\\sqcup /g,"\u2294"],[/\\oplus /g,"\u2295"],[/\\ominus /g,"\u2296"],[/\\otimes /g,"\u2297"],[/\\oslash /g,"\u2298"],[/\\odot /g,"\u2299"],[/\\circledcirc /g,"\u229A"],[/\\circledast /g,"\u229B"],[/\\circleddash /g,"\u229D"],[/\\boxplus /g,"\u229E"],[/\\boxminus /g,"\u229F"],[/\\boxtimes /g,"\u22A0"],[/\\boxdot /g,"\u22A1"],[/\\vdash /g,"\u22A2"],[/\\dashv /g,"\u22A3"],[/\\top /g,"\u22A4"],[/\\perp /g,"\u22A5"],[/\\truestate /g,"\u22A7"],[/\\forcesextra /g,"\u22A8"],[/\\Vdash /g,"\u22A9"],[/\\Vvdash /g,"\u22AA"],[/\\VDash /g,"\u22AB"],[/\\nvdash /g,"\u22AC"],[/\\nvDash /g,"\u22AD"],[/\\nVdash /g,"\u22AE"],[/\\nVDash /g,"\u22AF"],[/\\vartriangleleft /g,"\u22B2"],[/\\vartriangleright /g,"\u22B3"],[/\\trianglelefteq /g,"\u22B4"],[/\\trianglerighteq /g,"\u22B5"],[/\\original /g,"\u22B6"],[/\\image /g,"\u22B7"],[/\\multimap /g,"\u22B8"],[/\\hermitconjmatrix /g,"\u22B9"],[/\\intercal /g,"\u22BA"],[/\\veebar /g,"\u22BB"],[/\\rightanglearc /g,"\u22BE"],[/\\ElsevierGlyph\{22C0\}/g,"\u22C0"],[/\\ElsevierGlyph\{22C1\}/g,"\u22C1"],[/\\bigcap /g,"\u22C2"],[/\\bigcup /g,"\u22C3"],[/\\diamond /g,"\u22C4"],[/\\cdot /g,"\u22C5"],[/\\star /g,"\u22C6"],[/\\divideontimes /g,"\u22C7"],[/\\bowtie /g,"\u22C8"],[/\\ltimes /g,"\u22C9"],[/\\rtimes /g,"\u22CA"],[/\\leftthreetimes /g,"\u22CB"],[/\\rightthreetimes /g,"\u22CC"],[/\\backsimeq /g,"\u22CD"],[/\\curlyvee /g,"\u22CE"],[/\\curlywedge /g,"\u22CF"],[/\\Subset /g,"\u22D0"],[/\\Supset /g,"\u22D1"],[/\\Cap /g,"\u22D2"],[/\\Cup /g,"\u22D3"],[/\\pitchfork /g,"\u22D4"],[/\\lessdot /g,"\u22D6"],[/\\gtrdot /g,"\u22D7"],[/\\verymuchless /g,"\u22D8"],[/\\verymuchgreater /g,"\u22D9"],[/\\lesseqgtr /g,"\u22DA"],[/\\gtreqless /g,"\u22DB"],[/\\curlyeqprec /g,"\u22DE"],[/\\curlyeqsucc /g,"\u22DF"],[/\\not\\sqsubseteq /g,"\u22E2"],[/\\not\\sqsupseteq /g,"\u22E3"],[/\\Elzsqspne /g,"\u22E5"],[/\\lnsim /g,"\u22E6"],[/\\gnsim /g,"\u22E7"],[/\\precedesnotsimilar /g,"\u22E8"],[/\\succnsim /g,"\u22E9"],[/\\ntriangleleft /g,"\u22EA"],[/\\ntriangleright /g,"\u22EB"],[/\\ntrianglelefteq /g,"\u22EC"],[/\\ntrianglerighteq /g,"\u22ED"],[/\\vdots /g,"\u22EE"],[/\\cdots /g,"\u22EF"],[/\\upslopeellipsis /g,"\u22F0"],[/\\downslopeellipsis /g,"\u22F1"],[/\\barwedge /g,"\u2305"],[/\\perspcorrespond /g,"\u2306"],[/\\lceil /g,"\u2308"],[/\\rceil /g,"\u2309"],[/\\lfloor /g,"\u230A"],[/\\rfloor /g,"\u230B"],[/\\recorder /g,"\u2315"],[/\\mathchar"2208/g,"\u2316"],[/\\ulcorner /g,"\u231C"],[/\\urcorner /g,"\u231D"],[/\\llcorner /g,"\u231E"],[/\\lrcorner /g,"\u231F"],[/\\frown /g,"\u2322"],[/\\smile /g,"\u2323"],[/\\langle /g,"\u2329"],[/\\rangle /g,"\u232A"],[/\\ElsevierGlyph\{E838\}/g,"\u233D"],[/\\Elzdlcorn /g,"\u23A3"],[/\\lmoustache /g,"\u23B0"],[/\\rmoustache /g,"\u23B1"],[/\\textvisiblespace /g,"\u2423"],[/\\ding\{172\}/g,"\u2460"],[/\\ding\{173\}/g,"\u2461"],[/\\ding\{174\}/g,"\u2462"],[/\\ding\{175\}/g,"\u2463"],[/\\ding\{176\}/g,"\u2464"],[/\\ding\{177\}/g,"\u2465"],[/\\ding\{178\}/g,"\u2466"],[/\\ding\{179\}/g,"\u2467"],[/\\ding\{180\}/g,"\u2468"],[/\\ding\{181\}/g,"\u2469"],[/\\circledS /g,"\u24C8"],[/\\Elzdshfnc /g,"\u2506"],[/\\Elzsqfnw /g,"\u2519"],[/\\diagup /g,"\u2571"],[/\\ding\{110\}/g,"\u25A0"],[/\\square /g,"\u25A1"],[/\\blacksquare /g,"\u25AA"],[/\\fbox\{~~\}/g,"\u25AD"],[/\\Elzvrecto /g,"\u25AF"],[/\\ElsevierGlyph\{E381\}/g,"\u25B1"],[/\\ding\{115\}/g,"\u25B2"],[/\\bigtriangleup /g,"\u25B3"],[/\\blacktriangle /g,"\u25B4"],[/\\vartriangle /g,"\u25B5"],[/\\blacktriangleright /g,"\u25B8"],[/\\triangleright /g,"\u25B9"],[/\\ding\{116\}/g,"\u25BC"],[/\\bigtriangledown /g,"\u25BD"],[/\\blacktriangledown /g,"\u25BE"],[/\\triangledown /g,"\u25BF"],[/\\blacktriangleleft /g,"\u25C2"],[/\\triangleleft /g,"\u25C3"],[/\\ding\{117\}/g,"\u25C6"],[/\\lozenge /g,"\u25CA"],[/\\bigcirc /g,"\u25CB"],[/\\ding\{108\}/g,"\u25CF"],[/\\Elzcirfl /g,"\u25D0"],[/\\Elzcirfr /g,"\u25D1"],[/\\Elzcirfb /g,"\u25D2"],[/\\ding\{119\}/g,"\u25D7"],[/\\Elzrvbull /g,"\u25D8"],[/\\Elzsqfl /g,"\u25E7"],[/\\Elzsqfr /g,"\u25E8"],[/\\Elzsqfse /g,"\u25EA"],[/\\bigcirc /g,"\u25EF"],[/\\ding\{72\}/g,"\u2605"],[/\\ding\{73\}/g,"\u2606"],[/\\ding\{37\}/g,"\u260E"],[/\\ding\{42\}/g,"\u261B"],[/\\ding\{43\}/g,"\u261E"],[/\\rightmoon /g,"\u263E"],[/\\mercury /g,"\u263F"],[/\\venus /g,"\u2640"],[/\\male /g,"\u2642"],[/\\jupiter /g,"\u2643"],[/\\saturn /g,"\u2644"],[/\\uranus /g,"\u2645"],[/\\neptune /g,"\u2646"],[/\\pluto /g,"\u2647"],[/\\aries /g,"\u2648"],[/\\taurus /g,"\u2649"],[/\\gemini /g,"\u264A"],[/\\cancer /g,"\u264B"],[/\\leo /g,"\u264C"],[/\\virgo /g,"\u264D"],[/\\libra /g,"\u264E"],[/\\scorpio /g,"\u264F"],[/\\sagittarius /g,"\u2650"],[/\\capricornus /g,"\u2651"],[/\\aquarius /g,"\u2652"],[/\\pisces /g,"\u2653"],[/\\ding\{171\}/g,"\u2660"],[/\\diamond /g,"\u2662"],[/\\ding\{168\}/g,"\u2663"],[/\\ding\{170\}/g,"\u2665"],[/\\ding\{169\}/g,"\u2666"],[/\\quarternote /g,"\u2669"],[/\\eighthnote /g,"\u266A"],[/\\flat /g,"\u266D"],[/\\natural /g,"\u266E"],[/\\sharp /g,"\u266F"],[/\\ding\{33\}/g,"\u2701"],[/\\ding\{34\}/g,"\u2702"],[/\\ding\{35\}/g,"\u2703"],[/\\ding\{36\}/g,"\u2704"],[/\\ding\{38\}/g,"\u2706"],[/\\ding\{39\}/g,"\u2707"],[/\\ding\{40\}/g,"\u2708"],[/\\ding\{41\}/g,"\u2709"],[/\\ding\{44\}/g,"\u270C"],[/\\ding\{45\}/g,"\u270D"],[/\\ding\{46\}/g,"\u270E"],[/\\ding\{47\}/g,"\u270F"],[/\\ding\{48\}/g,"\u2710"],[/\\ding\{49\}/g,"\u2711"],[/\\ding\{50\}/g,"\u2712"],[/\\ding\{51\}/g,"\u2713"],[/\\ding\{52\}/g,"\u2714"],[/\\ding\{53\}/g,"\u2715"],[/\\ding\{54\}/g,"\u2716"],[/\\ding\{55\}/g,"\u2717"],[/\\ding\{56\}/g,"\u2718"],[/\\ding\{57\}/g,"\u2719"],[/\\ding\{58\}/g,"\u271A"],[/\\ding\{59\}/g,"\u271B"],[/\\ding\{60\}/g,"\u271C"],[/\\ding\{61\}/g,"\u271D"],[/\\ding\{62\}/g,"\u271E"],[/\\ding\{63\}/g,"\u271F"],[/\\ding\{64\}/g,"\u2720"],[/\\ding\{65\}/g,"\u2721"],[/\\ding\{66\}/g,"\u2722"],[/\\ding\{67\}/g,"\u2723"],[/\\ding\{68\}/g,"\u2724"],[/\\ding\{69\}/g,"\u2725"],[/\\ding\{70\}/g,"\u2726"],[/\\ding\{71\}/g,"\u2727"],[/\\ding\{73\}/g,"\u2729"],[/\\ding\{74\}/g,"\u272A"],[/\\ding\{75\}/g,"\u272B"],[/\\ding\{76\}/g,"\u272C"],[/\\ding\{77\}/g,"\u272D"],[/\\ding\{78\}/g,"\u272E"],[/\\ding\{79\}/g,"\u272F"],[/\\ding\{80\}/g,"\u2730"],[/\\ding\{81\}/g,"\u2731"],[/\\ding\{82\}/g,"\u2732"],[/\\ding\{83\}/g,"\u2733"],[/\\ding\{84\}/g,"\u2734"],[/\\ding\{85\}/g,"\u2735"],[/\\ding\{86\}/g,"\u2736"],[/\\ding\{87\}/g,"\u2737"],[/\\ding\{88\}/g,"\u2738"],[/\\ding\{89\}/g,"\u2739"],[/\\ding\{90\}/g,"\u273A"],[/\\ding\{91\}/g,"\u273B"],[/\\ding\{92\}/g,"\u273C"],[/\\ding\{93\}/g,"\u273D"],[/\\ding\{94\}/g,"\u273E"],[/\\ding\{95\}/g,"\u273F"],[/\\ding\{96\}/g,"\u2740"],[/\\ding\{97\}/g,"\u2741"],[/\\ding\{98\}/g,"\u2742"],[/\\ding\{99\}/g,"\u2743"],[/\\ding\{100\}/g,"\u2744"],[/\\ding\{101\}/g,"\u2745"],[/\\ding\{102\}/g,"\u2746"],[/\\ding\{103\}/g,"\u2747"],[/\\ding\{104\}/g,"\u2748"],[/\\ding\{105\}/g,"\u2749"],[/\\ding\{106\}/g,"\u274A"],[/\\ding\{107\}/g,"\u274B"],[/\\ding\{109\}/g,"\u274D"],[/\\ding\{111\}/g,"\u274F"],[/\\ding\{112\}/g,"\u2750"],[/\\ding\{113\}/g,"\u2751"],[/\\ding\{114\}/g,"\u2752"],[/\\ding\{118\}/g,"\u2756"],[/\\ding\{120\}/g,"\u2758"],[/\\ding\{121\}/g,"\u2759"],[/\\ding\{122\}/g,"\u275A"],[/\\ding\{123\}/g,"\u275B"],[/\\ding\{124\}/g,"\u275C"],[/\\ding\{125\}/g,"\u275D"],[/\\ding\{126\}/g,"\u275E"],[/\\ding\{161\}/g,"\u2761"],[/\\ding\{162\}/g,"\u2762"],[/\\ding\{163\}/g,"\u2763"],[/\\ding\{164\}/g,"\u2764"],[/\\ding\{165\}/g,"\u2765"],[/\\ding\{166\}/g,"\u2766"],[/\\ding\{167\}/g,"\u2767"],[/\\ding\{182\}/g,"\u2776"],[/\\ding\{183\}/g,"\u2777"],[/\\ding\{184\}/g,"\u2778"],[/\\ding\{185\}/g,"\u2779"],[/\\ding\{186\}/g,"\u277A"],[/\\ding\{187\}/g,"\u277B"],[/\\ding\{188\}/g,"\u277C"],[/\\ding\{189\}/g,"\u277D"],[/\\ding\{190\}/g,"\u277E"],[/\\ding\{191\}/g,"\u277F"],[/\\ding\{192\}/g,"\u2780"],[/\\ding\{193\}/g,"\u2781"],[/\\ding\{194\}/g,"\u2782"],[/\\ding\{195\}/g,"\u2783"],[/\\ding\{196\}/g,"\u2784"],[/\\ding\{197\}/g,"\u2785"],[/\\ding\{198\}/g,"\u2786"],[/\\ding\{199\}/g,"\u2787"],[/\\ding\{200\}/g,"\u2788"],[/\\ding\{201\}/g,"\u2789"],[/\\ding\{202\}/g,"\u278A"],[/\\ding\{203\}/g,"\u278B"],[/\\ding\{204\}/g,"\u278C"],[/\\ding\{205\}/g,"\u278D"],[/\\ding\{206\}/g,"\u278E"],[/\\ding\{207\}/g,"\u278F"],[/\\ding\{208\}/g,"\u2790"],[/\\ding\{209\}/g,"\u2791"],[/\\ding\{210\}/g,"\u2792"],[/\\ding\{211\}/g,"\u2793"],[/\\ding\{212\}/g,"\u2794"],[/\\ding\{216\}/g,"\u2798"],[/\\ding\{217\}/g,"\u2799"],[/\\ding\{218\}/g,"\u279A"],[/\\ding\{219\}/g,"\u279B"],[/\\ding\{220\}/g,"\u279C"],[/\\ding\{221\}/g,"\u279D"],[/\\ding\{222\}/g,"\u279E"],[/\\ding\{223\}/g,"\u279F"],[/\\ding\{224\}/g,"\u27A0"],[/\\ding\{225\}/g,"\u27A1"],[/\\ding\{226\}/g,"\u27A2"],[/\\ding\{227\}/g,"\u27A3"],[/\\ding\{228\}/g,"\u27A4"],[/\\ding\{229\}/g,"\u27A5"],[/\\ding\{230\}/g,"\u27A6"],[/\\ding\{231\}/g,"\u27A7"],[/\\ding\{232\}/g,"\u27A8"],[/\\ding\{233\}/g,"\u27A9"],[/\\ding\{234\}/g,"\u27AA"],[/\\ding\{235\}/g,"\u27AB"],[/\\ding\{236\}/g,"\u27AC"],[/\\ding\{237\}/g,"\u27AD"],[/\\ding\{238\}/g,"\u27AE"],[/\\ding\{239\}/g,"\u27AF"],[/\\ding\{241\}/g,"\u27B1"],[/\\ding\{242\}/g,"\u27B2"],[/\\ding\{243\}/g,"\u27B3"],[/\\ding\{244\}/g,"\u27B4"],[/\\ding\{245\}/g,"\u27B5"],[/\\ding\{246\}/g,"\u27B6"],[/\\ding\{247\}/g,"\u27B7"],[/\\ding\{248\}/g,"\u27B8"],[/\\ding\{249\}/g,"\u27B9"],[/\\ding\{250\}/g,"\u27BA"],[/\\ding\{251\}/g,"\u27BB"],[/\\ding\{252\}/g,"\u27BC"],[/\\ding\{253\}/g,"\u27BD"],[/\\ding\{254\}/g,"\u27BE"],[/\\longleftarrow /g,"\u27F5"],[/\\longrightarrow /g,"\u27F6"],[/\\longleftrightarrow /g,"\u27F7"],[/\\Longleftarrow /g,"\u27F8"],[/\\Longrightarrow /g,"\u27F9"],[/\\Longleftrightarrow /g,"\u27FA"],[/\\longmapsto /g,"\u27FC"],[/\\sim\\joinrel\\leadsto/g,"\u27FF"],[/\\ElsevierGlyph\{E212\}/g,"\u2905"],[/\\UpArrowBar /g,"\u2912"],[/\\DownArrowBar /g,"\u2913"],[/\\ElsevierGlyph\{E20C\}/g,"\u2923"],[/\\ElsevierGlyph\{E20D\}/g,"\u2924"],[/\\ElsevierGlyph\{E20B\}/g,"\u2925"],[/\\ElsevierGlyph\{E20A\}/g,"\u2926"],[/\\ElsevierGlyph\{E211\}/g,"\u2927"],[/\\ElsevierGlyph\{E20E\}/g,"\u2928"],[/\\ElsevierGlyph\{E20F\}/g,"\u2929"],[/\\ElsevierGlyph\{E210\}/g,"\u292A"],[/\\ElsevierGlyph\{E21C\}/g,"\u2933"],[/\\ElsevierGlyph\{E21D\}/g,"\u2933-00338"],[/\\ElsevierGlyph\{E21A\}/g,"\u2936"],[/\\ElsevierGlyph\{E219\}/g,"\u2937"],[/\\Elolarr /g,"\u2940"],[/\\Elorarr /g,"\u2941"],[/\\ElzRlarr /g,"\u2942"],[/\\ElzrLarr /g,"\u2944"],[/\\Elzrarrx /g,"\u2947"],[/\\LeftRightVector /g,"\u294E"],[/\\RightUpDownVector /g,"\u294F"],[/\\DownLeftRightVector /g,"\u2950"],[/\\LeftUpDownVector /g,"\u2951"],[/\\LeftVectorBar /g,"\u2952"],[/\\RightVectorBar /g,"\u2953"],[/\\RightUpVectorBar /g,"\u2954"],[/\\RightDownVectorBar /g,"\u2955"],[/\\DownLeftVectorBar /g,"\u2956"],[/\\DownRightVectorBar /g,"\u2957"],[/\\LeftUpVectorBar /g,"\u2958"],[/\\LeftDownVectorBar /g,"\u2959"],[/\\LeftTeeVector /g,"\u295A"],[/\\RightTeeVector /g,"\u295B"],[/\\RightUpTeeVector /g,"\u295C"],[/\\RightDownTeeVector /g,"\u295D"],[/\\DownLeftTeeVector /g,"\u295E"],[/\\DownRightTeeVector /g,"\u295F"],[/\\LeftUpTeeVector /g,"\u2960"],[/\\LeftDownTeeVector /g,"\u2961"],[/\\UpEquilibrium /g,"\u296E"],[/\\ReverseUpEquilibrium /g,"\u296F"],[/\\RoundImplies /g,"\u2970"],[/\\ElsevierGlyph\{E214\}/g,"\u297C"],[/\\ElsevierGlyph\{E215\}/g,"\u297D"],[/\\Elztfnc /g,"\u2980"],[/\\ElsevierGlyph\{3018\}/g,"\u2985"],[/\\Elroang /g,"\u2986"],[/\\ElsevierGlyph\{E291\}/g,"\u2994"],[/\\Elzddfnc /g,"\u2999"],[/\\Angle /g,"\u299C"],[/\\Elzlpargt /g,"\u29A0"],[/\\ElsevierGlyph\{E260\}/g,"\u29B5"],[/\\ElsevierGlyph\{E61B\}/g,"\u29B6"],[/\\ElzLap /g,"\u29CA"],[/\\Elzdefas /g,"\u29CB"],[/\\LeftTriangleBar /g,"\u29CF"],[/\\NotLeftTriangleBar /g,"\u29CF-00338"],[/\\RightTriangleBar /g,"\u29D0"],[/\\NotRightTriangleBar /g,"\u29D0-00338"],[/\\ElsevierGlyph\{E372\}/g,"\u29DC"],[/\\blacklozenge /g,"\u29EB"],[/\\RuleDelayed /g,"\u29F4"],[/\\Elxuplus /g,"\u2A04"],[/\\ElzThr /g,"\u2A05"],[/\\Elxsqcup /g,"\u2A06"],[/\\ElzInf /g,"\u2A07"],[/\\ElzSup /g,"\u2A08"],[/\\ElzCint /g,"\u2A0D"],[/\\clockoint /g,"\u2A0F"],[/\\ElsevierGlyph\{E395\}/g,"\u2A10"],[/\\sqrint /g,"\u2A16"],[/\\ElsevierGlyph\{E25A\}/g,"\u2A25"],[/\\ElsevierGlyph\{E25B\}/g,"\u2A2A"],[/\\ElsevierGlyph\{E25C\}/g,"\u2A2D"],[/\\ElsevierGlyph\{E25D\}/g,"\u2A2E"],[/\\ElzTimes /g,"\u2A2F"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A34"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A35"],[/\\ElsevierGlyph\{E259\}/g,"\u2A3C"],[/\\amalg /g,"\u2A3F"],[/\\ElzAnd /g,"\u2A53"],[/\\ElzOr /g,"\u2A54"],[/\\ElsevierGlyph\{E36E\}/g,"\u2A55"],[/\\ElOr /g,"\u2A56"],[/\\perspcorrespond /g,"\u2A5E"],[/\\Elzminhat /g,"\u2A5F"],[/\\ElsevierGlyph\{225A\}/g,"\u2A63"],[/\\stackrel\{*\}\{=\}/g,"\u2A6E"],[/\\Equal /g,"\u2A75"],[/\\leqslant /g,"\u2A7D"],[/\\nleqslant /g,"\u2A7D-00338"],[/\\geqslant /g,"\u2A7E"],[/\\ngeqslant /g,"\u2A7E-00338"],[/\\lessapprox /g,"\u2A85"],[/\\gtrapprox /g,"\u2A86"],[/\\lneq /g,"\u2A87"],[/\\gneq /g,"\u2A88"],[/\\lnapprox /g,"\u2A89"],[/\\gnapprox /g,"\u2A8A"],[/\\lesseqqgtr /g,"\u2A8B"],[/\\gtreqqless /g,"\u2A8C"],[/\\eqslantless /g,"\u2A95"],[/\\eqslantgtr /g,"\u2A96"],[/\\Pisymbol\{ppi020\}\{117\}/g,"\u2A9D"],[/\\Pisymbol\{ppi020\}\{105\}/g,"\u2A9E"],[/\\NestedLessLess /g,"\u2AA1"],[/\\NotNestedLessLess /g,"\u2AA1-00338"],[/\\NestedGreaterGreater /g,"\u2AA2"],[/\\NotNestedGreaterGreater /g,"\u2AA2-00338"],[/\\preceq /g,"\u2AAF"],[/\\not\\preceq /g,"\u2AAF-00338"],[/\\succeq /g,"\u2AB0"],[/\\not\\succeq /g,"\u2AB0-00338"],[/\\precneqq /g,"\u2AB5"],[/\\succneqq /g,"\u2AB6"],[/\\precapprox /g,"\u2AB7"],[/\\succapprox /g,"\u2AB8"],[/\\precnapprox /g,"\u2AB9"],[/\\succnapprox /g,"\u2ABA"],[/\\subseteqq /g,"\u2AC5"],[/\\nsubseteqq /g,"\u2AC5-00338"],[/\\supseteqq /g,"\u2AC6"],[/\\nsupseteqq/g,"\u2AC6-00338"],[/\\subsetneqq /g,"\u2ACB"],[/\\supsetneqq /g,"\u2ACC"],[/\\ElsevierGlyph\{E30D\}/g,"\u2AEB"],[/\\Elztdcol /g,"\u2AF6"],[/\\ElsevierGlyph\{300A\}/g,"\u300A"],[/\\ElsevierGlyph\{300B\}/g,"\u300B"],[/\\ElsevierGlyph\{3018\}/g,"\u3018"],[/\\ElsevierGlyph\{3019\}/g,"\u3019"],[/\\openbracketleft /g,"\u301A"],[/\\openbracketright /g,"\u301B"]];return this}if(typeof module!=="undefined"&&module.exports){module.exports=BibtexParser};
\ No newline at end of file
+function BibtexParser(c){if(typeof c=="string"){var d={};var a=[];function b(f){a.push(f)}var e=BibtexParser.call(d,b);e.parse(c);return{entries:a,errors:e.getErrors()}}if(typeof c!="function"){throw"Invalid parser construction."}this.STATES_={ENTRY_OR_JUNK:0,OBJECT_TYPE:1,ENTRY_KEY:2,KV_KEY:3,EQUALS:4,KV_VALUE:5};this.DATA_={};this.CALLBACK_=c;this.CHAR_=0;this.LINE_=1;this.CHAR_IN_LINE_=0;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={};this.SKIPTILLEOL_=false;this.VALBRACES_=null;this.BRACETYPE_=null;this.BRACECOUNT_=0;this.STATE_=this.STATES_.ENTRY_OR_JUNK;this.ERRORS_=[];this.ENTRY_TYPES_={inproceedings:1,proceedings:2,article:3,techreport:4,misc:5,mastersthesis:6,book:7,phdthesis:8,incollection:9,unpublished:10,inbook:11,manual:12,periodical:13,booklet:14,masterthesis:15,conference:16,data:999};this.MACROS_={jan:"January",feb:"February",mar:"March",apr:"April",may:"May",jun:"June",jul:"July",aug:"August",sep:"September",oct:"October",nov:"November",dec:"December",Jan:"January",Feb:"February",Mar:"March",Apr:"April",May:"May",Jun:"June",Jul:"July",Aug:"August",Sep:"September",Oct:"October",Nov:"November",Dec:"December"};this.getErrors=function(){return this.ERRORS_};this.parse=function(f){for(var g=0;g<f.length;g++){this.processCharacter_(f[g])}};this.error_=function(f){this.ERRORS_.push([this.LINE_,this.CHAR_IN_LINE_,this.CHAR_,f])};this.processEntry_=function(){var h=this.DATA_;if(h.Fields){for(var k in h.Fields){var p=h.Fields[k];for(var j=0;j<this.CHARCONV_.length;j++){var q=this.CHARCONV_[j][0];var n=this.CHARCONV_[j][1];p=p.replace(q,n)}p=p.replace(/[\n\r\t]/g," ").replace(/\s\s+/g," ").replace(/^\s+|\s+$/g,"");var l=p.length;var g="";for(var j=0;j<l;j++){var m=p[j];var o=false;if(m=="\\"&&j<l-1){m=p[++j]}else{if(m=="{"||m=="}"){o=true}}if(!o){g+=m}}h.Fields[k]=g}}if(h.ObjectType=="string"){for(var k in h.Fields){this.MACROS_[k]=h.Fields[k]}}else{this.CALLBACK_(h)}};this.processCharacter_=function(l){this.CHAR_++;this.CHAR_IN_LINE_++;if(l=="\n"){this.LINE_++;this.CHAR_IN_LINE_=1}if(this.SKIPTILLEOL_){if(l=="\n"){this.SKIPTILLEOL_=false}return}if(this.SKIPCOMMENT_&&l=="%"){this.SKIPTILLEOL_=true;return}if(this.SKIPWS_&&/\s/.test(l)){return}this.SKIPWS_=false;this.SKIPCOMMENT_=false;this.SKIPTILLEOL_=false;var f=true;while(f){f=false;switch(this.STATE_){case this.STATES_.ENTRY_OR_JUNK:if(l=="@"){this.STATE_=this.STATES_.OBJECT_TYPE;this.DATA_={ObjectType:""}}this.BRACETYPE_=null;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break;case this.STATES_.OBJECT_TYPE:if(/[A-Za-z]/.test(l)){this.DATA_.ObjectType+=l.toLowerCase();this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{var i=this.DATA_.ObjectType;if(i=="comment"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i=="string"){this.DATA_.ObjectType=i;this.DATA_.Fields={};this.BRACETYPE_=l;this.BRACECOUNT_=1;this.STATE_=this.STATES_.KV_KEY;this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.PARSETMP_={Key:""}}else{if(i=="preamble"){this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{if(i in this.ENTRY_TYPES_){this.DATA_.ObjectType="entry";this.DATA_.EntryType=i;this.DATA_.EntryKey="";this.STATE_=this.STATES_.ENTRY_KEY;f=true}else{this.error_('Unrecognized object type: "'+this.DATA_.ObjectType+'"');this.STATE_=this.STATES_.ENTRY_OR_JUNK}}}}}break;case this.STATES_.ENTRY_KEY:if((l==="{"||l==="(")&&this.BRACETYPE_==null){this.BRACETYPE_=l;this.BRACECOUNT_=1;this.SKIPWS_=true;this.SKIPCOMMENT_=true;break}if(/[,%\s]/.test(l)){if(this.DATA_.EntryKey.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{if(this.BRACETYPE_==null){this.error_("No opening brace for object.");this.STATE_=this.STATES_.ENTRY_OR_JUNK}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;f=true;this.STATE_=this.STATES_.KV_KEY;this.PARSETMP_.Key="";this.DATA_.Fields={}}}}else{this.DATA_.EntryKey+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}break;case this.STATES_.KV_KEY:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(/[\-A-Za-z:]/.test(l)){this.PARSETMP_.Key+=l;this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{if(this.PARSETMP_.Key.length<1){this.SKIPWS_=true;this.SKIPCOMMENT_=true}else{this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.EQUALS;f=true}}break;case this.STATES_.EQUALS:if((l=="}"&&this.BRACETYPE_=="{")||(l==")"&&this.BRACETYPE_=="(")){this.error_('Key-value pair has key "'+this.PARSETMP_.Key+'", but no value.');this.processEntry_();this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.ENTRY_OR_JUNK;break}if(l=="="){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_VALUE;this.PARSETMP_.Value="";this.VALBRACES_={'"':[],"{":[]}}break;case this.STATES_.KV_VALUE:var k=this.VALBRACES_;var j=this.PARSETMP_.Value;var h=false;if(l=='"'||l=="{"||l=="}"||l==","){if(l==","){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}h=true}}if(l=='"'){if(0===k['"'].length+k["{"].length){k['"'].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false;break}if(k['"'].length==1&&k["{"].length==0&&(j.length==0||j[j.length-1]!="\\")){h=true}else{}}if(l=="{"){if(j.length==0||j[j.length-1]!="\\"){k["{"].push(this.CHAR_);this.SKIPWS_=false;this.SKIPCOMMENT_=false}else{}}if(l=="}"){if(0===k['"'].length+k["{"].length){var g=this.PARSETMP_.Value.trim();if(g in this.MACROS_){this.PARSETMP_.Value=this.MACROS_[g]}else{this.error_("Reference to an undefined macro: "+g)}f=true;h=true}else{if(j.length==0||j[j.length-1]!="\\"){if(k["{"].length>0){k["{"].splice(k["{"].length-1,1);if(0==k["{"].length+k['"'].length){h=true}else{}}}else{}}}}if(h){this.SKIPWS_=true;this.SKIPCOMMENT_=true;this.STATE_=this.STATES_.KV_KEY;this.DATA_.Fields[this.PARSETMP_.Key]=this.PARSETMP_.Value;this.PARSETMP_={Key:""};this.VALBRACES_=null}else{this.PARSETMP_.Value+=l}break}}};this.CHARCONV_=[[/\\space /g,"\u0020"],[/\\textdollar /g,"\u0024"],[/\\textquotesingle /g,"\u0027"],[/\\ast /g,"\u002A"],[/\\textbackslash /g,"\u005C"],[/\\\^\{\}/g,"\u005E"],[/\\textasciigrave /g,"\u0060"],[/\\lbrace /g,"\u007B"],[/\\vert /g,"\u007C"],[/\\rbrace /g,"\u007D"],[/\\textasciitilde /g,"\u007E"],[/\\textexclamdown /g,"\u00A1"],[/\\textcent /g,"\u00A2"],[/\\textsterling /g,"\u00A3"],[/\\textcurrency /g,"\u00A4"],[/\\textyen /g,"\u00A5"],[/\\textbrokenbar /g,"\u00A6"],[/\\textsection /g,"\u00A7"],[/\\textasciidieresis /g,"\u00A8"],[/\\textcopyright /g,"\u00A9"],[/\\textordfeminine /g,"\u00AA"],[/\\guillemotleft /g,"\u00AB"],[/\\lnot /g,"\u00AC"],[/\\textregistered /g,"\u00AE"],[/\\textasciimacron /g,"\u00AF"],[/\\textdegree /g,"\u00B0"],[/\\pm /g,"\u00B1"],[/\\textasciiacute /g,"\u00B4"],[/\\mathrm\{\\mu\}/g,"\u00B5"],[/\\textparagraph /g,"\u00B6"],[/\\cdot /g,"\u00B7"],[/\\c\{\}/g,"\u00B8"],[/\\textordmasculine /g,"\u00BA"],[/\\guillemotright /g,"\u00BB"],[/\\textonequarter /g,"\u00BC"],[/\\textonehalf /g,"\u00BD"],[/\\textthreequarters /g,"\u00BE"],[/\\textquestiondown /g,"\u00BF"],[/\\`\{A\}/g,"\u00C0"],[/\\'\{A\}/g,"\u00C1"],[/\\\^\{A\}/g,"\u00C2"],[/\\~\{A\}/g,"\u00C3"],[/\\"\{A\}/g,"\u00C4"],[/\\AA /g,"\u00C5"],[/\\AE /g,"\u00C6"],[/\\c\{C\}/g,"\u00C7"],[/\\`\{E\}/g,"\u00C8"],[/\\'\{E\}/g,"\u00C9"],[/\\\^\{E\}/g,"\u00CA"],[/\\"\{E\}/g,"\u00CB"],[/\\`\{I\}/g,"\u00CC"],[/\\'\{I\}/g,"\u00CD"],[/\\\^\{I\}/g,"\u00CE"],[/\\"\{I\}/g,"\u00CF"],[/\\DH /g,"\u00D0"],[/\\~\{N\}/g,"\u00D1"],[/\\`\{O\}/g,"\u00D2"],[/\\'\{O\}/g,"\u00D3"],[/\\\^\{O\}/g,"\u00D4"],[/\\~\{O\}/g,"\u00D5"],[/\\"\{O\}/g,"\u00D6"],[/\\texttimes /g,"\u00D7"],[/\\O /g,"\u00D8"],[/\\`\{U\}/g,"\u00D9"],[/\\'\{U\}/g,"\u00DA"],[/\\\^\{U\}/g,"\u00DB"],[/\\"\{U\}/g,"\u00DC"],[/\\'\{Y\}/g,"\u00DD"],[/\\TH /g,"\u00DE"],[/\\ss /g,"\u00DF"],[/\\`\{a\}/g,"\u00E0"],[/\\'\{a\}/g,"\u00E1"],[/\\\^\{a\}/g,"\u00E2"],[/\\~\{a\}/g,"\u00E3"],[/\\"\{a\}/g,"\u00E4"],[/\\aa /g,"\u00E5"],[/\\ae /g,"\u00E6"],[/\\c\{c\}/g,"\u00E7"],[/\\`\{e\}/g,"\u00E8"],[/\\'\{e\}/g,"\u00E9"],[/\\\^\{e\}/g,"\u00EA"],[/\\"\{e\}/g,"\u00EB"],[/\\`\{\\i\}/g,"\u00EC"],[/\\'\{\\i\}/g,"\u00ED"],[/\\\^\{\\i\}/g,"\u00EE"],[/\\"\{\\i\}/g,"\u00EF"],[/\\dh /g,"\u00F0"],[/\\~\{n\}/g,"\u00F1"],[/\\`\{o\}/g,"\u00F2"],[/\\'\{o\}/g,"\u00F3"],[/\\\^\{o\}/g,"\u00F4"],[/\\~\{o\}/g,"\u00F5"],[/\\"\{o\}/g,"\u00F6"],[/\\div /g,"\u00F7"],[/\\o /g,"\u00F8"],[/\\`\{u\}/g,"\u00F9"],[/\\'\{u\}/g,"\u00FA"],[/\\\^\{u\}/g,"\u00FB"],[/\\"\{u\}/g,"\u00FC"],[/\\'\{y\}/g,"\u00FD"],[/\\th /g,"\u00FE"],[/\\"\{y\}/g,"\u00FF"],[/\\=\{A\}/g,"\u0100"],[/\\=\{a\}/g,"\u0101"],[/\\u\{A\}/g,"\u0102"],[/\\u\{a\}/g,"\u0103"],[/\\k\{A\}/g,"\u0104"],[/\\k\{a\}/g,"\u0105"],[/\\'\{C\}/g,"\u0106"],[/\\'\{c\}/g,"\u0107"],[/\\\^\{C\}/g,"\u0108"],[/\\\^\{c\}/g,"\u0109"],[/\\.\{C\}/g,"\u010A"],[/\\.\{c\}/g,"\u010B"],[/\\v\{C\}/g,"\u010C"],[/\\v\{c\}/g,"\u010D"],[/\\v\{D\}/g,"\u010E"],[/\\v\{d\}/g,"\u010F"],[/\\DJ /g,"\u0110"],[/\\dj /g,"\u0111"],[/\\=\{E\}/g,"\u0112"],[/\\=\{e\}/g,"\u0113"],[/\\u\{E\}/g,"\u0114"],[/\\u\{e\}/g,"\u0115"],[/\\.\{E\}/g,"\u0116"],[/\\.\{e\}/g,"\u0117"],[/\\k\{E\}/g,"\u0118"],[/\\k\{e\}/g,"\u0119"],[/\\v\{E\}/g,"\u011A"],[/\\v\{e\}/g,"\u011B"],[/\\\^\{G\}/g,"\u011C"],[/\\\^\{g\}/g,"\u011D"],[/\\u\{G\}/g,"\u011E"],[/\\u\{g\}/g,"\u011F"],[/\\.\{G\}/g,"\u0120"],[/\\.\{g\}/g,"\u0121"],[/\\c\{G\}/g,"\u0122"],[/\\c\{g\}/g,"\u0123"],[/\\\^\{H\}/g,"\u0124"],[/\\\^\{h\}/g,"\u0125"],[/\\Elzxh /g,"\u0127"],[/\\~\{I\}/g,"\u0128"],[/\\~\{\\i\}/g,"\u0129"],[/\\=\{I\}/g,"\u012A"],[/\\=\{\\i\}/g,"\u012B"],[/\\u\{I\}/g,"\u012C"],[/\\u\{\\i\}/g,"\u012D"],[/\\k\{I\}/g,"\u012E"],[/\\k\{i\}/g,"\u012F"],[/\\.\{I\}/g,"\u0130"],[/\\i /g,"\u0131"],[/\\\^\{J\}/g,"\u0134"],[/\\\^\{\\j\}/g,"\u0135"],[/\\c\{K\}/g,"\u0136"],[/\\c\{k\}/g,"\u0137"],[/\\'\{L\}/g,"\u0139"],[/\\'\{l\}/g,"\u013A"],[/\\c\{L\}/g,"\u013B"],[/\\c\{l\}/g,"\u013C"],[/\\v\{L\}/g,"\u013D"],[/\\v\{l\}/g,"\u013E"],[/\\L /g,"\u0141"],[/\\l /g,"\u0142"],[/\\'\{N\}/g,"\u0143"],[/\\'\{n\}/g,"\u0144"],[/\\c\{N\}/g,"\u0145"],[/\\c\{n\}/g,"\u0146"],[/\\v\{N\}/g,"\u0147"],[/\\v\{n\}/g,"\u0148"],[/\\NG /g,"\u014A"],[/\\ng /g,"\u014B"],[/\\=\{O\}/g,"\u014C"],[/\\=\{o\}/g,"\u014D"],[/\\u\{O\}/g,"\u014E"],[/\\u\{o\}/g,"\u014F"],[/\\H\{O\}/g,"\u0150"],[/\\H\{o\}/g,"\u0151"],[/\\OE /g,"\u0152"],[/\\oe /g,"\u0153"],[/\\'\{R\}/g,"\u0154"],[/\\'\{r\}/g,"\u0155"],[/\\c\{R\}/g,"\u0156"],[/\\c\{r\}/g,"\u0157"],[/\\v\{R\}/g,"\u0158"],[/\\v\{r\}/g,"\u0159"],[/\\'\{S\}/g,"\u015A"],[/\\'\{s\}/g,"\u015B"],[/\\\^\{S\}/g,"\u015C"],[/\\\^\{s\}/g,"\u015D"],[/\\c\{S\}/g,"\u015E"],[/\\c\{s\}/g,"\u015F"],[/\\v\{S\}/g,"\u0160"],[/\\v\{s\}/g,"\u0161"],[/\\c\{T\}/g,"\u0162"],[/\\c\{t\}/g,"\u0163"],[/\\v\{T\}/g,"\u0164"],[/\\v\{t\}/g,"\u0165"],[/\\~\{U\}/g,"\u0168"],[/\\~\{u\}/g,"\u0169"],[/\\=\{U\}/g,"\u016A"],[/\\=\{u\}/g,"\u016B"],[/\\u\{U\}/g,"\u016C"],[/\\u\{u\}/g,"\u016D"],[/\\r\{U\}/g,"\u016E"],[/\\r\{u\}/g,"\u016F"],[/\\H\{U\}/g,"\u0170"],[/\\H\{u\}/g,"\u0171"],[/\\k\{U\}/g,"\u0172"],[/\\k\{u\}/g,"\u0173"],[/\\\^\{W\}/g,"\u0174"],[/\\\^\{w\}/g,"\u0175"],[/\\\^\{Y\}/g,"\u0176"],[/\\\^\{y\}/g,"\u0177"],[/\\"\{Y\}/g,"\u0178"],[/\\'\{Z\}/g,"\u0179"],[/\\'\{z\}/g,"\u017A"],[/\\.\{Z\}/g,"\u017B"],[/\\.\{z\}/g,"\u017C"],[/\\v\{Z\}/g,"\u017D"],[/\\v\{z\}/g,"\u017E"],[/\\texthvlig /g,"\u0195"],[/\\textnrleg /g,"\u019E"],[/\\eth /g,"\u01AA"],[/\\textdoublepipe /g,"\u01C2"],[/\\'\{g\}/g,"\u01F5"],[/\\Elztrna /g,"\u0250"],[/\\Elztrnsa /g,"\u0252"],[/\\Elzopeno /g,"\u0254"],[/\\Elzrtld /g,"\u0256"],[/\\Elzschwa /g,"\u0259"],[/\\varepsilon /g,"\u025B"],[/\\Elzpgamma /g,"\u0263"],[/\\Elzpbgam /g,"\u0264"],[/\\Elztrnh /g,"\u0265"],[/\\Elzbtdl /g,"\u026C"],[/\\Elzrtll /g,"\u026D"],[/\\Elztrnm /g,"\u026F"],[/\\Elztrnmlr /g,"\u0270"],[/\\Elzltlmr /g,"\u0271"],[/\\Elzltln /g,"\u0272"],[/\\Elzrtln /g,"\u0273"],[/\\Elzclomeg /g,"\u0277"],[/\\textphi /g,"\u0278"],[/\\Elztrnr /g,"\u0279"],[/\\Elztrnrl /g,"\u027A"],[/\\Elzrttrnr /g,"\u027B"],[/\\Elzrl /g,"\u027C"],[/\\Elzrtlr /g,"\u027D"],[/\\Elzfhr /g,"\u027E"],[/\\Elzrtls /g,"\u0282"],[/\\Elzesh /g,"\u0283"],[/\\Elztrnt /g,"\u0287"],[/\\Elzrtlt /g,"\u0288"],[/\\Elzpupsil /g,"\u028A"],[/\\Elzpscrv /g,"\u028B"],[/\\Elzinvv /g,"\u028C"],[/\\Elzinvw /g,"\u028D"],[/\\Elztrny /g,"\u028E"],[/\\Elzrtlz /g,"\u0290"],[/\\Elzyogh /g,"\u0292"],[/\\Elzglst /g,"\u0294"],[/\\Elzreglst /g,"\u0295"],[/\\Elzinglst /g,"\u0296"],[/\\textturnk /g,"\u029E"],[/\\Elzdyogh /g,"\u02A4"],[/\\Elztesh /g,"\u02A7"],[/\\textasciicaron /g,"\u02C7"],[/\\Elzverts /g,"\u02C8"],[/\\Elzverti /g,"\u02CC"],[/\\Elzlmrk /g,"\u02D0"],[/\\Elzhlmrk /g,"\u02D1"],[/\\Elzsbrhr /g,"\u02D2"],[/\\Elzsblhr /g,"\u02D3"],[/\\Elzrais /g,"\u02D4"],[/\\Elzlow /g,"\u02D5"],[/\\textasciibreve /g,"\u02D8"],[/\\textperiodcentered /g,"\u02D9"],[/\\r\{\}/g,"\u02DA"],[/\\k\{\}/g,"\u02DB"],[/\\texttildelow /g,"\u02DC"],[/\\H\{\}/g,"\u02DD"],[/\\tone\{55\}/g,"\u02E5"],[/\\tone\{44\}/g,"\u02E6"],[/\\tone\{33\}/g,"\u02E7"],[/\\tone\{22\}/g,"\u02E8"],[/\\tone\{11\}/g,"\u02E9"],[/\\cyrchar\\C/g,"\u030F"],[/\\Elzpalh /g,"\u0321"],[/\\Elzrh /g,"\u0322"],[/\\Elzsbbrg /g,"\u032A"],[/\\Elzxl /g,"\u0335"],[/\\Elzbar /g,"\u0336"],[/\\'\{A\}/g,"\u0386"],[/\\'\{E\}/g,"\u0388"],[/\\'\{H\}/g,"\u0389"],[/\\'\{\}\{I\}/g,"\u038A"],[/\\'\{\}O/g,"\u038C"],[/\\mathrm\{'Y\}/g,"\u038E"],[/\\mathrm\{'\\Omega\}/g,"\u038F"],[/\\acute\{\\ddot\{\\iota\}\}/g,"\u0390"],[/\\Alpha /g,"\u0391"],[/\\Beta /g,"\u0392"],[/\\Gamma /g,"\u0393"],[/\\Delta /g,"\u0394"],[/\\Epsilon /g,"\u0395"],[/\\Zeta /g,"\u0396"],[/\\Eta /g,"\u0397"],[/\\Theta /g,"\u0398"],[/\\Iota /g,"\u0399"],[/\\Kappa /g,"\u039A"],[/\\Lambda /g,"\u039B"],[/\\Xi /g,"\u039E"],[/\\Pi /g,"\u03A0"],[/\\Rho /g,"\u03A1"],[/\\Sigma /g,"\u03A3"],[/\\Tau /g,"\u03A4"],[/\\Upsilon /g,"\u03A5"],[/\\Phi /g,"\u03A6"],[/\\Chi /g,"\u03A7"],[/\\Psi /g,"\u03A8"],[/\\Omega /g,"\u03A9"],[/\\mathrm\{\\ddot\{I\}\}/g,"\u03AA"],[/\\mathrm\{\\ddot\{Y\}\}/g,"\u03AB"],[/\\'\{\$\\alpha\$\}/g,"\u03AC"],[/\\acute\{\\epsilon\}/g,"\u03AD"],[/\\acute\{\\eta\}/g,"\u03AE"],[/\\acute\{\\iota\}/g,"\u03AF"],[/\\acute\{\\ddot\{\\upsilon\}\}/g,"\u03B0"],[/\\alpha /g,"\u03B1"],[/\\beta /g,"\u03B2"],[/\\gamma /g,"\u03B3"],[/\\delta /g,"\u03B4"],[/\\epsilon /g,"\u03B5"],[/\\zeta /g,"\u03B6"],[/\\eta /g,"\u03B7"],[/\\texttheta /g,"\u03B8"],[/\\iota /g,"\u03B9"],[/\\kappa /g,"\u03BA"],[/\\lambda /g,"\u03BB"],[/\\mu /g,"\u03BC"],[/\\nu /g,"\u03BD"],[/\\xi /g,"\u03BE"],[/\\pi /g,"\u03C0"],[/\\rho /g,"\u03C1"],[/\\varsigma /g,"\u03C2"],[/\\sigma /g,"\u03C3"],[/\\tau /g,"\u03C4"],[/\\upsilon /g,"\u03C5"],[/\\varphi /g,"\u03C6"],[/\\chi /g,"\u03C7"],[/\\psi /g,"\u03C8"],[/\\omega /g,"\u03C9"],[/\\ddot\{\\iota\}/g,"\u03CA"],[/\\ddot\{\\upsilon\}/g,"\u03CB"],[/\\'\{o\}/g,"\u03CC"],[/\\acute\{\\upsilon\}/g,"\u03CD"],[/\\acute\{\\omega\}/g,"\u03CE"],[/\\Pisymbol\{ppi022\}\{87\}/g,"\u03D0"],[/\\textvartheta /g,"\u03D1"],[/\\Upsilon /g,"\u03D2"],[/\\phi /g,"\u03D5"],[/\\varpi /g,"\u03D6"],[/\\Stigma /g,"\u03DA"],[/\\Digamma /g,"\u03DC"],[/\\digamma /g,"\u03DD"],[/\\Koppa /g,"\u03DE"],[/\\Sampi /g,"\u03E0"],[/\\varkappa /g,"\u03F0"],[/\\varrho /g,"\u03F1"],[/\\textTheta /g,"\u03F4"],[/\\backepsilon /g,"\u03F6"],[/\\cyrchar\\CYRYO /g,"\u0401"],[/\\cyrchar\\CYRDJE /g,"\u0402"],[/\\cyrchar\{\\'\\CYRG\}/g,"\u0403"],[/\\cyrchar\\CYRIE /g,"\u0404"],[/\\cyrchar\\CYRDZE /g,"\u0405"],[/\\cyrchar\\CYRII /g,"\u0406"],[/\\cyrchar\\CYRYI /g,"\u0407"],[/\\cyrchar\\CYRJE /g,"\u0408"],[/\\cyrchar\\CYRLJE /g,"\u0409"],[/\\cyrchar\\CYRNJE /g,"\u040A"],[/\\cyrchar\\CYRTSHE /g,"\u040B"],[/\\cyrchar\{\\'\\CYRK\}/g,"\u040C"],[/\\cyrchar\\CYRUSHRT /g,"\u040E"],[/\\cyrchar\\CYRDZHE /g,"\u040F"],[/\\cyrchar\\CYRA /g,"\u0410"],[/\\cyrchar\\CYRB /g,"\u0411"],[/\\cyrchar\\CYRV /g,"\u0412"],[/\\cyrchar\\CYRG /g,"\u0413"],[/\\cyrchar\\CYRD /g,"\u0414"],[/\\cyrchar\\CYRE /g,"\u0415"],[/\\cyrchar\\CYRZH /g,"\u0416"],[/\\cyrchar\\CYRZ /g,"\u0417"],[/\\cyrchar\\CYRI /g,"\u0418"],[/\\cyrchar\\CYRISHRT /g,"\u0419"],[/\\cyrchar\\CYRK /g,"\u041A"],[/\\cyrchar\\CYRL /g,"\u041B"],[/\\cyrchar\\CYRM /g,"\u041C"],[/\\cyrchar\\CYRN /g,"\u041D"],[/\\cyrchar\\CYRO /g,"\u041E"],[/\\cyrchar\\CYRP /g,"\u041F"],[/\\cyrchar\\CYRR /g,"\u0420"],[/\\cyrchar\\CYRS /g,"\u0421"],[/\\cyrchar\\CYRT /g,"\u0422"],[/\\cyrchar\\CYRU /g,"\u0423"],[/\\cyrchar\\CYRF /g,"\u0424"],[/\\cyrchar\\CYRH /g,"\u0425"],[/\\cyrchar\\CYRC /g,"\u0426"],[/\\cyrchar\\CYRCH /g,"\u0427"],[/\\cyrchar\\CYRSH /g,"\u0428"],[/\\cyrchar\\CYRSHCH /g,"\u0429"],[/\\cyrchar\\CYRHRDSN /g,"\u042A"],[/\\cyrchar\\CYRERY /g,"\u042B"],[/\\cyrchar\\CYRSFTSN /g,"\u042C"],[/\\cyrchar\\CYREREV /g,"\u042D"],[/\\cyrchar\\CYRYU /g,"\u042E"],[/\\cyrchar\\CYRYA /g,"\u042F"],[/\\cyrchar\\cyra /g,"\u0430"],[/\\cyrchar\\cyrb /g,"\u0431"],[/\\cyrchar\\cyrv /g,"\u0432"],[/\\cyrchar\\cyrg /g,"\u0433"],[/\\cyrchar\\cyrd /g,"\u0434"],[/\\cyrchar\\cyre /g,"\u0435"],[/\\cyrchar\\cyrzh /g,"\u0436"],[/\\cyrchar\\cyrz /g,"\u0437"],[/\\cyrchar\\cyri /g,"\u0438"],[/\\cyrchar\\cyrishrt /g,"\u0439"],[/\\cyrchar\\cyrk /g,"\u043A"],[/\\cyrchar\\cyrl /g,"\u043B"],[/\\cyrchar\\cyrm /g,"\u043C"],[/\\cyrchar\\cyrn /g,"\u043D"],[/\\cyrchar\\cyro /g,"\u043E"],[/\\cyrchar\\cyrp /g,"\u043F"],[/\\cyrchar\\cyrr /g,"\u0440"],[/\\cyrchar\\cyrs /g,"\u0441"],[/\\cyrchar\\cyrt /g,"\u0442"],[/\\cyrchar\\cyru /g,"\u0443"],[/\\cyrchar\\cyrf /g,"\u0444"],[/\\cyrchar\\cyrh /g,"\u0445"],[/\\cyrchar\\cyrc /g,"\u0446"],[/\\cyrchar\\cyrch /g,"\u0447"],[/\\cyrchar\\cyrsh /g,"\u0448"],[/\\cyrchar\\cyrshch /g,"\u0449"],[/\\cyrchar\\cyrhrdsn /g,"\u044A"],[/\\cyrchar\\cyrery /g,"\u044B"],[/\\cyrchar\\cyrsftsn /g,"\u044C"],[/\\cyrchar\\cyrerev /g,"\u044D"],[/\\cyrchar\\cyryu /g,"\u044E"],[/\\cyrchar\\cyrya /g,"\u044F"],[/\\cyrchar\\cyryo /g,"\u0451"],[/\\cyrchar\\cyrdje /g,"\u0452"],[/\\cyrchar\{\\'\\cyrg\}/g,"\u0453"],[/\\cyrchar\\cyrie /g,"\u0454"],[/\\cyrchar\\cyrdze /g,"\u0455"],[/\\cyrchar\\cyrii /g,"\u0456"],[/\\cyrchar\\cyryi /g,"\u0457"],[/\\cyrchar\\cyrje /g,"\u0458"],[/\\cyrchar\\cyrlje /g,"\u0459"],[/\\cyrchar\\cyrnje /g,"\u045A"],[/\\cyrchar\\cyrtshe /g,"\u045B"],[/\\cyrchar\{\\'\\cyrk\}/g,"\u045C"],[/\\cyrchar\\cyrushrt /g,"\u045E"],[/\\cyrchar\\cyrdzhe /g,"\u045F"],[/\\cyrchar\\CYROMEGA /g,"\u0460"],[/\\cyrchar\\cyromega /g,"\u0461"],[/\\cyrchar\\CYRYAT /g,"\u0462"],[/\\cyrchar\\CYRIOTE /g,"\u0464"],[/\\cyrchar\\cyriote /g,"\u0465"],[/\\cyrchar\\CYRLYUS /g,"\u0466"],[/\\cyrchar\\cyrlyus /g,"\u0467"],[/\\cyrchar\\CYRIOTLYUS /g,"\u0468"],[/\\cyrchar\\cyriotlyus /g,"\u0469"],[/\\cyrchar\\CYRBYUS /g,"\u046A"],[/\\cyrchar\\CYRIOTBYUS /g,"\u046C"],[/\\cyrchar\\cyriotbyus /g,"\u046D"],[/\\cyrchar\\CYRKSI /g,"\u046E"],[/\\cyrchar\\cyrksi /g,"\u046F"],[/\\cyrchar\\CYRPSI /g,"\u0470"],[/\\cyrchar\\cyrpsi /g,"\u0471"],[/\\cyrchar\\CYRFITA /g,"\u0472"],[/\\cyrchar\\CYRIZH /g,"\u0474"],[/\\cyrchar\\CYRUK /g,"\u0478"],[/\\cyrchar\\cyruk /g,"\u0479"],[/\\cyrchar\\CYROMEGARND /g,"\u047A"],[/\\cyrchar\\cyromegarnd /g,"\u047B"],[/\\cyrchar\\CYROMEGATITLO /g,"\u047C"],[/\\cyrchar\\cyromegatitlo /g,"\u047D"],[/\\cyrchar\\CYROT /g,"\u047E"],[/\\cyrchar\\cyrot /g,"\u047F"],[/\\cyrchar\\CYRKOPPA /g,"\u0480"],[/\\cyrchar\\cyrkoppa /g,"\u0481"],[/\\cyrchar\\cyrthousands /g,"\u0482"],[/\\cyrchar\\cyrhundredthousands /g,"\u0488"],[/\\cyrchar\\cyrmillions /g,"\u0489"],[/\\cyrchar\\CYRSEMISFTSN /g,"\u048C"],[/\\cyrchar\\cyrsemisftsn /g,"\u048D"],[/\\cyrchar\\CYRRTICK /g,"\u048E"],[/\\cyrchar\\cyrrtick /g,"\u048F"],[/\\cyrchar\\CYRGUP /g,"\u0490"],[/\\cyrchar\\cyrgup /g,"\u0491"],[/\\cyrchar\\CYRGHCRS /g,"\u0492"],[/\\cyrchar\\cyrghcrs /g,"\u0493"],[/\\cyrchar\\CYRGHK /g,"\u0494"],[/\\cyrchar\\cyrghk /g,"\u0495"],[/\\cyrchar\\CYRZHDSC /g,"\u0496"],[/\\cyrchar\\cyrzhdsc /g,"\u0497"],[/\\cyrchar\\CYRZDSC /g,"\u0498"],[/\\cyrchar\\cyrzdsc /g,"\u0499"],[/\\cyrchar\\CYRKDSC /g,"\u049A"],[/\\cyrchar\\cyrkdsc /g,"\u049B"],[/\\cyrchar\\CYRKVCRS /g,"\u049C"],[/\\cyrchar\\cyrkvcrs /g,"\u049D"],[/\\cyrchar\\CYRKHCRS /g,"\u049E"],[/\\cyrchar\\cyrkhcrs /g,"\u049F"],[/\\cyrchar\\CYRKBEAK /g,"\u04A0"],[/\\cyrchar\\cyrkbeak /g,"\u04A1"],[/\\cyrchar\\CYRNDSC /g,"\u04A2"],[/\\cyrchar\\cyrndsc /g,"\u04A3"],[/\\cyrchar\\CYRNG /g,"\u04A4"],[/\\cyrchar\\cyrng /g,"\u04A5"],[/\\cyrchar\\CYRPHK /g,"\u04A6"],[/\\cyrchar\\cyrphk /g,"\u04A7"],[/\\cyrchar\\CYRABHHA /g,"\u04A8"],[/\\cyrchar\\cyrabhha /g,"\u04A9"],[/\\cyrchar\\CYRSDSC /g,"\u04AA"],[/\\cyrchar\\cyrsdsc /g,"\u04AB"],[/\\cyrchar\\CYRTDSC /g,"\u04AC"],[/\\cyrchar\\cyrtdsc /g,"\u04AD"],[/\\cyrchar\\CYRY /g,"\u04AE"],[/\\cyrchar\\cyry /g,"\u04AF"],[/\\cyrchar\\CYRYHCRS /g,"\u04B0"],[/\\cyrchar\\cyryhcrs /g,"\u04B1"],[/\\cyrchar\\CYRHDSC /g,"\u04B2"],[/\\cyrchar\\cyrhdsc /g,"\u04B3"],[/\\cyrchar\\CYRTETSE /g,"\u04B4"],[/\\cyrchar\\cyrtetse /g,"\u04B5"],[/\\cyrchar\\CYRCHRDSC /g,"\u04B6"],[/\\cyrchar\\cyrchrdsc /g,"\u04B7"],[/\\cyrchar\\CYRCHVCRS /g,"\u04B8"],[/\\cyrchar\\cyrchvcrs /g,"\u04B9"],[/\\cyrchar\\CYRSHHA /g,"\u04BA"],[/\\cyrchar\\cyrshha /g,"\u04BB"],[/\\cyrchar\\CYRABHCH /g,"\u04BC"],[/\\cyrchar\\cyrabhch /g,"\u04BD"],[/\\cyrchar\\CYRABHCHDSC /g,"\u04BE"],[/\\cyrchar\\cyrabhchdsc /g,"\u04BF"],[/\\cyrchar\\CYRpalochka /g,"\u04C0"],[/\\cyrchar\\CYRKHK /g,"\u04C3"],[/\\cyrchar\\cyrkhk /g,"\u04C4"],[/\\cyrchar\\CYRNHK /g,"\u04C7"],[/\\cyrchar\\cyrnhk /g,"\u04C8"],[/\\cyrchar\\CYRCHLDSC /g,"\u04CB"],[/\\cyrchar\\cyrchldsc /g,"\u04CC"],[/\\cyrchar\\CYRAE /g,"\u04D4"],[/\\cyrchar\\cyrae /g,"\u04D5"],[/\\cyrchar\\CYRSCHWA /g,"\u04D8"],[/\\cyrchar\\cyrschwa /g,"\u04D9"],[/\\cyrchar\\CYRABHDZE /g,"\u04E0"],[/\\cyrchar\\cyrabhdze /g,"\u04E1"],[/\\cyrchar\\CYROTLD /g,"\u04E8"],[/\\cyrchar\\cyrotld /g,"\u04E9"],[/\\hspace\{0.6em\}/g,"\u2002"],[/\\hspace\{1em\}/g,"\u2003"],[/\\hspace\{0.33em\}/g,"\u2004"],[/\\hspace\{0.25em\}/g,"\u2005"],[/\\hspace\{0.166em\}/g,"\u2006"],[/\\hphantom\{0\}/g,"\u2007"],[/\\hphantom\{,\}/g,"\u2008"],[/\\hspace\{0.167em\}/g,"\u2009"],[/\\mkern1mu /g,"\u200A"],[/\\textendash /g,"\u2013"],[/\\textemdash /g,"\u2014"],[/\\rule\{1em\}\{1pt\}/g,"\u2015"],[/\\Vert /g,"\u2016"],[/\\Elzreapos /g,"\u201B"],[/\\textquotedblleft /g,"\u201C"],[/\\textquotedblright /g,"\u201D"],[/\\textdagger /g,"\u2020"],[/\\textdaggerdbl /g,"\u2021"],[/\\textbullet /g,"\u2022"],[/\\ldots /g,"\u2026"],[/\\textperthousand /g,"\u2030"],[/\\textpertenthousand /g,"\u2031"],[/\\backprime /g,"\u2035"],[/\\guilsinglleft /g,"\u2039"],[/\\guilsinglright /g,"\u203A"],[/\\mkern4mu /g,"\u205F"],[/\\nolinebreak /g,"\u2060"],[/\\ensuremath\{\\Elzpes\}/g,"\u20A7"],[/\\mbox\{\\texteuro\} /g,"\u20AC"],[/\\dddot /g,"\u20DB"],[/\\ddddot /g,"\u20DC"],[/\\mathbb\{C\}/g,"\u2102"],[/\\mathscr\{g\}/g,"\u210A"],[/\\mathscr\{H\}/g,"\u210B"],[/\\mathfrak\{H\}/g,"\u210C"],[/\\mathbb\{H\}/g,"\u210D"],[/\\hslash /g,"\u210F"],[/\\mathscr\{I\}/g,"\u2110"],[/\\mathfrak\{I\}/g,"\u2111"],[/\\mathscr\{L\}/g,"\u2112"],[/\\mathscr\{l\}/g,"\u2113"],[/\\mathbb\{N\}/g,"\u2115"],[/\\cyrchar\\textnumero /g,"\u2116"],[/\\wp /g,"\u2118"],[/\\mathbb\{P\}/g,"\u2119"],[/\\mathbb\{Q\}/g,"\u211A"],[/\\mathscr\{R\}/g,"\u211B"],[/\\mathfrak\{R\}/g,"\u211C"],[/\\mathbb\{R\}/g,"\u211D"],[/\\Elzxrat /g,"\u211E"],[/\\texttrademark /g,"\u2122"],[/\\mathbb\{Z\}/g,"\u2124"],[/\\Omega /g,"\u2126"],[/\\mho /g,"\u2127"],[/\\mathfrak\{Z\}/g,"\u2128"],[/\\ElsevierGlyph\{2129\}/g,"\u2129"],[/\\AA /g,"\u212B"],[/\\mathscr\{B\}/g,"\u212C"],[/\\mathfrak\{C\}/g,"\u212D"],[/\\mathscr\{e\}/g,"\u212F"],[/\\mathscr\{E\}/g,"\u2130"],[/\\mathscr\{F\}/g,"\u2131"],[/\\mathscr\{M\}/g,"\u2133"],[/\\mathscr\{o\}/g,"\u2134"],[/\\aleph /g,"\u2135"],[/\\beth /g,"\u2136"],[/\\gimel /g,"\u2137"],[/\\daleth /g,"\u2138"],[/\\textfrac\{1\}\{3\}/g,"\u2153"],[/\\textfrac\{2\}\{3\}/g,"\u2154"],[/\\textfrac\{1\}\{5\}/g,"\u2155"],[/\\textfrac\{2\}\{5\}/g,"\u2156"],[/\\textfrac\{3\}\{5\}/g,"\u2157"],[/\\textfrac\{4\}\{5\}/g,"\u2158"],[/\\textfrac\{1\}\{6\}/g,"\u2159"],[/\\textfrac\{5\}\{6\}/g,"\u215A"],[/\\textfrac\{1\}\{8\}/g,"\u215B"],[/\\textfrac\{3\}\{8\}/g,"\u215C"],[/\\textfrac\{5\}\{8\}/g,"\u215D"],[/\\textfrac\{7\}\{8\}/g,"\u215E"],[/\\leftarrow /g,"\u2190"],[/\\uparrow /g,"\u2191"],[/\\rightarrow /g,"\u2192"],[/\\downarrow /g,"\u2193"],[/\\leftrightarrow /g,"\u2194"],[/\\updownarrow /g,"\u2195"],[/\\nwarrow /g,"\u2196"],[/\\nearrow /g,"\u2197"],[/\\searrow /g,"\u2198"],[/\\swarrow /g,"\u2199"],[/\\nleftarrow /g,"\u219A"],[/\\nrightarrow /g,"\u219B"],[/\\arrowwaveright /g,"\u219C"],[/\\arrowwaveright /g,"\u219D"],[/\\twoheadleftarrow /g,"\u219E"],[/\\twoheadrightarrow /g,"\u21A0"],[/\\leftarrowtail /g,"\u21A2"],[/\\rightarrowtail /g,"\u21A3"],[/\\mapsto /g,"\u21A6"],[/\\hookleftarrow /g,"\u21A9"],[/\\hookrightarrow /g,"\u21AA"],[/\\looparrowleft /g,"\u21AB"],[/\\looparrowright /g,"\u21AC"],[/\\leftrightsquigarrow /g,"\u21AD"],[/\\nleftrightarrow /g,"\u21AE"],[/\\Lsh /g,"\u21B0"],[/\\Rsh /g,"\u21B1"],[/\\ElsevierGlyph\{21B3\}/g,"\u21B3"],[/\\curvearrowleft /g,"\u21B6"],[/\\curvearrowright /g,"\u21B7"],[/\\circlearrowleft /g,"\u21BA"],[/\\circlearrowright /g,"\u21BB"],[/\\leftharpoonup /g,"\u21BC"],[/\\leftharpoondown /g,"\u21BD"],[/\\upharpoonright /g,"\u21BE"],[/\\upharpoonleft /g,"\u21BF"],[/\\rightharpoonup /g,"\u21C0"],[/\\rightharpoondown /g,"\u21C1"],[/\\downharpoonright /g,"\u21C2"],[/\\downharpoonleft /g,"\u21C3"],[/\\rightleftarrows /g,"\u21C4"],[/\\dblarrowupdown /g,"\u21C5"],[/\\leftrightarrows /g,"\u21C6"],[/\\leftleftarrows /g,"\u21C7"],[/\\upuparrows /g,"\u21C8"],[/\\rightrightarrows /g,"\u21C9"],[/\\downdownarrows /g,"\u21CA"],[/\\leftrightharpoons /g,"\u21CB"],[/\\rightleftharpoons /g,"\u21CC"],[/\\nLeftarrow /g,"\u21CD"],[/\\nLeftrightarrow /g,"\u21CE"],[/\\nRightarrow /g,"\u21CF"],[/\\Leftarrow /g,"\u21D0"],[/\\Uparrow /g,"\u21D1"],[/\\Rightarrow /g,"\u21D2"],[/\\Downarrow /g,"\u21D3"],[/\\Leftrightarrow /g,"\u21D4"],[/\\Updownarrow /g,"\u21D5"],[/\\Lleftarrow /g,"\u21DA"],[/\\Rrightarrow /g,"\u21DB"],[/\\rightsquigarrow /g,"\u21DD"],[/\\DownArrowUpArrow /g,"\u21F5"],[/\\forall /g,"\u2200"],[/\\complement /g,"\u2201"],[/\\partial /g,"\u2202"],[/\\exists /g,"\u2203"],[/\\nexists /g,"\u2204"],[/\\varnothing /g,"\u2205"],[/\\nabla /g,"\u2207"],[/\\in /g,"\u2208"],[/\\not\\in /g,"\u2209"],[/\\ni /g,"\u220B"],[/\\not\\ni /g,"\u220C"],[/\\prod /g,"\u220F"],[/\\coprod /g,"\u2210"],[/\\sum /g,"\u2211"],[/\\mp /g,"\u2213"],[/\\dotplus /g,"\u2214"],[/\\setminus /g,"\u2216"],[/\\circ /g,"\u2218"],[/\\bullet /g,"\u2219"],[/\\surd /g,"\u221A"],[/\\propto /g,"\u221D"],[/\\infty /g,"\u221E"],[/\\rightangle /g,"\u221F"],[/\\angle /g,"\u2220"],[/\\measuredangle /g,"\u2221"],[/\\sphericalangle /g,"\u2222"],[/\\mid /g,"\u2223"],[/\\nmid /g,"\u2224"],[/\\parallel /g,"\u2225"],[/\\nparallel /g,"\u2226"],[/\\wedge /g,"\u2227"],[/\\vee /g,"\u2228"],[/\\cap /g,"\u2229"],[/\\cup /g,"\u222A"],[/\\int /g,"\u222B"],[/\\int\\!\\int /g,"\u222C"],[/\\int\\!\\int\\!\\int /g,"\u222D"],[/\\oint /g,"\u222E"],[/\\surfintegral /g,"\u222F"],[/\\volintegral /g,"\u2230"],[/\\clwintegral /g,"\u2231"],[/\\ElsevierGlyph\{2232\}/g,"\u2232"],[/\\ElsevierGlyph\{2233\}/g,"\u2233"],[/\\therefore /g,"\u2234"],[/\\because /g,"\u2235"],[/\\Colon /g,"\u2237"],[/\\ElsevierGlyph\{2238\}/g,"\u2238"],[/\\mathbin\{\{:\}\\!\\!\{\-\}\\!\\!\{:\}\}/g,"\u223A"],[/\\homothetic /g,"\u223B"],[/\\sim /g,"\u223C"],[/\\backsim /g,"\u223D"],[/\\lazysinv /g,"\u223E"],[/\\wr /g,"\u2240"],[/\\not\\sim /g,"\u2241"],[/\\ElsevierGlyph\{2242\}/g,"\u2242"],[/\\NotEqualTilde /g,"\u2242-00338"],[/\\simeq /g,"\u2243"],[/\\not\\simeq /g,"\u2244"],[/\\cong /g,"\u2245"],[/\\approxnotequal /g,"\u2246"],[/\\not\\cong /g,"\u2247"],[/\\approx /g,"\u2248"],[/\\not\\approx /g,"\u2249"],[/\\approxeq /g,"\u224A"],[/\\tildetrpl /g,"\u224B"],[/\\not\\apid /g,"\u224B-00338"],[/\\allequal /g,"\u224C"],[/\\asymp /g,"\u224D"],[/\\Bumpeq /g,"\u224E"],[/\\NotHumpDownHump /g,"\u224E-00338"],[/\\bumpeq /g,"\u224F"],[/\\NotHumpEqual /g,"\u224F-00338"],[/\\doteq /g,"\u2250"],[/\\not\\doteq/g,"\u2250-00338"],[/\\doteqdot /g,"\u2251"],[/\\fallingdotseq /g,"\u2252"],[/\\risingdotseq /g,"\u2253"],[/\\eqcirc /g,"\u2256"],[/\\circeq /g,"\u2257"],[/\\estimates /g,"\u2259"],[/\\ElsevierGlyph\{225A\}/g,"\u225A"],[/\\starequal /g,"\u225B"],[/\\triangleq /g,"\u225C"],[/\\ElsevierGlyph\{225F\}/g,"\u225F"],[/\\not =/g,"\u2260"],[/\\equiv /g,"\u2261"],[/\\not\\equiv /g,"\u2262"],[/\\leq /g,"\u2264"],[/\\geq /g,"\u2265"],[/\\leqq /g,"\u2266"],[/\\geqq /g,"\u2267"],[/\\lneqq /g,"\u2268"],[/\\lvertneqq /g,"\u2268-0FE00"],[/\\gneqq /g,"\u2269"],[/\\gvertneqq /g,"\u2269-0FE00"],[/\\ll /g,"\u226A"],[/\\NotLessLess /g,"\u226A-00338"],[/\\gg /g,"\u226B"],[/\\NotGreaterGreater /g,"\u226B-00338"],[/\\between /g,"\u226C"],[/\\not\\kern\-0.3em\\times /g,"\u226D"],[/\\not</g,"\u226E"],[/\\not>/g,"\u226F"],[/\\not\\leq /g,"\u2270"],[/\\not\\geq /g,"\u2271"],[/\\lessequivlnt /g,"\u2272"],[/\\greaterequivlnt /g,"\u2273"],[/\\ElsevierGlyph\{2274\}/g,"\u2274"],[/\\ElsevierGlyph\{2275\}/g,"\u2275"],[/\\lessgtr /g,"\u2276"],[/\\gtrless /g,"\u2277"],[/\\notlessgreater /g,"\u2278"],[/\\notgreaterless /g,"\u2279"],[/\\prec /g,"\u227A"],[/\\succ /g,"\u227B"],[/\\preccurlyeq /g,"\u227C"],[/\\succcurlyeq /g,"\u227D"],[/\\precapprox /g,"\u227E"],[/\\NotPrecedesTilde /g,"\u227E-00338"],[/\\succapprox /g,"\u227F"],[/\\NotSucceedsTilde /g,"\u227F-00338"],[/\\not\\prec /g,"\u2280"],[/\\not\\succ /g,"\u2281"],[/\\subset /g,"\u2282"],[/\\supset /g,"\u2283"],[/\\not\\subset /g,"\u2284"],[/\\not\\supset /g,"\u2285"],[/\\subseteq /g,"\u2286"],[/\\supseteq /g,"\u2287"],[/\\not\\subseteq /g,"\u2288"],[/\\not\\supseteq /g,"\u2289"],[/\\subsetneq /g,"\u228A"],[/\\varsubsetneqq /g,"\u228A-0FE00"],[/\\supsetneq /g,"\u228B"],[/\\varsupsetneq /g,"\u228B-0FE00"],[/\\uplus /g,"\u228E"],[/\\sqsubset /g,"\u228F"],[/\\NotSquareSubset /g,"\u228F-00338"],[/\\sqsupset /g,"\u2290"],[/\\NotSquareSuperset /g,"\u2290-00338"],[/\\sqsubseteq /g,"\u2291"],[/\\sqsupseteq /g,"\u2292"],[/\\sqcap /g,"\u2293"],[/\\sqcup /g,"\u2294"],[/\\oplus /g,"\u2295"],[/\\ominus /g,"\u2296"],[/\\otimes /g,"\u2297"],[/\\oslash /g,"\u2298"],[/\\odot /g,"\u2299"],[/\\circledcirc /g,"\u229A"],[/\\circledast /g,"\u229B"],[/\\circleddash /g,"\u229D"],[/\\boxplus /g,"\u229E"],[/\\boxminus /g,"\u229F"],[/\\boxtimes /g,"\u22A0"],[/\\boxdot /g,"\u22A1"],[/\\vdash /g,"\u22A2"],[/\\dashv /g,"\u22A3"],[/\\top /g,"\u22A4"],[/\\perp /g,"\u22A5"],[/\\truestate /g,"\u22A7"],[/\\forcesextra /g,"\u22A8"],[/\\Vdash /g,"\u22A9"],[/\\Vvdash /g,"\u22AA"],[/\\VDash /g,"\u22AB"],[/\\nvdash /g,"\u22AC"],[/\\nvDash /g,"\u22AD"],[/\\nVdash /g,"\u22AE"],[/\\nVDash /g,"\u22AF"],[/\\vartriangleleft /g,"\u22B2"],[/\\vartriangleright /g,"\u22B3"],[/\\trianglelefteq /g,"\u22B4"],[/\\trianglerighteq /g,"\u22B5"],[/\\original /g,"\u22B6"],[/\\image /g,"\u22B7"],[/\\multimap /g,"\u22B8"],[/\\hermitconjmatrix /g,"\u22B9"],[/\\intercal /g,"\u22BA"],[/\\veebar /g,"\u22BB"],[/\\rightanglearc /g,"\u22BE"],[/\\ElsevierGlyph\{22C0\}/g,"\u22C0"],[/\\ElsevierGlyph\{22C1\}/g,"\u22C1"],[/\\bigcap /g,"\u22C2"],[/\\bigcup /g,"\u22C3"],[/\\diamond /g,"\u22C4"],[/\\cdot /g,"\u22C5"],[/\\star /g,"\u22C6"],[/\\divideontimes /g,"\u22C7"],[/\\bowtie /g,"\u22C8"],[/\\ltimes /g,"\u22C9"],[/\\rtimes /g,"\u22CA"],[/\\leftthreetimes /g,"\u22CB"],[/\\rightthreetimes /g,"\u22CC"],[/\\backsimeq /g,"\u22CD"],[/\\curlyvee /g,"\u22CE"],[/\\curlywedge /g,"\u22CF"],[/\\Subset /g,"\u22D0"],[/\\Supset /g,"\u22D1"],[/\\Cap /g,"\u22D2"],[/\\Cup /g,"\u22D3"],[/\\pitchfork /g,"\u22D4"],[/\\lessdot /g,"\u22D6"],[/\\gtrdot /g,"\u22D7"],[/\\verymuchless /g,"\u22D8"],[/\\verymuchgreater /g,"\u22D9"],[/\\lesseqgtr /g,"\u22DA"],[/\\gtreqless /g,"\u22DB"],[/\\curlyeqprec /g,"\u22DE"],[/\\curlyeqsucc /g,"\u22DF"],[/\\not\\sqsubseteq /g,"\u22E2"],[/\\not\\sqsupseteq /g,"\u22E3"],[/\\Elzsqspne /g,"\u22E5"],[/\\lnsim /g,"\u22E6"],[/\\gnsim /g,"\u22E7"],[/\\precedesnotsimilar /g,"\u22E8"],[/\\succnsim /g,"\u22E9"],[/\\ntriangleleft /g,"\u22EA"],[/\\ntriangleright /g,"\u22EB"],[/\\ntrianglelefteq /g,"\u22EC"],[/\\ntrianglerighteq /g,"\u22ED"],[/\\vdots /g,"\u22EE"],[/\\cdots /g,"\u22EF"],[/\\upslopeellipsis /g,"\u22F0"],[/\\downslopeellipsis /g,"\u22F1"],[/\\barwedge /g,"\u2305"],[/\\perspcorrespond /g,"\u2306"],[/\\lceil /g,"\u2308"],[/\\rceil /g,"\u2309"],[/\\lfloor /g,"\u230A"],[/\\rfloor /g,"\u230B"],[/\\recorder /g,"\u2315"],[/\\mathchar"2208/g,"\u2316"],[/\\ulcorner /g,"\u231C"],[/\\urcorner /g,"\u231D"],[/\\llcorner /g,"\u231E"],[/\\lrcorner /g,"\u231F"],[/\\frown /g,"\u2322"],[/\\smile /g,"\u2323"],[/\\langle /g,"\u2329"],[/\\rangle /g,"\u232A"],[/\\ElsevierGlyph\{E838\}/g,"\u233D"],[/\\Elzdlcorn /g,"\u23A3"],[/\\lmoustache /g,"\u23B0"],[/\\rmoustache /g,"\u23B1"],[/\\textvisiblespace /g,"\u2423"],[/\\ding\{172\}/g,"\u2460"],[/\\ding\{173\}/g,"\u2461"],[/\\ding\{174\}/g,"\u2462"],[/\\ding\{175\}/g,"\u2463"],[/\\ding\{176\}/g,"\u2464"],[/\\ding\{177\}/g,"\u2465"],[/\\ding\{178\}/g,"\u2466"],[/\\ding\{179\}/g,"\u2467"],[/\\ding\{180\}/g,"\u2468"],[/\\ding\{181\}/g,"\u2469"],[/\\circledS /g,"\u24C8"],[/\\Elzdshfnc /g,"\u2506"],[/\\Elzsqfnw /g,"\u2519"],[/\\diagup /g,"\u2571"],[/\\ding\{110\}/g,"\u25A0"],[/\\square /g,"\u25A1"],[/\\blacksquare /g,"\u25AA"],[/\\fbox\{~~\}/g,"\u25AD"],[/\\Elzvrecto /g,"\u25AF"],[/\\ElsevierGlyph\{E381\}/g,"\u25B1"],[/\\ding\{115\}/g,"\u25B2"],[/\\bigtriangleup /g,"\u25B3"],[/\\blacktriangle /g,"\u25B4"],[/\\vartriangle /g,"\u25B5"],[/\\blacktriangleright /g,"\u25B8"],[/\\triangleright /g,"\u25B9"],[/\\ding\{116\}/g,"\u25BC"],[/\\bigtriangledown /g,"\u25BD"],[/\\blacktriangledown /g,"\u25BE"],[/\\triangledown /g,"\u25BF"],[/\\blacktriangleleft /g,"\u25C2"],[/\\triangleleft /g,"\u25C3"],[/\\ding\{117\}/g,"\u25C6"],[/\\lozenge /g,"\u25CA"],[/\\bigcirc /g,"\u25CB"],[/\\ding\{108\}/g,"\u25CF"],[/\\Elzcirfl /g,"\u25D0"],[/\\Elzcirfr /g,"\u25D1"],[/\\Elzcirfb /g,"\u25D2"],[/\\ding\{119\}/g,"\u25D7"],[/\\Elzrvbull /g,"\u25D8"],[/\\Elzsqfl /g,"\u25E7"],[/\\Elzsqfr /g,"\u25E8"],[/\\Elzsqfse /g,"\u25EA"],[/\\bigcirc /g,"\u25EF"],[/\\ding\{72\}/g,"\u2605"],[/\\ding\{73\}/g,"\u2606"],[/\\ding\{37\}/g,"\u260E"],[/\\ding\{42\}/g,"\u261B"],[/\\ding\{43\}/g,"\u261E"],[/\\rightmoon /g,"\u263E"],[/\\mercury /g,"\u263F"],[/\\venus /g,"\u2640"],[/\\male /g,"\u2642"],[/\\jupiter /g,"\u2643"],[/\\saturn /g,"\u2644"],[/\\uranus /g,"\u2645"],[/\\neptune /g,"\u2646"],[/\\pluto /g,"\u2647"],[/\\aries /g,"\u2648"],[/\\taurus /g,"\u2649"],[/\\gemini /g,"\u264A"],[/\\cancer /g,"\u264B"],[/\\leo /g,"\u264C"],[/\\virgo /g,"\u264D"],[/\\libra /g,"\u264E"],[/\\scorpio /g,"\u264F"],[/\\sagittarius /g,"\u2650"],[/\\capricornus /g,"\u2651"],[/\\aquarius /g,"\u2652"],[/\\pisces /g,"\u2653"],[/\\ding\{171\}/g,"\u2660"],[/\\diamond /g,"\u2662"],[/\\ding\{168\}/g,"\u2663"],[/\\ding\{170\}/g,"\u2665"],[/\\ding\{169\}/g,"\u2666"],[/\\quarternote /g,"\u2669"],[/\\eighthnote /g,"\u266A"],[/\\flat /g,"\u266D"],[/\\natural /g,"\u266E"],[/\\sharp /g,"\u266F"],[/\\ding\{33\}/g,"\u2701"],[/\\ding\{34\}/g,"\u2702"],[/\\ding\{35\}/g,"\u2703"],[/\\ding\{36\}/g,"\u2704"],[/\\ding\{38\}/g,"\u2706"],[/\\ding\{39\}/g,"\u2707"],[/\\ding\{40\}/g,"\u2708"],[/\\ding\{41\}/g,"\u2709"],[/\\ding\{44\}/g,"\u270C"],[/\\ding\{45\}/g,"\u270D"],[/\\ding\{46\}/g,"\u270E"],[/\\ding\{47\}/g,"\u270F"],[/\\ding\{48\}/g,"\u2710"],[/\\ding\{49\}/g,"\u2711"],[/\\ding\{50\}/g,"\u2712"],[/\\ding\{51\}/g,"\u2713"],[/\\ding\{52\}/g,"\u2714"],[/\\ding\{53\}/g,"\u2715"],[/\\ding\{54\}/g,"\u2716"],[/\\ding\{55\}/g,"\u2717"],[/\\ding\{56\}/g,"\u2718"],[/\\ding\{57\}/g,"\u2719"],[/\\ding\{58\}/g,"\u271A"],[/\\ding\{59\}/g,"\u271B"],[/\\ding\{60\}/g,"\u271C"],[/\\ding\{61\}/g,"\u271D"],[/\\ding\{62\}/g,"\u271E"],[/\\ding\{63\}/g,"\u271F"],[/\\ding\{64\}/g,"\u2720"],[/\\ding\{65\}/g,"\u2721"],[/\\ding\{66\}/g,"\u2722"],[/\\ding\{67\}/g,"\u2723"],[/\\ding\{68\}/g,"\u2724"],[/\\ding\{69\}/g,"\u2725"],[/\\ding\{70\}/g,"\u2726"],[/\\ding\{71\}/g,"\u2727"],[/\\ding\{73\}/g,"\u2729"],[/\\ding\{74\}/g,"\u272A"],[/\\ding\{75\}/g,"\u272B"],[/\\ding\{76\}/g,"\u272C"],[/\\ding\{77\}/g,"\u272D"],[/\\ding\{78\}/g,"\u272E"],[/\\ding\{79\}/g,"\u272F"],[/\\ding\{80\}/g,"\u2730"],[/\\ding\{81\}/g,"\u2731"],[/\\ding\{82\}/g,"\u2732"],[/\\ding\{83\}/g,"\u2733"],[/\\ding\{84\}/g,"\u2734"],[/\\ding\{85\}/g,"\u2735"],[/\\ding\{86\}/g,"\u2736"],[/\\ding\{87\}/g,"\u2737"],[/\\ding\{88\}/g,"\u2738"],[/\\ding\{89\}/g,"\u2739"],[/\\ding\{90\}/g,"\u273A"],[/\\ding\{91\}/g,"\u273B"],[/\\ding\{92\}/g,"\u273C"],[/\\ding\{93\}/g,"\u273D"],[/\\ding\{94\}/g,"\u273E"],[/\\ding\{95\}/g,"\u273F"],[/\\ding\{96\}/g,"\u2740"],[/\\ding\{97\}/g,"\u2741"],[/\\ding\{98\}/g,"\u2742"],[/\\ding\{99\}/g,"\u2743"],[/\\ding\{100\}/g,"\u2744"],[/\\ding\{101\}/g,"\u2745"],[/\\ding\{102\}/g,"\u2746"],[/\\ding\{103\}/g,"\u2747"],[/\\ding\{104\}/g,"\u2748"],[/\\ding\{105\}/g,"\u2749"],[/\\ding\{106\}/g,"\u274A"],[/\\ding\{107\}/g,"\u274B"],[/\\ding\{109\}/g,"\u274D"],[/\\ding\{111\}/g,"\u274F"],[/\\ding\{112\}/g,"\u2750"],[/\\ding\{113\}/g,"\u2751"],[/\\ding\{114\}/g,"\u2752"],[/\\ding\{118\}/g,"\u2756"],[/\\ding\{120\}/g,"\u2758"],[/\\ding\{121\}/g,"\u2759"],[/\\ding\{122\}/g,"\u275A"],[/\\ding\{123\}/g,"\u275B"],[/\\ding\{124\}/g,"\u275C"],[/\\ding\{125\}/g,"\u275D"],[/\\ding\{126\}/g,"\u275E"],[/\\ding\{161\}/g,"\u2761"],[/\\ding\{162\}/g,"\u2762"],[/\\ding\{163\}/g,"\u2763"],[/\\ding\{164\}/g,"\u2764"],[/\\ding\{165\}/g,"\u2765"],[/\\ding\{166\}/g,"\u2766"],[/\\ding\{167\}/g,"\u2767"],[/\\ding\{182\}/g,"\u2776"],[/\\ding\{183\}/g,"\u2777"],[/\\ding\{184\}/g,"\u2778"],[/\\ding\{185\}/g,"\u2779"],[/\\ding\{186\}/g,"\u277A"],[/\\ding\{187\}/g,"\u277B"],[/\\ding\{188\}/g,"\u277C"],[/\\ding\{189\}/g,"\u277D"],[/\\ding\{190\}/g,"\u277E"],[/\\ding\{191\}/g,"\u277F"],[/\\ding\{192\}/g,"\u2780"],[/\\ding\{193\}/g,"\u2781"],[/\\ding\{194\}/g,"\u2782"],[/\\ding\{195\}/g,"\u2783"],[/\\ding\{196\}/g,"\u2784"],[/\\ding\{197\}/g,"\u2785"],[/\\ding\{198\}/g,"\u2786"],[/\\ding\{199\}/g,"\u2787"],[/\\ding\{200\}/g,"\u2788"],[/\\ding\{201\}/g,"\u2789"],[/\\ding\{202\}/g,"\u278A"],[/\\ding\{203\}/g,"\u278B"],[/\\ding\{204\}/g,"\u278C"],[/\\ding\{205\}/g,"\u278D"],[/\\ding\{206\}/g,"\u278E"],[/\\ding\{207\}/g,"\u278F"],[/\\ding\{208\}/g,"\u2790"],[/\\ding\{209\}/g,"\u2791"],[/\\ding\{210\}/g,"\u2792"],[/\\ding\{211\}/g,"\u2793"],[/\\ding\{212\}/g,"\u2794"],[/\\ding\{216\}/g,"\u2798"],[/\\ding\{217\}/g,"\u2799"],[/\\ding\{218\}/g,"\u279A"],[/\\ding\{219\}/g,"\u279B"],[/\\ding\{220\}/g,"\u279C"],[/\\ding\{221\}/g,"\u279D"],[/\\ding\{222\}/g,"\u279E"],[/\\ding\{223\}/g,"\u279F"],[/\\ding\{224\}/g,"\u27A0"],[/\\ding\{225\}/g,"\u27A1"],[/\\ding\{226\}/g,"\u27A2"],[/\\ding\{227\}/g,"\u27A3"],[/\\ding\{228\}/g,"\u27A4"],[/\\ding\{229\}/g,"\u27A5"],[/\\ding\{230\}/g,"\u27A6"],[/\\ding\{231\}/g,"\u27A7"],[/\\ding\{232\}/g,"\u27A8"],[/\\ding\{233\}/g,"\u27A9"],[/\\ding\{234\}/g,"\u27AA"],[/\\ding\{235\}/g,"\u27AB"],[/\\ding\{236\}/g,"\u27AC"],[/\\ding\{237\}/g,"\u27AD"],[/\\ding\{238\}/g,"\u27AE"],[/\\ding\{239\}/g,"\u27AF"],[/\\ding\{241\}/g,"\u27B1"],[/\\ding\{242\}/g,"\u27B2"],[/\\ding\{243\}/g,"\u27B3"],[/\\ding\{244\}/g,"\u27B4"],[/\\ding\{245\}/g,"\u27B5"],[/\\ding\{246\}/g,"\u27B6"],[/\\ding\{247\}/g,"\u27B7"],[/\\ding\{248\}/g,"\u27B8"],[/\\ding\{249\}/g,"\u27B9"],[/\\ding\{250\}/g,"\u27BA"],[/\\ding\{251\}/g,"\u27BB"],[/\\ding\{252\}/g,"\u27BC"],[/\\ding\{253\}/g,"\u27BD"],[/\\ding\{254\}/g,"\u27BE"],[/\\longleftarrow /g,"\u27F5"],[/\\longrightarrow /g,"\u27F6"],[/\\longleftrightarrow /g,"\u27F7"],[/\\Longleftarrow /g,"\u27F8"],[/\\Longrightarrow /g,"\u27F9"],[/\\Longleftrightarrow /g,"\u27FA"],[/\\longmapsto /g,"\u27FC"],[/\\sim\\joinrel\\leadsto/g,"\u27FF"],[/\\ElsevierGlyph\{E212\}/g,"\u2905"],[/\\UpArrowBar /g,"\u2912"],[/\\DownArrowBar /g,"\u2913"],[/\\ElsevierGlyph\{E20C\}/g,"\u2923"],[/\\ElsevierGlyph\{E20D\}/g,"\u2924"],[/\\ElsevierGlyph\{E20B\}/g,"\u2925"],[/\\ElsevierGlyph\{E20A\}/g,"\u2926"],[/\\ElsevierGlyph\{E211\}/g,"\u2927"],[/\\ElsevierGlyph\{E20E\}/g,"\u2928"],[/\\ElsevierGlyph\{E20F\}/g,"\u2929"],[/\\ElsevierGlyph\{E210\}/g,"\u292A"],[/\\ElsevierGlyph\{E21C\}/g,"\u2933"],[/\\ElsevierGlyph\{E21D\}/g,"\u2933-00338"],[/\\ElsevierGlyph\{E21A\}/g,"\u2936"],[/\\ElsevierGlyph\{E219\}/g,"\u2937"],[/\\Elolarr /g,"\u2940"],[/\\Elorarr /g,"\u2941"],[/\\ElzRlarr /g,"\u2942"],[/\\ElzrLarr /g,"\u2944"],[/\\Elzrarrx /g,"\u2947"],[/\\LeftRightVector /g,"\u294E"],[/\\RightUpDownVector /g,"\u294F"],[/\\DownLeftRightVector /g,"\u2950"],[/\\LeftUpDownVector /g,"\u2951"],[/\\LeftVectorBar /g,"\u2952"],[/\\RightVectorBar /g,"\u2953"],[/\\RightUpVectorBar /g,"\u2954"],[/\\RightDownVectorBar /g,"\u2955"],[/\\DownLeftVectorBar /g,"\u2956"],[/\\DownRightVectorBar /g,"\u2957"],[/\\LeftUpVectorBar /g,"\u2958"],[/\\LeftDownVectorBar /g,"\u2959"],[/\\LeftTeeVector /g,"\u295A"],[/\\RightTeeVector /g,"\u295B"],[/\\RightUpTeeVector /g,"\u295C"],[/\\RightDownTeeVector /g,"\u295D"],[/\\DownLeftTeeVector /g,"\u295E"],[/\\DownRightTeeVector /g,"\u295F"],[/\\LeftUpTeeVector /g,"\u2960"],[/\\LeftDownTeeVector /g,"\u2961"],[/\\UpEquilibrium /g,"\u296E"],[/\\ReverseUpEquilibrium /g,"\u296F"],[/\\RoundImplies /g,"\u2970"],[/\\ElsevierGlyph\{E214\}/g,"\u297C"],[/\\ElsevierGlyph\{E215\}/g,"\u297D"],[/\\Elztfnc /g,"\u2980"],[/\\ElsevierGlyph\{3018\}/g,"\u2985"],[/\\Elroang /g,"\u2986"],[/\\ElsevierGlyph\{E291\}/g,"\u2994"],[/\\Elzddfnc /g,"\u2999"],[/\\Angle /g,"\u299C"],[/\\Elzlpargt /g,"\u29A0"],[/\\ElsevierGlyph\{E260\}/g,"\u29B5"],[/\\ElsevierGlyph\{E61B\}/g,"\u29B6"],[/\\ElzLap /g,"\u29CA"],[/\\Elzdefas /g,"\u29CB"],[/\\LeftTriangleBar /g,"\u29CF"],[/\\NotLeftTriangleBar /g,"\u29CF-00338"],[/\\RightTriangleBar /g,"\u29D0"],[/\\NotRightTriangleBar /g,"\u29D0-00338"],[/\\ElsevierGlyph\{E372\}/g,"\u29DC"],[/\\blacklozenge /g,"\u29EB"],[/\\RuleDelayed /g,"\u29F4"],[/\\Elxuplus /g,"\u2A04"],[/\\ElzThr /g,"\u2A05"],[/\\Elxsqcup /g,"\u2A06"],[/\\ElzInf /g,"\u2A07"],[/\\ElzSup /g,"\u2A08"],[/\\ElzCint /g,"\u2A0D"],[/\\clockoint /g,"\u2A0F"],[/\\ElsevierGlyph\{E395\}/g,"\u2A10"],[/\\sqrint /g,"\u2A16"],[/\\ElsevierGlyph\{E25A\}/g,"\u2A25"],[/\\ElsevierGlyph\{E25B\}/g,"\u2A2A"],[/\\ElsevierGlyph\{E25C\}/g,"\u2A2D"],[/\\ElsevierGlyph\{E25D\}/g,"\u2A2E"],[/\\ElzTimes /g,"\u2A2F"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A34"],[/\\ElsevierGlyph\{E25E\}/g,"\u2A35"],[/\\ElsevierGlyph\{E259\}/g,"\u2A3C"],[/\\amalg /g,"\u2A3F"],[/\\ElzAnd /g,"\u2A53"],[/\\ElzOr /g,"\u2A54"],[/\\ElsevierGlyph\{E36E\}/g,"\u2A55"],[/\\ElOr /g,"\u2A56"],[/\\perspcorrespond /g,"\u2A5E"],[/\\Elzminhat /g,"\u2A5F"],[/\\ElsevierGlyph\{225A\}/g,"\u2A63"],[/\\stackrel\{*\}\{=\}/g,"\u2A6E"],[/\\Equal /g,"\u2A75"],[/\\leqslant /g,"\u2A7D"],[/\\nleqslant /g,"\u2A7D-00338"],[/\\geqslant /g,"\u2A7E"],[/\\ngeqslant /g,"\u2A7E-00338"],[/\\lessapprox /g,"\u2A85"],[/\\gtrapprox /g,"\u2A86"],[/\\lneq /g,"\u2A87"],[/\\gneq /g,"\u2A88"],[/\\lnapprox /g,"\u2A89"],[/\\gnapprox /g,"\u2A8A"],[/\\lesseqqgtr /g,"\u2A8B"],[/\\gtreqqless /g,"\u2A8C"],[/\\eqslantless /g,"\u2A95"],[/\\eqslantgtr /g,"\u2A96"],[/\\Pisymbol\{ppi020\}\{117\}/g,"\u2A9D"],[/\\Pisymbol\{ppi020\}\{105\}/g,"\u2A9E"],[/\\NestedLessLess /g,"\u2AA1"],[/\\NotNestedLessLess /g,"\u2AA1-00338"],[/\\NestedGreaterGreater /g,"\u2AA2"],[/\\NotNestedGreaterGreater /g,"\u2AA2-00338"],[/\\preceq /g,"\u2AAF"],[/\\not\\preceq /g,"\u2AAF-00338"],[/\\succeq /g,"\u2AB0"],[/\\not\\succeq /g,"\u2AB0-00338"],[/\\precneqq /g,"\u2AB5"],[/\\succneqq /g,"\u2AB6"],[/\\precapprox /g,"\u2AB7"],[/\\succapprox /g,"\u2AB8"],[/\\precnapprox /g,"\u2AB9"],[/\\succnapprox /g,"\u2ABA"],[/\\subseteqq /g,"\u2AC5"],[/\\nsubseteqq /g,"\u2AC5-00338"],[/\\supseteqq /g,"\u2AC6"],[/\\nsupseteqq/g,"\u2AC6-00338"],[/\\subsetneqq /g,"\u2ACB"],[/\\supsetneqq /g,"\u2ACC"],[/\\ElsevierGlyph\{E30D\}/g,"\u2AEB"],[/\\Elztdcol /g,"\u2AF6"],[/\\ElsevierGlyph\{300A\}/g,"\u300A"],[/\\ElsevierGlyph\{300B\}/g,"\u300B"],[/\\ElsevierGlyph\{3018\}/g,"\u3018"],[/\\ElsevierGlyph\{3019\}/g,"\u3019"],[/\\openbracketleft /g,"\u301A"],[/\\openbracketright /g,"\u301B"]];return this}if(typeof module!=="undefined"&&module.exports){module.exports=BibtexParser};
\ No newline at end of file
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/packed/mvc/citation/citation-model.js
--- a/static/scripts/packed/mvc/citation/citation-model.js
+++ b/static/scripts/packed/mvc/citation/citation-model.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var h=new BibtexParser(g).entries[0];this.entry=h},entryType:function(){return this.entry.EntryType},fields:function(){return this.entry.Fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
+define(["mvc/base-mvc","utils/localization"],function(a,e){var f=Backbone.Model.extend(a.LoggableMixin).extend({initialize:function(){var g=this.attributes.content;var i=new BibtexParser(g).entries[0];this.entry=i;this._fields={};var k=i.Fields;for(key in k){var j=k[key];var h=key.toLowerCase();this._fields[h]=j}},entryType:function(){return this.entry.EntryType},fields:function(){return this._fields}});var b=Backbone.Collection.extend(a.LoggableMixin).extend({urlRoot:galaxy_config.root+"api",partial:true,model:f,});var d=b.extend({url:function(){return this.urlRoot+"/histories/"+this.history_id+"/citations"}});var c=b.extend({url:function(){return this.urlRoot+"/tools/"+this.tool_id+"/citations"},partial:false,});return{Citation:f,HistoryCitationCollection:d,ToolCitationCollection:c}});
\ No newline at end of file
diff -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 -r 103697ebdd339377424063fba0459cb3cc2b707c static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.doi){l="http://dx.doi.org/"+k.doi;g+='[<a href="'+l+'">doi:'+k.doi+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Fix more BibTeX problems caught by @peterjc.
by commits-noreply@bitbucket.org 06 Aug '14
by commits-noreply@bitbucket.org 06 Aug '14
06 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6ebb0a47a2a3/
Changeset: 6ebb0a47a2a3
User: jmchilton
Date: 2014-08-06 18:36:27
Summary: Fix more BibTeX problems caught by @peterjc.
See https://bitbucket.org/galaxy/galaxy-central/commits/3e8dfd372918c90ee4b3726….
Thanks Peter!
Affected #: 1 file
diff -r 3e8dfd372918c90ee4b37267f0b7c03a291acb54 -r 6ebb0a47a2a3088ba9ed313d8f323d7e1f5c9bb6 tools/phenotype_association/lps.xml
--- a/tools/phenotype_association/lps.xml
+++ b/tools/phenotype_association/lps.xml
@@ -308,12 +308,16 @@
journal = {Journal of Machine Learning Research},
year = {2007},
volume = {8},
- pages = {1519-1555},
+ pages = {1519--1555},
}</citation>
- <citation type="bibtex">@MISC{Shi08lasso-patternsearchalgorithm,
+ <citation type="bibtex">@ARTICLE{Shi08lasso-patternsearchalgorithm,
author = {Weiliang Shi and Grace Wahba and Stephen Wright and Kristine Lee and Ronald Klein and Barbara Klein},
- title = { LASSO-Patternsearch Algorithm with Application to Ophthalmology and Genomic Data},
- year = {2008}
+ title = {LASSO-Patternsearch Algorithm with Application to Ophthalmology and Genomic Data},
+ journal= {Stat Interface},
+ year = {2008},
+ volume = {1},
+ number = {1},
+ pages = {137--153}
}</citation></citations></tool>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: Fix citation problem in 39c9831 caught by @peterjc.
by commits-noreply@bitbucket.org 06 Aug '14
by commits-noreply@bitbucket.org 06 Aug '14
06 Aug '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/3e8dfd372918/
Changeset: 3e8dfd372918
User: jmchilton
Date: 2014-08-06 18:31:50
Summary: Fix citation problem in 39c9831 caught by @peterjc.
Affected #: 1 file
diff -r 0e9c220ff8cd619c902aca574a07f208a2a30a21 -r 3e8dfd372918c90ee4b37267f0b7c03a291acb54 tools/phenotype_association/lps.xml
--- a/tools/phenotype_association/lps.xml
+++ b/tools/phenotype_association/lps.xml
@@ -307,7 +307,8 @@
title = {An interior-point method for large-scale l1-regularized logistic regression},
journal = {Journal of Machine Learning Research},
year = {2007},
- volume = {2007}
+ volume = {8},
+ pages = {1519-1555},
}</citation><citation type="bibtex">@MISC{Shi08lasso-patternsearchalgorithm,
author = {Weiliang Shi and Grace Wahba and Stephen Wright and Kristine Lee and Ronald Klein and Barbara Klein},
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a57767f4ae8f/
Changeset: a57767f4ae8f
Branch: next-stable
User: dannon
Date: 2014-08-06 16:16:22
Summary: Fix for conditionally using bucket_default in cloudlaunch.
Affected #: 1 file
diff -r 283f3be266eab2951f04cda8204fc24af22983ca -r a57767f4ae8f5e45ed04a123aae5be53c69ebe91 lib/galaxy/webapps/galaxy/controllers/cloudlaunch.py
--- a/lib/galaxy/webapps/galaxy/controllers/cloudlaunch.py
+++ b/lib/galaxy/webapps/galaxy/controllers/cloudlaunch.py
@@ -70,10 +70,18 @@
cfg = cloudman.CloudManConfig(key_id, secret, cluster_name, ami,
instance_type, password, placement=zone)
cml = cloudman.launch.CloudManLauncher(key_id, secret)
- result = cml.launch(cluster_name, ami, instance_type, password,
- cfg.kernel_id, cfg.ramdisk_id, cfg.key_name,
- cfg.security_groups, cfg.placement,
- bucket_default=bucket_default)
+ # This should probably be handled better on the bioblend side, but until
+ # an egg update can be made, this needs to conditionally include the
+ # parameter or not, even if the value is None.
+ if bucket_default:
+ result = cml.launch(cluster_name, ami, instance_type, password,
+ cfg.kernel_id, cfg.ramdisk_id, cfg.key_name,
+ cfg.security_groups, cfg.placement,
+ bucket_default=bucket_default)
+ else:
+ result = cml.launch(cluster_name, ami, instance_type, password,
+ cfg.kernel_id, cfg.ramdisk_id, cfg.key_name,
+ cfg.security_groups, cfg.placement)
# result is a dict with sg_names, kp_name, kp_material, rs, and instance_id
if not result['rs']:
trans.response.status = 400
https://bitbucket.org/galaxy/galaxy-central/commits/3976f4d59bc0/
Changeset: 3976f4d59bc0
Branch: next-stable
User: dannon
Date: 2014-08-06 17:25:12
Summary: Merge.
Affected #: 3 files
diff -r a57767f4ae8f5e45ed04a123aae5be53c69ebe91 -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 lib/galaxy/managers/citations.py
--- a/lib/galaxy/managers/citations.py
+++ b/lib/galaxy/managers/citations.py
@@ -157,8 +157,8 @@
if self.raw_bibtex is DoiCitation.BIBTEX_UNSET:
return """@MISC{%s,
- DOI = '%s',
- note = 'Failed to fetch BibTeX for DOI.'
+ DOI = {%s},
+ note = {Failed to fetch BibTeX for DOI.}
}""" % (self.__doi, self.__doi)
else:
return self.raw_bibtex
diff -r a57767f4ae8f5e45ed04a123aae5be53c69ebe91 -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 static/scripts/mvc/citation/citation-view.js
--- a/static/scripts/mvc/citation/citation-view.js
+++ b/static/scripts/mvc/citation/citation-view.js
@@ -94,7 +94,7 @@
return info + ".";
},
_asSentence: function(str) {
- return str ? str + ". " : "";
+ return (str && str.trim()) ? str + ". " : "";
}
});
diff -r a57767f4ae8f5e45ed04a123aae5be53c69ebe91 -r 3976f4d59bc0d7b65575e7573f13fb7470c9bf53 static/scripts/packed/mvc/citation/citation-view.js
--- a/static/scripts/packed/mvc/citation/citation-view.js
+++ b/static/scripts/packed/mvc/citation/citation-view.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return f?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
+define(["mvc/base-mvc","mvc/citation/citation-model","utils/localization"],function(a,d,c){var b=Backbone.View.extend({tagName:"div",className:"citations",render:function(){this.$el.append("<p>"+this.formattedReference()+"</p>");return this},formattedReference:function(){var j=this.model;var i=j.entryType();var k=j.fields();var g="";var n=this._asSentence((k.author?k.author:"")+(k.year?(" ("+k.year+")"):""))+" ";var m=k.title||"";var h=k.pages?("pp. "+k.pages):"";var o=k.address;if(i=="article"){g=n+this._asSentence(m)+(k.journal?("In <em>"+k.journal+", "):"")+(k.volume?k.volume:"")+(k.number?("("+k.number+"), "):", ")+this._asSentence(h)+this._asSentence(k.address)+"</em>"}else{if(i=="inproceedings"||i=="proceedings"){g=n+this._asSentence(m)+(k.booktitle?("In <em>"+k.booktitle+", "):"")+(h?h:"")+(o?", "+o:"")+".</em>"}else{if(i=="mastersthesis"||i=="phdthesis"){g=n+this._asSentence(m)+(k.howpublished?k.howpublished+". ":"")+(k.note?k.note+".":"")}else{if(i=="techreport"){g=n+". "+this._asSentence(m)+this._asSentence(k.institution)+this._asSentence(k.number)+this._asSentence(k.type)}else{if(i=="book"||i=="inbook"||i=="incollection"){g=this._asSentence(n)+" "+this._formatBookInfo(k)}else{g=this._asSentence(n)+" "+this._asSentence(m)+this._asSentence(k.howpublished)+this._asSentence(k.note)}}}}}var l="";if(k.DOI){l="http://dx.doi.org/"+k.DOI;g+='[<a href="'+l+'">doi:'+k.DOI+"</a>]"}var f=k.url||l;if(f){g+='[<a href="'+f+'">Link</a>]'}return g},_formatBookInfo:function(f){var g="";if(f.chapter){g+=f.chapter+" in "}if(f.title){g+="<em>"+f.title+"</em>"}if(f.editor){g+=", Edited by "+f.editor+", "}if(f.publisher){g+=", "+f.publisher}if(f.pages){g+=", pp. "+f.pages+""}if(f.series){g+=", <em>"+f.series+"</em>"}if(f.volume){g+=", Vol."+f.volume}if(f.issn){g+=", ISBN: "+f.issn}return g+"."},_asSentence:function(f){return(f&&f.trim())?f+". ":""}});var e=Backbone.View.extend({el:"#citations",initialize:function(){this.listenTo(this.collection,"add",this.renderCitation)},events:{"click .citations-to-bibtex":"showBibtex","click .citations-to-formatted":"showFormatted"},renderCitation:function(g){var f=new b({model:g});this.$(".citations-formatted").append(f.render().el);var h=this.$(".citations-bibtex-text");h.val(h.val()+"\n\r"+g.attributes.content)},render:function(){this.$el.html(this.citationsElement());this.collection.each(function(f){this.renderCitation(f)},this);this.showFormatted()},showBibtex:function(){this.$(".citations-to-formatted").show();this.$(".citations-to-bibtex").hide();this.$(".citations-bibtex").show();this.$(".citations-formatted").hide();this.$(".citations-bibtex-text").select()},showFormatted:function(){this.$(".citations-to-formatted").hide();this.$(".citations-to-bibtex").show();this.$(".citations-bibtex").hide();this.$(".citations-formatted").show()},partialWarningElement:function(){if(this.collection.partial){return['<div style="padding:5px 10px">',"<b>Warning: This is a experimental feature.</b> Most Galaxy tools will not annotate"," citations explicitly at this time. When writing up your analysis, please manually"," review your histories and find all references"," that should be cited in order to completely describe your work. Also, please remember to",' <a href="https://wiki.galaxyproject.org/CitingGalaxy">cite Galaxy</a>.',"</div>",].join("")}else{return""}},citationsElement:function(){return['<div class="toolForm">','<div class="toolFormTitle">',c("Citations"),' <i class="fa fa-pencil-square-o citations-to-bibtex" title="Select all as BibTeX."></i>',' <i class="fa fa-times citations-to-formatted" title="Return to formatted citation list."></i>',"</div>",'<div class="toolFormBody" style="padding:5px 10px">',this.partialWarningElement(),'<span class="citations-formatted"></span>',"</div>",'<div class="citations-bibtex toolFormBody" style="padding:5px 10px">','<textarea style="width: 100%; height: 500px;" class="citations-bibtex-text"></textarea>',"</div>","</div>"].join("")}});return{CitationView:b,CitationListView:e}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0