Commit 25d2bd08 authored by Jérome Perrin's avatar Jérome Perrin

graph editor for business process

parent 44d61d6d
<workflow_chain>
<chain>
<type>Business Process</type>
<workflow>business_process_graph_editor_interaction_workflow</workflow>
</chain>
</workflow_chain>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>erp5_graph_editor</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>import json\n
portal = context.getPortalObject()\n
\n
import json\n
position_graph = context.getProperty(\'jsplumb_graph\')\n
\n
if position_graph:\n
context.log(position_graph)\n
\n
position_graph = json.loads(position_graph)\n
\n
\n
visited_business_process_set = set() # prevent infinite recurisions\n
\n
def getBusinessProcessGraph(business_process):\n
graph = dict(node=dict(), edge=dict())\n
if business_process in visited_business_process_set:\n
return graph\n
visited_business_process_set.add(business_process)\n
for link in business_process.contentValues(portal_type=\'Business Link\'):\n
for trade_state in (link.getPredecessorValue(), link.getSuccessorValue()):\n
if trade_state is not None:\n
graph[\'node\'][trade_state.getReference() or trade_state.getId()] = dict(\n
_class=\'erp5.business_process.trade_state\',\n
name=trade_state.getTranslatedTitle())\n
if link.getPredecessor() and link.getSuccessor(): # XXX no start ??\n
graph[\'edge\'][link.getRelativeUrl()] = dict(\n
_class=\'erp5.business_process.business_link\',\n
source=link.getPredecessorReference() or link.getPredecessorId(),\n
destination=link.getSuccessorReference() or link.getSuccessorId(),\n
name=link.getTranslatedTitle())\n
\n
for specialise in [context] + business_process.getSpecialiseValueList(portal_type=\'Business Process\'):\n
specialise_graph = getBusinessProcessGraph(specialise)\n
for node_id, node_data in specialise_graph[\'node\'].items():\n
graph[\'node\'].setdefault(node_id, node_data)\n
for node_id, node_data in specialise_graph[\'edge\'].items():\n
graph[\'edge\'].setdefault(node_id, node_data)\n
return graph\n
\n
return json.dumps(dict(graph=getBusinessProcessGraph(context), class_definition=[]), indent=2)\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>BusinessProcess_getGraph</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ERP5 Form" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>action</string> </key>
<value> <string>Base_edit</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>edit_order</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>enctype</string> </key>
<value> <string>application/x-www-form-urlencoded</string> </value>
</item>
<item>
<key> <string>group_list</string> </key>
<value>
<list>
<string>left</string>
<string>right</string>
<string>center</string>
<string>bottom</string>
<string>hidden</string>
</list>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<dictionary>
<item>
<key> <string>bottom</string> </key>
<value>
<list>
<string>listbox</string>
</list>
</value>
</item>
<item>
<key> <string>center</string> </key>
<value>
<list>
<string>my_description</string>
</list>
</value>
</item>
<item>
<key> <string>hidden</string> </key>
<value>
<list>
<string>listbox_int_index</string>
<string>listbox_order_builder_title_list</string>
<string>listbox_delivery_builder_title_list</string>
</list>
</value>
</item>
<item>
<key> <string>left</string> </key>
<value>
<list>
<string>my_title</string>
<string>my_version</string>
<string>my_specialise_title_list</string>
</list>
</value>
</item>
<item>
<key> <string>right</string> </key>
<value>
<list>
<string>my_reference</string>
<string>my_jsplumb_graph</string>
<string>my_translated_validation_state_title</string>
</list>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>BusinessProcess_view</string> </value>
</item>
<item>
<key> <string>method</string> </key>
<value> <string>POST</string> </value>
</item>
<item>
<key> <string>name</string> </key>
<value> <string>BusinessProcessModel_view</string> </value>
</item>
<item>
<key> <string>pt</string> </key>
<value> <string>form_view</string> </value>
</item>
<item>
<key> <string>row_length</string> </key>
<value> <int>4</int> </value>
</item>
<item>
<key> <string>stored_encoding</string> </key>
<value> <string>UTF-8</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Business Process Model</string> </value>
</item>
<item>
<key> <string>unicode_mode</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>update_action</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>update_action_title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list>
<string>columns</string>
<string>editable_columns</string>
<string>portal_types</string>
<string>selection_name</string>
<string>sort</string>
<string>title</string>
</list>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>listbox</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>columns</string> </key>
<value>
<list>
<tuple>
<string>int_index</string>
<string>Index</string>
</tuple>
<tuple>
<string>title</string>
<string>Title</string>
</tuple>
<tuple>
<string>predecessor_title</string>
<string>Predecessor</string>
</tuple>
<tuple>
<string>successor_title</string>
<string>Successor</string>
</tuple>
<tuple>
<string>order_builder_title_list</string>
<string>Order Builders</string>
</tuple>
<tuple>
<string>delivery_builder_title_list</string>
<string>Delivery Builders</string>
</tuple>
<tuple>
<string>trade_phase_title</string>
<string>Trade Phase</string>
</tuple>
</list>
</value>
</item>
<item>
<key> <string>editable_columns</string> </key>
<value>
<list>
<tuple>
<string>int_index</string>
<string>int_index</string>
</tuple>
</list>
</value>
</item>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_listbox</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>portal_types</string> </key>
<value>
<list>
<tuple>
<string>Business Link</string>
<string>Business Link</string>
</tuple>
</list>
</value>
</item>
<item>
<key> <string>selection_name</string> </key>
<value> <string>business_process_model_view_selection</string> </value>
</item>
<item>
<key> <string>sort</string> </key>
<value>
<list>
<tuple>
<string>int_index</string>
<string>ascending</string>
</tuple>
</list>
</value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Business Links</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>listbox_delivery_builder_title_list</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_listbox_delivery_builder_title_list</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>listbox_int_index</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_listbox_int_index</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>listbox_order_builder_title_list</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_listbox_order_builder_title_list</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_description</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_description</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="GadgetField" module="Products.ERP5Form.GadgetField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>my_jsplumb_graph</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
<item>
<key> <string>required_not_found</string> </key>
<value> <string>Input is required but no input given.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>gadget_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>js_sandbox</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>gadget_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>js_sandbox</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>alternate_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>css_class</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>default</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_maxwidth</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>display_width</string> </key>
<value> <int>20</int> </value>
</item>
<item>
<key> <string>editable</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>external_validator</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>extra</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>gadget_url</string> </key>
<value> <string>http://localhost:55432/erp5/portal_skins/custom/jsplumb/index.html</string> </value>
</item>
<item>
<key> <string>hidden</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>js_sandbox</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>required</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Graph</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="TALESMethod" module="Products.Formulator.TALESField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_text</string> </key>
<value> <string>context/BusinessProcess_getGraph</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_reference</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_reference</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_specialise_title_list</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_business_process_specialise_title_list</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_title</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_title</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_translated_validation_state_title</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_translated_validation_state_title</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>delegated_list</string> </key>
<value>
<list/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>my_version</string> </value>
</item>
<item>
<key> <string>message_values</string> </key>
<value>
<dictionary>
<item>
<key> <string>external_validator_failed</string> </key>
<value> <string>The input failed the external validator.</string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>overrides</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>tales</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>values</string> </key>
<value>
<dictionary>
<item>
<key> <string>field_id</string> </key>
<value> <string>my_view_mode_version</string> </value>
</item>
<item>
<key> <string>form_id</string> </key>
<value> <string>Base_viewTradeFieldLibrary</string> </value>
</item>
<item>
<key> <string>target</string> </key>
<value> <string>Click to edit the target</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>dream</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681758.02</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>.Input_viewProductionLine.js.swp</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/octet-stream</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">YjBWSU0gNy40AAAAABAAAM1vT1QrwMYQOUsAAGplcm9tZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAABqZXJvbWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfmplcm9t
ZS9zcmMvZHJlYW0vZHJlYW0vcGxhdGZvcm0vc3RhdGljL2RyZWFtL0lucHV0X3ZpZXdQcm9kdWN0
aW9uTGluZS5qcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AMzIxMAAAAAAjIiEgExJVAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRwAQB/AAAA
AgAAAAAAAABIAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhZAAADQIAAEkDAAAAEAAA
SAAAAAAAAADQDwAAng8AAIwPAABoDwAASg8AACMPAADxDgAAzQ4AAIEOAAA8DgAAEw4AAOgNAADH
DQAAqA0AAFgNAAArDQAAAA0AANcMAADHDAAApgwAAFMMAAAjDAAA8wsAALgLAACLCwAAYAsAADYL
AAAACwAA0goAAMIKAAClCgAAWAoAAEwKAABGCgAAIwoAAJsJAACVCQAAcAkAAFoJAAA/CQAACAkA
AOEIAADVCAAAJAgAAPMHAADLBwAAmQcAAHYHAAA+BwAAIAcAAPcGAACyBgAAigYAAFAGAAAzBgAA
7AUAAMEFAACcBQAAkAUAAF4FAABBBQAAAgUAANMEAADHBAAAbgQAAEwEAAAKBAAA5gMAAIcDAAB7
AwAAcwMAAEkDAABIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfSkod2luZG93LCBySlMsIFJTVlAsIGxvb3BFdmVu
dExpc3RlbmVyKTsAICAgIH0pOwAgICAgICAgIH0pOwAgICAgICAgICAgICByZXR1cm4gUlNWUC5h
bGwoWyBncmFwaC5zdGFydFNlcnZpY2UoKSwgdG9vbGJveC5zdGFydFNlcnZpY2UoKSwgd2FpdEZv
clNhdmUoZykgXSk7ACAgICAgICAgfSkucHVzaChmdW5jdGlvbih0b29sYm94KSB7ACAgICAgICAg
ICAgIHJldHVybiBnLmdldERlY2xhcmVkR2FkZ2V0KCJwcm9kdWN0aW9ubGluZV90b29sYm94Iik7
ACAgICAgICAgICAgIGdyYXBoID0gZ3JhcGhfZ2FkZ2V0OwAgICAgICAgIHJldHVybiBnLmdldERl
Y2xhcmVkR2FkZ2V0KCJwcm9kdWN0aW9ubGluZV9ncmFwaCIpLnB1c2goZnVuY3Rpb24oZ3JhcGhf
Z2FkZ2V0KSB7ACAgICAgICAgfSk7ACAgICAgICAgICAgIGNvbnNvbGUubG9nKCJEYXRhIGNoYW5n
ZWQiLCBkYXRhKTsAICAgICAgICAkLnN1YnNjcmliZSgiRHJlYW0uR3VpLm9uRGF0YUNoYW5nZSIs
IGZ1bmN0aW9uKGRhdGEpIHsAICAgICAgICB2YXIgZyA9IHRoaXMsIGdyYXBoOwAgICAgfSkuZGVj
bGFyZU1ldGhvZCgic3RhcnRTZXJ2aWNlIiwgZnVuY3Rpb24oKSB7ACAgICAgICAgfSk7ACAgICAg
ICAgICAgIHRvb2xib3hfZ2FkZ2V0LnJlbmRlcigpOwAgICAgICAgIH0pLnB1c2goZnVuY3Rpb24o
dG9vbGJveF9nYWRnZXQpIHsAICAgICAgICAgICAgcmV0dXJuIGdhZGdldC5nZXREZWNsYXJlZEdh
ZGdldCgicHJvZHVjdGlvbmxpbmVfdG9vbGJveCIpOwAgICAgICAgIH0pLnB1c2goZnVuY3Rpb24o
KSB7ACAgICAgICAgICAgIHJldHVybiByZXN1bHRfbGlzdFsxXS5yZW5kZXIocmVzdWx0X2xpc3Rb
MF0pOwAgICAgICAgIH0pLnB1c2goZnVuY3Rpb24ocmVzdWx0X2xpc3QpIHsAICAgICAgICAgICAg
fSksIGdhZGdldC5nZXREZWNsYXJlZEdhZGdldCgicHJvZHVjdGlvbmxpbmVfZ3JhcGgiKSBdKTsA
ICAgICAgICAgICAgICAgIF9hdHRhY2htZW50OiAiYm9keS5qc29uIgAgICAgICAgICAgICAgICAg
X2lkOiBqaW9fa2V5LAAgICAgICAgICAgICByZXR1cm4gUlNWUC5hbGwoWyBnYWRnZXQuYXFfZ2V0
QXR0YWNobWVudCh7ACAgICAgICAgICAgIC8qanNsaW50IG5vbWVuOiB0cnVlKi8AICAgICAgICBy
ZXR1cm4gbmV3IFJTVlAuUXVldWUoKS5wdXNoKGZ1bmN0aW9uKCkgewAgICAgICAgIGdhZGdldC5w
cm9wcy5qaW9fa2V5ID0gamlvX2tleTsAICAgICAgICB2YXIgamlvX2tleSA9IG9wdGlvbnMuaWQs
IGdhZGdldCA9IHRoaXM7ACAgICB9KS5kZWNsYXJlQWNxdWlyZWRNZXRob2QoImFxX2dldEF0dGFj
aG1lbnQiLCAiamlvX2dldEF0dGFjaG1lbnQiKS5kZWNsYXJlQWNxdWlyZWRNZXRob2QoImFxX3B1
dEF0dGFjaG1lbnQiLCAiamlvX3B1dEF0dGFjaG1lbnQiKS5kZWNsYXJlTWV0aG9kKCJyZW5kZXIi
LCBmdW5jdGlvbihvcHRpb25zKSB7ACAgICAgICAgfSk7ACAgICAgICAgICAgIGcucHJvcHMuZWxl
bWVudCA9IGVsZW1lbnQ7ACAgICAgICAgcmV0dXJuIGcuZ2V0RWxlbWVudCgpLnB1c2goZnVuY3Rp
b24oZWxlbWVudCkgewAgICAgfSkucmVhZHkoZnVuY3Rpb24oZykgewAgICAgICAgIGcucHJvcHMg
PSB7fTsAICAgIGdhZGdldF9rbGFzcy5yZWFkeShmdW5jdGlvbihnKSB7ACAgICB9ACAgICAgICAg
cmV0dXJuIGxvb3BFdmVudExpc3RlbmVyKGdhZGdldC5wcm9wcy5lbGVtZW50LmdldEVsZW1lbnRz
QnlDbGFzc05hbWUoInNhdmVfZm9ybSIpWzBdLCAic3VibWl0IiwgZmFsc2UsIHNhdmVHcmFwaC5i
aW5kKGdhZGdldCkpOwAgICAgZnVuY3Rpb24gd2FpdEZvclNhdmUoZ2FkZ2V0KSB7ACAgICB9ACAg
ICAgICAgfSk7ACAgICAgICAgICAgIGV2dC50YXJnZXQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgi
dWktYnRuIilbMF0uZGlzYWJsZWQgPSBmYWxzZTsAICAgICAgICB9KS5wdXNoKGZ1bmN0aW9uKCkg
ewAgICAgICAgICAgICB9KTsAICAgICAgICAgICAgICAgIF9taW1ldHlwZTogImFwcGxpY2F0aW9u
L2pzb24iACAgICAgICAgICAgICAgICBfZGF0YTogSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwg
MiksACAgICAgICAgICAgICAgICBfYXR0YWNobWVudDogImJvZHkuanNvbiIsACAgICAgICAgICAg
ICAgICBfaWQ6IGdhZGdldC5wcm9wcy5qaW9fa2V5LAAgICAgICAgICAgICByZXR1cm4gZ2FkZ2V0
LmFxX3B1dEF0dGFjaG1lbnQoewAgICAgICAgICAgICBkYXRhLnByZWZlcmVuY2UgPSBqc29uX2dy
YXBoX2RhdGEucHJlZmVyZW5jZXM7ACAgICAgICAgICAgIGRhdGEuZWRnZXMgPSBqc29uX2dyYXBo
X2RhdGEuZWRnZXM7ACAgICAgICAgICAgIGRhdGEubm9kZXMgPSBqc29uX2dyYXBoX2RhdGEubm9k
ZXM7ACAgICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShib2R5KSwganNvbl9ncmFwaF9k
YXRhID0gSlNPTi5wYXJzZShncmFwaF9kYXRhKTsAICAgICAgICB9KS5wdXNoKGZ1bmN0aW9uKGJv
ZHkpIHsAICAgICAgICAgICAgfSk7ACAgICAgICAgICAgICAgICBfYXR0YWNobWVudDogImJvZHku
anNvbiIAICAgICAgICAgICAgICAgIF9pZDogZ2FkZ2V0LnByb3BzLmppb19rZXksACAgICAgICAg
ICAgIHJldHVybiBnYWRnZXQuYXFfZ2V0QXR0YWNobWVudCh7ACAgICAgICAgICAgIC8vIEFsd2F5
cyBnZXQgYSBmcmVzaCB2ZXJzaW9uLCB0byBwcmV2ZW50IGRlbGV0aW5nIHNwcmVhZHNoZWV0ICYg
Y28AICAgICAgICAgICAgZ3JhcGhfZGF0YSA9IGRhdGE7ACAgICAgICAgfSkucHVzaChmdW5jdGlv
bihkYXRhKSB7ACAgICAgICAgICAgIHJldHVybiBncmFwaF9nYWRnZXQuZ2V0RGF0YSgpOwAgICAg
ICAgIH0pLnB1c2goZnVuY3Rpb24oZ3JhcGhfZ2FkZ2V0KSB7ACAgICAgICAgICAgIHJldHVybiBn
YWRnZXQuZ2V0RGVjbGFyZWRHYWRnZXQoInByb2R1Y3Rpb25saW5lX2dyYXBoIik7ACAgICAgICAg
ICAgIGV2dC50YXJnZXQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidWktYnRuIilbMF0uZGlzYWJs
ZWQgPSB0cnVlOwAgICAgICAgICAgICAvLyBQcmV2ZW50IGRvdWJsZSBjbGljawAgICAgICAgIHJl
dHVybiBuZXcgUlNWUC5RdWV1ZSgpLnB1c2goZnVuY3Rpb24oKSB7ACAgICAgICAgdmFyIGdhZGdl
dCA9IHRoaXMsIGdyYXBoX2RhdGE7ACAgICBmdW5jdGlvbiBzYXZlR3JhcGgoZXZ0KSB7ACAgICB2
YXIgZ2FkZ2V0X2tsYXNzID0gckpTKHdpbmRvdyk7ACAgICAidXNlIHN0cmljdCI7AChmdW5jdGlv
bih3aW5kb3csIHJKUywgUlNWUCwgbG9vcEV2ZW50TGlzdGVuZXIpIHsALypnbG9iYWwgd2luZG93
LCBySlMsIFJTVlAsIGxvb3BFdmVudExpc3RlbmVyKi8A</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>12288</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681758.84</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>InputModule_viewAddDocumentDialog.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Create Document</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="mixin_promise.js" type="text/javascript"></script>\n
<script src="InputModule_viewAddDocumentDialog.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<form class="new_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline ui-icon-plus ui-btn-icon-right">Empty</button>\n
</form>\n
<form class="import_form">\n
<input id="dream_import" type="file" required=""\n
name="dream_import">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline ui-icon-plus ui-btn-icon-right">Import</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>968</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681758.95</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>InputModule_viewAddDocumentDialog.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global rJS, RSVP, promiseEventListener, promiseReadAsText,\n
initGadgetMixin */\n
(function(window, rJS, RSVP, promiseEventListener, promiseReadAsText, initGadgetMixin) {\n
"use strict";\n
function createDocument(gadget, name) {\n
var now = new Date();\n
// Create jIO document\n
return gadget.aq_post({\n
title: name,\n
type: "Dream",\n
format: "application/json",\n
modified: now.toUTCString(),\n
date: now.getFullYear() + "-" + (now.getMonth() + 1) + "-" + now.getDate()\n
});\n
}\n
function waitForImport(gadget) {\n
var json_data, name;\n
return new RSVP.Queue().push(function() {\n
return promiseEventListener(gadget.props.element.getElementsByClassName("import_form")[0], "submit", false);\n
}).push(function(evt) {\n
// Prevent double click\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
var file = evt.target.dream_import.files[0];\n
name = file.name;\n
return promiseReadAsText(file);\n
}).push(function(json) {\n
json_data = json;\n
return createDocument(gadget, name);\n
}).push(function(jio_document) {\n
// Add JSON as attachment\n
return gadget.aq_putAttachment({\n
_id: jio_document.id,\n
_attachment: "body.json",\n
_data: json_data,\n
_mimetype: "application/json"\n
});\n
});\n
}\n
function waitForNew(gadget) {\n
var json_data = {\n
nodes: {},\n
edges: {},\n
preference: {},\n
general: {},\n
wip_part_spreadsheet: [ [ "Order ID", "Due Date", "Priority", "Project Manager", "Part", "Part Type", "Sequence", "Processing Times", "Prerequisites Parts" ] ],\n
shift_spreadsheet: [ [ "Day", "Machines", // XXX more generic name ?\n
"Start", "End" ] ],\n
capacity_by_project_spreadsheet: [ [ "Project Name", "Sequence", "Capacity Requirements" ] ],\n
capacity_by_station_spreadsheet: [ [ "Day", "CS1" ] ],\n
dp_capacity_spreadsheet: [ [] ],\n
dp_route_spreadsheet: [ [] ]\n
}, name = "Untitled";\n
return new RSVP.Queue().push(function() {\n
return promiseEventListener(gadget.props.element.getElementsByClassName("new_form")[0], "submit", false);\n
}).push(function(evt) {\n
// Prevent double click\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
return createDocument(gadget, name);\n
}).push(function(jio_document) {\n
// Add JSON as attachment\n
return gadget.aq_putAttachment({\n
_id: jio_document.id,\n
_attachment: "body.json",\n
_data: JSON.stringify(json_data),\n
_mimetype: "application/json"\n
});\n
});\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_post", "jio_post").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareAcquiredMethod("pleaseRedirectMyHash", "pleaseRedirectMyHash").declareAcquiredMethod("whoWantsToDisplayThisDocument", "whoWantsToDisplayThisDocument").declareMethod("startService", function() {\n
var gadget = this;\n
return new RSVP.Queue().push(function() {\n
return RSVP.any([ waitForImport(gadget), waitForNew(gadget) ]);\n
}).push(function(result) {\n
return gadget.whoWantsToDisplayThisDocument(result.id);\n
}).push(function(url) {\n
return gadget.pleaseRedirectMyHash(url);\n
});\n
});\n
})(window, rJS, RSVP, promiseEventListener, promiseReadAsText, initGadgetMixin);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3780</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681759.06</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>InputModule_viewInputList.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Document List</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/handlebars.min.js" type="text/javascript"></script>\n
\n
<script id="table-template" type="text/x-handlebars-template">\n
<ul data-role="listview" data-inset="true" class="document-listview">\n
{{#documentlist}}\n
<li><a href="{{link}}">{{title}}</a></li>\n
{{/documentlist}}\n
</ul>\n
</script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="InputModule_viewInputList.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<section class="document_list"></section>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>890</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681759.17</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>InputModule_viewInputList.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, Handlebars, initGadgetMixin */\n
/*jslint nomen: true */\n
(function(window, rJS, RSVP, Handlebars, initGadgetMixin) {\n
"use strict";\n
/////////////////////////////////////////////////////////////////\n
// Handlebars\n
/////////////////////////////////////////////////////////////////\n
// Precompile the templates while loading the first gadget instance\n
var gadget_klass = rJS(window), source = gadget_klass.__template_element.getElementById("table-template").innerHTML, table_template = Handlebars.compile(source);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_allDocs", "jio_allDocs").declareAcquiredMethod("pleaseRedirectMyHash", "pleaseRedirectMyHash").declareAcquiredMethod("whoWantsToDisplayThisDocument", "whoWantsToDisplayThisDocument").declareMethod("render", function() {\n
var gadget = this;\n
return gadget.aq_allDocs({\n
select_list: [ "title", "modified" ]\n
}).push(function(document_list) {\n
var result_list = [], doc, i;\n
for (i = 0; i < document_list.data.total_rows; i += 1) {\n
doc = document_list.data.rows[i];\n
result_list.push(RSVP.all([ gadget.whoWantsToDisplayThisDocument(doc.id), doc.value.title, doc.value.modified ]));\n
}\n
return RSVP.all(result_list);\n
}).push(function(document_list) {\n
// Create new doc if nothing exists\n
if (document_list.length === 0) {\n
return gadget.whoWantsToDisplayThisDocument(undefined, "view_fast_input").push(function(url) {\n
return gadget.pleaseRedirectMyHash(url);\n
});\n
}\n
var i, parameter_list = [], doc;\n
for (i = 0; i < document_list.length; i += 1) {\n
doc = document_list[i];\n
parameter_list[i] = {\n
link: doc[0],\n
title: doc[1] + " (" + doc[2] + ")",\n
date: new Date(doc[2])\n
};\n
}\n
parameter_list.sort(function(a, b) {\n
return b.date - a.date;\n
});\n
// gadget.props.element.querySelector(\'a\').href = document_list[0];\n
gadget.props.element.querySelector(".document_list").innerHTML = table_template({\n
documentlist: parameter_list\n
});\n
});\n
});\n
})(window, rJS, RSVP, Handlebars, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2461</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681759.28</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewAvailableCapacitySpreadsheet.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Edit Required Capacity Spreadsheet</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Input_viewAvailableCapacitySpreadsheet.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../handsontable/index.html"\n
data-gadget-scope="tableeditor"></div>\n
<form class="save_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-edit ui-btn-icon-right">Save</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>932</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681759.39</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewAvailableCapacitySpreadsheet.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, initGadgetMixin, loopEventListener */\n
(function(window, rJS, RSVP, initGadgetMixin, loopEventListener) {\n
"use strict";\n
function saveSpreadsheet(evt) {\n
var gadget = this, editor_data, editor_gadget;\n
return new RSVP.Queue().push(function() {\n
// Prevent double click\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
}\n
return gadget.getDeclaredGadget("tableeditor");\n
}).push(function(tablegadget) {\n
editor_gadget = tablegadget;\n
return editor_gadget.getData();\n
}).push(function(data) {\n
editor_data = data;\n
// Always get a fresh version, to prevent deleting spreadsheet & co\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body) {\n
var data = JSON.parse(body);\n
data.capacity_by_station_spreadsheet = JSON.parse(editor_data);\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(data, null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = false;\n
}\n
});\n
}\n
function waitForSave(gadget) {\n
return loopEventListener(gadget.props.element.getElementsByClassName("save_form")[0], "submit", false, saveSpreadsheet.bind(gadget));\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "body.json"\n
}), gadget.getDeclaredGadget("tableeditor") ]);\n
}).push(function(result_list) {\n
return result_list[1].render(JSON.stringify(JSON.parse(result_list[0]).capacity_by_station_spreadsheet), {\n
minSpareCols: 1,\n
minSpareRows: 1,\n
onChange: function() {\n
if (gadget.timeout) {\n
window.clearTimeout(gadget.timeout);\n
}\n
gadget.timeout = window.setTimeout(saveSpreadsheet.bind(gadget), 100);\n
}\n
});\n
});\n
}).declareMethod("startService", function() {\n
var gadget = this;\n
return this.getDeclaredGadget("tableeditor").push(function(tableeditor) {\n
return RSVP.all([ tableeditor.startService(), waitForSave(gadget) ]);\n
});\n
});\n
})(window, rJS, RSVP, initGadgetMixin, loopEventListener);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3085</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681759.51</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewDemandPlanningCapacitySpreadsheet.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Edit Required Capacity Spreadsheet</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Input_viewDemandPlanningCapacitySpreadsheet.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../handsontable/index.html"\n
data-gadget-scope="tableeditor"></div>\n
<form class="save_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-edit ui-btn-icon-right">Save</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>937</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681759.6</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewDemandPlanningCapacitySpreadsheet.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, initGadgetMixin, loopEventListener */\n
(function(window, rJS, RSVP, initGadgetMixin, loopEventListener) {\n
"use strict";\n
function saveSpreadsheet(evt) {\n
var gadget = this, editor_data, editor_gadget;\n
return new RSVP.Queue().push(function() {\n
// Prevent double click\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
}\n
return gadget.getDeclaredGadget("tableeditor");\n
}).push(function(tablegadget) {\n
editor_gadget = tablegadget;\n
return editor_gadget.getData();\n
}).push(function(data) {\n
editor_data = data;\n
// Always get a fresh version, to prevent deleting spreadsheet & co\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body) {\n
var data = JSON.parse(body);\n
data.dp_capacity_spreadsheet = JSON.parse(editor_data);\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(data, null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = false;\n
}\n
});\n
}\n
function waitForSave(gadget) {\n
return loopEventListener(gadget.props.element.getElementsByClassName("save_form")[0], "submit", false, saveSpreadsheet.bind(gadget));\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "body.json"\n
}), gadget.getDeclaredGadget("tableeditor") ]);\n
}).push(function(result_list) {\n
return result_list[1].render(JSON.stringify(JSON.parse(result_list[0]).dp_capacity_spreadsheet), {\n
minSpareCols: 1,\n
minSpareRows: 1,\n
onChange: function() {\n
if (gadget.timeout) {\n
window.clearTimeout(gadget.timeout);\n
}\n
gadget.timeout = window.setTimeout(saveSpreadsheet.bind(gadget), 100);\n
}\n
});\n
});\n
}).declareMethod("startService", function() {\n
var gadget = this;\n
return this.getDeclaredGadget("tableeditor").push(function(tableeditor) {\n
return RSVP.all([ tableeditor.startService(), waitForSave(gadget) ]);\n
});\n
});\n
})(window, rJS, RSVP, initGadgetMixin, loopEventListener);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3069</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681759.7</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewDemandPlanningRouteSpreadsheet.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Edit Required Capacity Spreadsheet</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Input_viewDemandPlanningRouteSpreadsheet.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../handsontable/index.html"\n
data-gadget-scope="tableeditor"></div>\n
<form class="save_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-edit ui-btn-icon-right">Save</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>934</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681759.97</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewDemandPlanningRouteSpreadsheet.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, initGadgetMixin, loopEventListener */\n
(function(window, rJS, RSVP, initGadgetMixin, loopEventListener) {\n
"use strict";\n
function saveSpreadsheet(evt) {\n
var gadget = this, editor_data, editor_gadget;\n
return new RSVP.Queue().push(function() {\n
// Prevent double click\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
}\n
return gadget.getDeclaredGadget("tableeditor");\n
}).push(function(tablegadget) {\n
editor_gadget = tablegadget;\n
return editor_gadget.getData();\n
}).push(function(data) {\n
editor_data = data;\n
// Always get a fresh version, to prevent deleting spreadsheet & co\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body) {\n
var data = JSON.parse(body);\n
data.dp_route_spreadsheet = JSON.parse(editor_data);\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(data, null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = false;\n
}\n
});\n
}\n
function waitForSave(gadget) {\n
return loopEventListener(gadget.props.element.getElementsByClassName("save_form")[0], "submit", false, saveSpreadsheet.bind(gadget));\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "body.json"\n
}), gadget.getDeclaredGadget("tableeditor") ]);\n
}).push(function(result_list) {\n
return result_list[1].render(JSON.stringify(JSON.parse(result_list[0]).dp_route_spreadsheet), {\n
minSpareCols: 1,\n
minSpareRows: 1,\n
onChange: function() {\n
if (gadget.timeout) {\n
window.clearTimeout(gadget.timeout);\n
}\n
gadget.timeout = window.setTimeout(saveSpreadsheet.bind(gadget), 100);\n
}\n
});\n
});\n
}).declareMethod("startService", function() {\n
var gadget = this;\n
return this.getDeclaredGadget("tableeditor").push(function(tableeditor) {\n
return RSVP.all([ tableeditor.startService(), waitForSave(gadget) ]);\n
});\n
});\n
})(window, rJS, RSVP, initGadgetMixin, loopEventListener);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3063</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681760.56</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewDemandPlanningapacitySpreadsheet.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Edit Required Capacity Spreadsheet</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Input_viewAvailableCapacitySpreadsheet.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../handsontable/index.html"\n
data-gadget-scope="tableeditor"></div>\n
<form class="save_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-edit ui-btn-icon-right">Save</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>932</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681760.68</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewDemandPlanningapacitySpreadsheet.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, initGadgetMixin, loopEventListener */\n
(function(window, rJS, RSVP, initGadgetMixin, loopEventListener) {\n
"use strict";\n
function saveSpreadsheet(evt) {\n
var gadget = this, editor_data, editor_gadget;\n
return new RSVP.Queue().push(function() {\n
// Prevent double click\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
return gadget.getDeclaredGadget("tableeditor");\n
}).push(function(tablegadget) {\n
editor_gadget = tablegadget;\n
return editor_gadget.getData();\n
}).push(function(data) {\n
editor_data = data;\n
// Always get a fresh version, to prevent deleting spreadsheet & co\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body) {\n
var data = JSON.parse(body);\n
data.capacity_by_station_spreadsheet = JSON.parse(editor_data);\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(data, null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = false;\n
});\n
}\n
function waitForSave(gadget) {\n
return loopEventListener(gadget.props.element.getElementsByClassName("save_form")[0], "submit", false, saveSpreadsheet.bind(gadget));\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "body.json"\n
}), gadget.getDeclaredGadget("tableeditor") ]);\n
}).push(function(result_list) {\n
return result_list[1].render(JSON.stringify(JSON.parse(result_list[0]).capacity_by_station_spreadsheet), {\n
minSpareCols: 1,\n
minSpareRows: 1\n
});\n
});\n
}).declareMethod("startService", function() {\n
var gadget = this;\n
return this.getDeclaredGadget("tableeditor").push(function(tableeditor) {\n
return RSVP.all([ tableeditor.startService(), waitForSave(gadget) ]);\n
});\n
});\n
})(window, rJS, RSVP, initGadgetMixin, loopEventListener);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2729</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681760.13</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewDocumentManagement.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Manage document</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="mixin_promise.js" type="text/javascript"></script>\n
<script src="Input_viewDocumentManagement.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<a class="export_link ui-btn ui-btn-inline ui-icon-action ui-btn-icon-right">Export</a>\n
<form class="knowledge_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-refresh ui-btn-icon-right">Run Knowledge Extraction Tool</button>\n
</form>\n
<form class="delete_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline ui-icon-delete ui-btn-icon-right">Delete</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1150</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681760.25</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewDocumentManagement.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, jQuery,\n
promiseEventListener, initGadgetMixin */\n
(function(window, rJS, RSVP, $, promiseEventListener, initGadgetMixin) {\n
"use strict";\n
function datatouri(data, mime_type) {\n
var result = "data:";\n
if (mime_type !== undefined) {\n
result += mime_type;\n
}\n
return result + ";base64," + window.btoa(data);\n
}\n
function disableAllButtons(gadget) {\n
// Prevent double click\n
var i, button_list = gadget.props.element.getElementsByClassName("ui-btn");\n
for (i = 0; i < button_list.length; i += 1) {\n
button_list[i].disabled = true;\n
}\n
}\n
function waitForKnowledgeExtraction(gadget) {\n
return new RSVP.Queue().push(function() {\n
return promiseEventListener(gadget.props.element.getElementsByClassName("knowledge_form")[0], "submit", false);\n
}).push(function() {\n
disableAllButtons(gadget);\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body_json) {\n
$.mobile.loading("show");\n
// XXX Hardcoded relative URL\n
return gadget.aq_ajax({\n
url: "../../runKnowledgeExtraction",\n
type: "POST",\n
data: body_json,\n
headers: {\n
"Content-Type": "application/json"\n
}\n
});\n
}).push(undefined, function(error) {\n
// Always drop the loader\n
$.mobile.loading("hide");\n
throw error;\n
}).push(function(evt) {\n
$.mobile.loading("hide");\n
var json_data = JSON.parse(evt.target.responseText);\n
if (json_data.success !== true) {\n
throw new Error(json_data.error);\n
}\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(json_data.data, null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
return gadget.whoWantsToDisplayThisDocument(gadget.props.jio_key);\n
}).push(function(url) {\n
return gadget.pleaseRedirectMyHash(url);\n
});\n
}\n
function waitForDeletion(gadget) {\n
return new RSVP.Queue().push(function() {\n
return promiseEventListener(gadget.props.element.getElementsByClassName("delete_form")[0], "submit", false);\n
}).push(function() {\n
disableAllButtons(gadget);\n
// Delete jIO document\n
return gadget.aq_remove({\n
_id: gadget.props.jio_key\n
});\n
}).push(function() {\n
return gadget.whoWantsToDisplayHome();\n
}).push(function(url) {\n
return gadget.pleaseRedirectMyHash(url);\n
});\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_remove", "jio_remove").declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareAcquiredMethod("aq_get", "jio_get").declareAcquiredMethod("aq_ajax", "jio_ajax").declareAcquiredMethod("pleaseRedirectMyHash", "pleaseRedirectMyHash").declareAcquiredMethod("whoWantsToDisplayThisDocument", "whoWantsToDisplayThisDocument").declareAcquiredMethod("whoWantsToDisplayHome", "whoWantsToDisplayHome").declareMethod("render", function(options) {\n
this.props.jio_key = options.id;\n
var gadget = this;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_get({\n
_id: options.id\n
}), gadget.aq_getAttachment({\n
_id: options.id,\n
_attachment: "body.json"\n
}) ]);\n
}).push(function(result_list) {\n
var export_link = gadget.props.element.querySelector(".export_link");\n
export_link.download = result_list[0].data.title;\n
export_link.href = datatouri(result_list[1], "application/json");\n
});\n
}).declareMethod("startService", function() {\n
return RSVP.all([ waitForDeletion(this), waitForKnowledgeExtraction(this) ]);\n
});\n
})(window, rJS, RSVP, jQuery, promiseEventListener, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4364</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681760.35</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewProductionLine.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Edit table</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="mixin_promise.js" type="text/javascript"></script>\n
\n
<script src="Input_viewProductionLine.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../toolbox/index.html"\n
data-gadget-scope="productionline_toolbox"></div>\n
<div data-gadget-url="../jsplumb/index.html"\n
data-gadget-scope="productionline_graph"></div>\n
<form class="save_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-edit ui-btn-icon-right">Save</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>871</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681758.58</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewProductionLine.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global window, rJS, RSVP, loopEventListener*/\n
(function(window, rJS, RSVP, loopEventListener) {\n
"use strict";\n
var gadget_klass = rJS(window);\n
// TODO: save on parent gadget\n
function saveGraph(evt) {\n
var gadget = this;\n
return new RSVP.Queue().push(function() {\n
// Prevent double click\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
}\n
return gadget.getDeclaredGadget("productionline_graph");\n
}).push(function(graph_gadget) {\n
return graph_gadget.getContent();\n
}).push(function(body) {\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(JSON.parse(body), null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = false;\n
}\n
});\n
}\n
function waitForSave(gadget) {\n
return loopEventListener(gadget.props.element.getElementsByClassName("save_form")[0], "submit", false, saveGraph.bind(gadget));\n
}\n
gadget_klass.ready(function(g) {\n
g.props = {};\n
}).ready(function(g) {\n
return g.getElement().push(function(element) {\n
g.props.element = element;\n
});\n
}).declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").allowPublicAcquisition("notifyDataChanged", function() {\n
// We are notified by an included gadget that the data has changed.\n
// Here we save automatically. We could mark a dirty flag to warn the\n
// user if she leaves the page without saving.\n
// Since we are notified quite often and saving is resource expensive, we\n
// use this trick to prevent saving too many times\n
if (this.timeout) {\n
window.clearTimeout(this.timeout);\n
}\n
this.timeout = window.setTimeout(saveGraph.bind(this), 100);\n
}).declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this, data;\n
gadget.props.jio_key = jio_key;\n
return new RSVP.Queue().push(function() {\n
/*jslint nomen: true*/\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "body.json"\n
}), gadget.getDeclaredGadget("productionline_graph") ]);\n
}).push(function(result_list) {\n
data = result_list[0];\n
return result_list[1].render(data);\n
}).push(function() {\n
return gadget.getDeclaredGadget("productionline_toolbox");\n
}).push(function(toolbox_gadget) {\n
toolbox_gadget.render(data);\n
});\n
}).declareMethod("startService", function() {\n
var g = this, graph;\n
return g.getDeclaredGadget("productionline_graph").push(function(graph_gadget) {\n
graph = graph_gadget;\n
return g.getDeclaredGadget("productionline_toolbox");\n
}).push(function(toolbox) {\n
return RSVP.all([ graph.startService(), toolbox.startService(), waitForSave(g) ]);\n
});\n
});\n
})(window, rJS, RSVP, loopEventListener);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3328</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681760.45</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewRequiredCapacitySpreadsheet.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Edit Available Capacity Spreadsheet</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Input_viewRequiredCapacitySpreadsheet.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../handsontable/index.html"\n
data-gadget-scope="tableeditor"></div>\n
<form class="save_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-edit ui-btn-icon-right">Save</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>932</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681760.86</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewRequiredCapacitySpreadsheet.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, initGadgetMixin, loopEventListener */\n
(function(window, rJS, RSVP, initGadgetMixin, loopEventListener) {\n
"use strict";\n
function saveSpreadsheet(evt) {\n
var gadget = this, editor_data, editor_gadget;\n
return new RSVP.Queue().push(function() {\n
// Prevent double click\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
}\n
return gadget.getDeclaredGadget("tableeditor");\n
}).push(function(tablegadget) {\n
editor_gadget = tablegadget;\n
return editor_gadget.getData();\n
}).push(function(data) {\n
editor_data = data;\n
// Always get a fresh version, to prevent deleting spreadsheet & co\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body) {\n
var data = JSON.parse(body);\n
data.capacity_by_project_spreadsheet = JSON.parse(editor_data);\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(data, null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = false;\n
}\n
});\n
}\n
function waitForSave(gadget) {\n
return loopEventListener(gadget.props.element.getElementsByClassName("save_form")[0], "submit", false, saveSpreadsheet.bind(gadget));\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "body.json"\n
}), gadget.getDeclaredGadget("tableeditor") ]);\n
}).push(function(result_list) {\n
return result_list[1].render(JSON.stringify(JSON.parse(result_list[0]).capacity_by_project_spreadsheet), {\n
minSpareRows: 1,\n
onChange: function() {\n
if (gadget.timeout) {\n
window.clearTimeout(gadget.timeout);\n
}\n
gadget.timeout = window.setTimeout(saveSpreadsheet.bind(gadget), 100);\n
}\n
});\n
});\n
}).declareMethod("startService", function() {\n
var gadget = this;\n
return this.getDeclaredGadget("tableeditor").push(function(tableeditor) {\n
return RSVP.all([ tableeditor.startService(), waitForSave(gadget) ]);\n
});\n
});\n
})(window, rJS, RSVP, initGadgetMixin, loopEventListener);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3052</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681760.97</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewResultList.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Result List</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/handlebars.min.js" type="text/javascript"></script>\n
\n
<script id="table-template" type="text/x-handlebars-template">\n
<ul data-role="listview" data-inset="true" class="document-listview">\n
{{#each documentlist}}\n
<li><a href="{{link}}">{{title}}</a></li>\n
{{else}}\n
<p>No result yet.</p>\n
{{/each}}\n
</ul>\n
</script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Input_viewResultList.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<section class="document_list"></section>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>929</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681761.06</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewResultList.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, Handlebars, initGadgetMixin */\n
/*jslint nomen: true */\n
(function(window, rJS, RSVP, Handlebars, initGadgetMixin) {\n
"use strict";\n
/////////////////////////////////////////////////////////////////\n
// Handlebars\n
/////////////////////////////////////////////////////////////////\n
// Precompile the templates while loading the first gadget instance\n
var gadget_klass = rJS(window), source = gadget_klass.__template_element.getElementById("table-template").innerHTML, table_template = Handlebars.compile(source);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("whoWantsToDisplayThisResult", "whoWantsToDisplayThisResult").declareMethod("render", function(options) {\n
var gadget = this;\n
this.props.jio_key = options.id;\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "simulation.json"\n
}).push(undefined, function(error) {\n
if (error.status === 404) {\n
// Simulation not yet generated\n
return JSON.stringify([]);\n
}\n
throw error;\n
}).push(function(sim_json) {\n
var document_list = JSON.parse(sim_json), result_list = [], i;\n
for (i = 0; i < document_list.length; i += 1) {\n
result_list.push(RSVP.all([ gadget.whoWantsToDisplayThisResult(gadget.props.jio_key, i), document_list[i].score, document_list[i].key ]));\n
}\n
return RSVP.all(result_list);\n
}).push(function(document_list) {\n
var i, parameter_list = [], doc;\n
for (i = 0; i < document_list.length; i += 1) {\n
doc = document_list[i];\n
parameter_list[i] = {\n
link: doc[0],\n
title: doc[1] + " " + doc[2]\n
};\n
}\n
gadget.props.element.querySelector(".document_list").innerHTML = table_template({\n
documentlist: parameter_list\n
});\n
});\n
});\n
})(window, rJS, RSVP, Handlebars, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2148</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681761.17</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewShiftSpreadsheet.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Edit Shift Spreadsheet</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Input_viewShiftSpreadsheet.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../handsontable/index.html"\n
data-gadget-scope="tableeditor"></div>\n
<form class="save_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-edit ui-btn-icon-right">Save</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>908</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681761.28</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewShiftSpreadsheet.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, initGadgetMixin, loopEventListener */\n
(function(window, rJS, RSVP, initGadgetMixin, loopEventListener) {\n
"use strict";\n
function saveSpreadsheet(evt) {\n
var gadget = this, editor_data, editor_gadget;\n
return new RSVP.Queue().push(function() {\n
// Prevent double click\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
}\n
return gadget.getDeclaredGadget("tableeditor");\n
}).push(function(tablegadget) {\n
editor_gadget = tablegadget;\n
return editor_gadget.getData();\n
}).push(function(data) {\n
editor_data = data;\n
// Always get a fresh version, to prevent deleting spreadsheet & co\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body) {\n
var data = JSON.parse(body);\n
data.shift_spreadsheet = JSON.parse(editor_data);\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(data, null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = false;\n
}\n
});\n
}\n
function waitForSave(gadget) {\n
return loopEventListener(gadget.props.element.getElementsByClassName("save_form")[0], "submit", false, saveSpreadsheet.bind(gadget));\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "body.json"\n
}), gadget.getDeclaredGadget("tableeditor") ]);\n
}).push(function(result_list) {\n
return result_list[1].render(JSON.stringify(JSON.parse(result_list[0]).shift_spreadsheet), {\n
minSpareRows: 1,\n
onChange: function() {\n
if (gadget.timeout) {\n
window.clearTimeout(gadget.timeout);\n
}\n
gadget.timeout = window.setTimeout(saveSpreadsheet.bind(gadget), 100);\n
}\n
});\n
});\n
}).declareMethod("startService", function() {\n
var gadget = this;\n
return this.getDeclaredGadget("tableeditor").push(function(tableeditor) {\n
return RSVP.all([ tableeditor.startService(), waitForSave(gadget) ]);\n
});\n
});\n
})(window, rJS, RSVP, initGadgetMixin, loopEventListener);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3024</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681761.43</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewSimulation.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Run Simulation</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/handlebars.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script id="label-template" type="text/x-handlebars-template">\n
<label>{{label}}</label>\n
</script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="mixin_promise.js" type="text/javascript"></script>\n
<script src="Input_viewSimulation.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<form class="run_form">\n
<fieldset>\n
<div data-gadget-url="../fieldset/index.html"\n
data-gadget-scope="fieldset"></div>\n
</fieldset>\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-refresh ui-btn-icon-right">Run Simulation</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1205</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681758.69</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewSimulation.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, jQuery, promiseEventListener, initGadgetMixin */\n
/*jslint nomen: true */\n
(function(window, rJS, RSVP, $, promiseEventListener, initGadgetMixin) {\n
"use strict";\n
function saveForm(gadget) {\n
var general;\n
return gadget.getDeclaredGadget("fieldset").push(function(fieldset_gadget) {\n
return fieldset_gadget.getContent();\n
}).push(function(content) {\n
general = content;\n
// Always get a fresh version, to prevent deleting spreadsheet & co\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body) {\n
var data = JSON.parse(body);\n
data.general = general;\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(data, null, 2),\n
_mimetype: "application/json"\n
});\n
});\n
}\n
function runSimulation(gadget) {\n
return new RSVP.Queue().push(function() {\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body_json) {\n
// XXX Hardcoded relative URL\n
return gadget.aq_ajax({\n
url: "../../runSimulation",\n
type: "POST",\n
data: body_json,\n
headers: {\n
"Content-Type": "application/json"\n
}\n
});\n
}).push(function(evt) {\n
var json_data = JSON.parse(evt.target.responseText);\n
if (json_data.success !== true) {\n
throw new Error(json_data.error);\n
}\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "simulation.json",\n
_data: JSON.stringify(json_data.data, null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
return gadget.whoWantsToDisplayThisDocument(gadget.props.jio_key, "view_result");\n
}).push(function(url) {\n
return gadget.pleaseRedirectMyHash(url);\n
});\n
}\n
function waitForRunSimulation(gadget) {\n
var submit_evt;\n
return new RSVP.Queue().push(function() {\n
return promiseEventListener(gadget.props.element.getElementsByClassName("run_form")[0], "submit", false);\n
}).push(function(evt) {\n
submit_evt = evt;\n
// Prevent double click\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
$.mobile.loading("show");\n
return saveForm(gadget);\n
}).push(function() {\n
return runSimulation(gadget);\n
}).push(undefined, function(error) {\n
// Always drop the loader\n
$.mobile.loading("hide");\n
throw error;\n
}).push(function() {\n
submit_evt.target.getElementsByClassName("ui-btn")[0].disabled = false;\n
$.mobile.loading("hide");\n
});\n
}\n
/////////////////////////////////////////////////////////////////\n
// Handlebars\n
/////////////////////////////////////////////////////////////////\n
// Precompile the templates while loading the first gadget instance\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareAcquiredMethod("aq_ajax", "jio_ajax").declareAcquiredMethod("pleaseRedirectMyHash", "pleaseRedirectMyHash").declareAcquiredMethod("whoWantsToDisplayThisDocument", "whoWantsToDisplayThisDocument").declareMethod("render", function(options) {\n
var gadget = this, data;\n
this.props.jio_key = options.id;\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
}).push(function(json) {\n
var application_configuration = {};\n
data = JSON.parse(json);\n
application_configuration = data.application_configuration.general || {};\n
return gadget.getDeclaredGadget("fieldset").push(function(fieldset_gadget) {\n
return fieldset_gadget.render({\n
value: data.general,\n
property_definition: application_configuration\n
});\n
});\n
});\n
}).declareMethod("startService", function() {\n
return waitForRunSimulation(this);\n
});\n
})(window, rJS, RSVP, jQuery, promiseEventListener, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4723</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.53</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewTable.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Edit table</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Input_viewTable.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../handsontable/index.html"\n
data-gadget-scope="tableeditor"></div>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>583</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.63</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewTable.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global console, rJS, RSVP, initGadgetMixin */\n
(function(window, rJS, RSVP, initGadgetMixin) {\n
"use strict";\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "body.json"\n
}), gadget.getDeclaredGadget("tableeditor") ]);\n
}).push(function(result_list) {\n
return result_list[1].render(JSON.stringify(JSON.parse(result_list[0]).wip_part_spreadsheet));\n
});\n
}).declareMethod("startService", function() {\n
return this.getDeclaredGadget("tableeditor").push(function(tableeditor) {\n
return tableeditor.startService();\n
});\n
});\n
})(window, rJS, RSVP, initGadgetMixin);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1032</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681761.56</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewWipPartSpreadsheet.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Edit Wip Part Spreadsheet</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="mixin_promise.js" type="text/javascript"></script>\n
<script src="Input_viewWipPartSpreadsheet.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../handsontable/index.html"\n
data-gadget-scope="tableeditor"></div>\n
<form class="save_form">\n
<button type="submit" class="ui-btn ui-btn-b ui-btn-inline\n
ui-icon-edit ui-btn-icon-right">Save</button>\n
</form>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>981</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681761.66</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Input_viewWipPartSpreadsheet.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, initGadgetMixin, loopEventListener */\n
(function(window, rJS, RSVP, initGadgetMixin, loopEventListener) {\n
"use strict";\n
function saveSpreadsheet(evt) {\n
var gadget = this, editor_data, editor_gadget;\n
return new RSVP.Queue().push(function() {\n
// Prevent double click\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = true;\n
}\n
return gadget.getDeclaredGadget("tableeditor");\n
}).push(function(tablegadget) {\n
editor_gadget = tablegadget;\n
return editor_gadget.getData();\n
}).push(function(data) {\n
editor_data = data;\n
// Always get a fresh version, to prevent deleting spreadsheet & co\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json"\n
});\n
}).push(function(body) {\n
var data = JSON.parse(body);\n
data.wip_part_spreadsheet = JSON.parse(editor_data);\n
return gadget.aq_putAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "body.json",\n
_data: JSON.stringify(data, null, 2),\n
_mimetype: "application/json"\n
});\n
}).push(function() {\n
if (evt) {\n
evt.target.getElementsByClassName("ui-btn")[0].disabled = false;\n
}\n
});\n
}\n
function waitForSave(gadget) {\n
return loopEventListener(gadget.props.element.getElementsByClassName("save_form")[0], "submit", false, saveSpreadsheet.bind(gadget));\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareAcquiredMethod("aq_putAttachment", "jio_putAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "body.json"\n
}), gadget.getDeclaredGadget("tableeditor") ]);\n
}).push(function(result_list) {\n
return result_list[1].render(JSON.stringify(JSON.parse(result_list[0]).wip_part_spreadsheet), {\n
minSpareRows: 1,\n
onChange: function() {\n
if (gadget.timeout) {\n
window.clearTimeout(gadget.timeout);\n
}\n
gadget.timeout = window.setTimeout(saveSpreadsheet.bind(gadget), 100);\n
}\n
});\n
});\n
}).declareMethod("startService", function() {\n
var gadget = this;\n
return this.getDeclaredGadget("tableeditor").push(function(tableeditor) {\n
return RSVP.all([ tableeditor.startService(), waitForSave(gadget) ]);\n
});\n
});\n
})(window, rJS, RSVP, initGadgetMixin, loopEventListener);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3030</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681761.76</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewCapacityUtilisationGraph.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Stations Utilization</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquery.flot.js"></script>\n
<script src="../lib/jquery.flot.stack.js"></script>\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Output_viewCapacityUtilisationGraph.js" type="text/javascript"></script>\n
</head>\n
<body>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>684</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681761.88</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewCapacityUtilisationGraph.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, jQuery, initGadgetMixin */\n
/*jslint unparam: true */\n
(function(window, rJS, $, initGadgetMixin) {\n
"use strict";\n
function capacity_utilisation_graph_widget(all_data) {\n
var available_capacity_by_station = {}, station_id, series, graph_list = [], options, capacity_usage_by_station = {}, input_data = all_data.input, output_data = all_data.result;\n
// Compute availability by station\n
$.each(input_data.nodes, function(idx, obj) {\n
var available_capacity = [];\n
if (obj.intervalCapacity !== undefined) {\n
$.each(obj.intervalCapacity, function(i, capacity) {\n
available_capacity.push([ i, capacity ]);\n
});\n
available_capacity_by_station[obj.id] = available_capacity;\n
}\n
});\n
// Compute used capacity by station\n
$.each(output_data.elementList.sort(function(a, b) {\n
return a.id < b.id ? -1 : 1;\n
}), function(idx, obj) {\n
if (obj.results !== undefined && obj.results.capacityUsed !== undefined) {\n
var capacity_usage = [];\n
$.each(obj.results.capacityUsed, function(i, step) {\n
var period = 0, usage = 0;\n
$.each(step, function(k, v) {\n
if (k === "period") {\n
period = v;\n
}\n
});\n
$.each(step, function(k, v) {\n
if (k !== "utilization" && k !== "period") {\n
usage += v;\n
}\n
});\n
capacity_usage.push([ period, usage ]);\n
});\n
capacity_usage_by_station[obj.id] = capacity_usage;\n
}\n
});\n
for (station_id in available_capacity_by_station) {\n
if (available_capacity_by_station.hasOwnProperty(station_id)) {\n
series = [ {\n
label: "Capacity",\n
data: available_capacity_by_station[station_id],\n
color: "green"\n
}, {\n
label: "Utilisation",\n
data: capacity_usage_by_station[station_id],\n
color: "red"\n
} ];\n
options = {\n
series: {\n
lines: {\n
show: true,\n
fill: true\n
}\n
}\n
};\n
graph_list.push([ input_data.nodes[station_id].name || station_id, series, options ]);\n
}\n
}\n
return graph_list;\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
gadget.props.result = options.result;\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "simulation.json"\n
}).push(function(simulation_json) {\n
gadget.props.result_list = capacity_utilisation_graph_widget(JSON.parse(simulation_json)[gadget.props.result]);\n
});\n
}).declareMethod("startService", function() {\n
var element = $(this.props.element), graph;\n
$.each(this.props.result_list, function(idx, result) {\n
graph = $("<div class=\'capacity_graph\' " + "style=\'width: 70%; height: 250px\'></div>");\n
element.append($("<h2>").text(result[0]), graph);\n
$.plot(graph, result[1], result[2]);\n
});\n
});\n
})(window, rJS, jQuery, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3769</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.0</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewDebugJson.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Debug JSON</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Output_viewDebugJson.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<label for="json_input">Input</label>\n
<textarea spellcheck="false" rows="20" name="json_input" class="json_input"></textarea>\n
<label for="json_output">Output</label>\n
<textarea spellcheck="false" rows="20" name="json_output" class="json_output"></textarea>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>757</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.09</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewDebugJson.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global rJS, initGadgetMixin */\n
(function(window, rJS, initGadgetMixin) {\n
"use strict";\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareMethod("render", function(options) {\n
var gadget = this;\n
this.props.jio_key = options.id;\n
this.props.result = options.result;\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "simulation.json"\n
}).push(function(result_json) {\n
var result = JSON.parse(result_json);\n
gadget.props.element.querySelector(".json_input").textContent = JSON.stringify(result[gadget.props.result].input, undefined, " ");\n
gadget.props.element.querySelector(".json_output").textContent = JSON.stringify(result[gadget.props.result].result, undefined, " ");\n
});\n
});\n
})(window, rJS, initGadgetMixin);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>954</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.21</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewDownloadExcelSpreadsheet.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Download Excel Spreadsheet</title>\n
\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Output_viewDownloadExcelSpreadsheet.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<a class="download_link ui-btn ui-btn-inline ui-icon-action ui-btn-icon-right">Download</a>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>682</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.31</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewDownloadExcelSpreadsheet.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global rJS, RSVP, jQuery, initGadgetMixin */\n
/*jslint nomen: true, unparam: true */\n
(function(window, rJS, RSVP, $, initGadgetMixin) {\n
"use strict";\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
gadget.props.result = options.result;\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "simulation.json"\n
}).push(function(simulation_json) {\n
var result = JSON.parse(simulation_json)[0].result, download_link = gadget.props.element.querySelector(".download_link");\n
download_link.download = "demandPlannerOutput.xls";\n
download_link.href = "data:application/excel;base64," + result["demandPlannerOutput.xls"];\n
});\n
}).declareMethod("startService", function() {\n
return new RSVP.Queue().push(function() {\n
// Infinite wait, until cancelled\n
return new RSVP.defer().promise;\n
});\n
});\n
})(window, rJS, RSVP, jQuery, initGadgetMixin);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1223</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.42</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewExitStatistics.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Exit Statistics</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/handlebars.min.js" type="text/javascript"></script>\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Output_viewExitStatistics.js" type="text/javascript"></script>\n
\n
<script id="interval-through-metric-template" type="text/x-handlebars-template">\n
<tr>\n
<td>Daily Attainment</td>\n
<td>\n
{{#interval_list}}\n
<i class="ui-link ui-btn ui-icon-{{icon}} ui-btn-inline ui-cornel-all ui-btn-icon-right">{{interval}}</i><br/>\n
{{/interval_list}}\n
</td>\n
</tr>\n
<tr>\n
<td>Average Daily Line Attainment</td>\n
<td>{{average}}%<td>\n
</tr>\n
</script>\n
\n
<script id="simple-metric-template" type="text/x-handlebars-template">\n
<tr>\n
<td>{{metric}}</td>\n
<td>{{{value}}}</td>\n
</tr>\n
</script>\n
\n
<script id="metric-object-template" type="text/x-handlebars-template">\n
<table width=\'100%\'>\n
<tbody>\n
<tr>\n
<td>Average</td>\n
<td>{{avg}}</td>\n
</tr>\n
<tr>\n
<td>Lower Bound</td>\n
<td>{{lb}}</td>\n
</tr>\n
<tr>\n
<td>Upper Bound</td>\n
<td>{{ub}}</td>\n
</tr>\n
</tbody>\n
</table>\n
</script>\n
\n
<script id="header-template" type="text/x-handlebars-template">\n
<tr>\n
<th colspan=\'2\'>{{name}}</th>\n
</tr>\n
</script>\n
\n
</head>\n
<body>\n
<table>\n
</table>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1813</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.74</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewExitStatistics.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, Handlebars,\n
initGadgetMixin */\n
/*jslint nomen: true */\n
(function(window, rJS, Handlebars, initGadgetMixin) {\n
"use strict";\n
/////////////////////////////////////////////////////////////////\n
// Handlebars\n
/////////////////////////////////////////////////////////////////\n
// Precompile the templates while loading the first gadget instance\n
var gadget_klass = rJS(window), header_source = gadget_klass.__template_element.getElementById("header-template").innerHTML, header_template = Handlebars.compile(header_source), metric_object_source = gadget_klass.__template_element.getElementById("metric-object-template").innerHTML, metric_object_template = Handlebars.compile(metric_object_source), metric_simple_source = gadget_klass.__template_element.getElementById("simple-metric-template").innerHTML, metric_simple_template = Handlebars.compile(metric_simple_source), metric_interval_source = gadget_klass.__template_element.getElementById("interval-through-metric-template").innerHTML, metric_interval_template = Handlebars.compile(metric_interval_source);\n
/////////////////////////////////////////////////////////////////\n
// Calculate widget\n
/////////////////////////////////////////////////////////////////\n
function calculate_average(attainment_list) {\n
return (attainment_list.reduce(function(a, b) {\n
return a + b;\n
}) / attainment_list.length * 100).toFixed(2);\n
}\n
function calculate_exit_stat(data) {\n
var output_data = data.result, input_data = data.input, elementList = output_data.elementList, i, j, metric, metric_value, element, interval_value, interval_list, attainment_list, throughputTarget = input_data.general.throughputTarget, result = "";\n
for (i = 0; i < elementList.length; i += 1) {\n
element = elementList[i];\n
if (element.family === "Exit") {\n
result += "<table>";\n
result += header_template({\n
name: element.name || element.id\n
});\n
for (metric in element.results) {\n
if (element.results.hasOwnProperty(metric)) {\n
metric_value = element.results[metric];\n
if (metric === "intervalThroughputList") {\n
interval_list = [];\n
attainment_list = [];\n
for (j = 0; j < metric_value.length; j += 1) {\n
interval_value = metric_value[j];\n
attainment_list.push(interval_value / throughputTarget);\n
if (interval_value > throughputTarget) {\n
interval_list.push({\n
interval: interval_value,\n
icon: "check"\n
});\n
} else {\n
interval_list.push({\n
interval: interval_value,\n
icon: "delete"\n
});\n
}\n
}\n
result += metric_interval_template({\n
interval_list: interval_list,\n
average: calculate_average(attainment_list)\n
});\n
} else {\n
if (typeof metric_value === "object") {\n
if (metric_value.ub === metric_value.lb) {\n
metric_value = metric_value.ub;\n
} else {\n
metric_value.metric = metric;\n
metric_value.avg = metric_value.avg.toFixed(2);\n
metric_value.lb = metric_value.lb.toFixed(2);\n
metric_value.ub = metric_value.ub.toFixed(2);\n
metric_value = metric_object_template(metric_value);\n
}\n
}\n
if (typeof metric_value === "number") {\n
metric_value = metric_value.toFixed(2);\n
}\n
// Rename some metric to something more meaningful\n
if (metric === "lifespan") {\n
metric = "Cycle Time";\n
}\n
if (metric === "takt_time") {\n
metric = "Average Departure Rate";\n
}\n
result += metric_simple_template({\n
metric: metric,\n
value: metric_value\n
});\n
}\n
}\n
}\n
result += "</table>";\n
}\n
}\n
return result;\n
}\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
gadget.props.result = options.result;\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "simulation.json"\n
}).push(function(simulation_json) {\n
var result = calculate_exit_stat(JSON.parse(simulation_json)[gadget.props.result]);\n
gadget.props.element.innerHTML = result;\n
});\n
});\n
})(window, rJS, Handlebars, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>5794</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.84</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewJobGantt.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Job Gantt</title>\n
<link rel="stylesheet" href="../lib/dhtmlxgantt.css">\n
\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/dhtmlxgantt.js" type="text/javascript"></script>\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Output_viewJobGantt.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div class="gant_container" style="height: 800px;"></div>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>745</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681762.95</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewJobGantt.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, jQuery, gantt,\n
initGadgetMixin */\n
/*jslint nomen: true, unparam: true */\n
(function(window, rJS, RSVP, $, gantt, initGadgetMixin) {\n
"use strict";\n
gantt.templates.task_class = function(start, end, obj) {\n
return obj.parent ? "sub_task" : "";\n
};\n
function job_gantt_widget(all_data) {\n
// XXX: use dhx_gantt zoom level feature (\n
// http://dhtmlx.com/docs/products/dhtmlxGantt/02_features.html )\n
var now = new Date(), start_date, gantt_data = {\n
data: [ {\n
id: "by_order",\n
text: "By Order",\n
start_date: start_date,\n
duration: 0,\n
project: 1,\n
open: true\n
}, {\n
id: "by_station",\n
text: "By Station",\n
start_date: start_date,\n
duration: 0,\n
project: 1,\n
open: true\n
} ],\n
link: []\n
}, input_data = all_data.input, output_data = all_data.result;\n
// temporary hack\n
now.setHours(0);\n
now.setMinutes(0);\n
now.setSeconds(0);\n
start_date = input_data.general.currentDate;\n
if (start_date !== undefined && start_date !== "") {\n
start_date = new Date(start_date);\n
} else {\n
start_date = new Date(now.getTime());\n
}\n
function isVisibleStation(station) {\n
// we should be able to define in the backend which\n
// station is visible\n
return input_data.nodes[station].family !== "Buffer" && input_data.nodes[station].family !== "Exit";\n
}\n
$.each(output_data.elementList.sort(function(a, b) {\n
return a.id < b.id ? -1 : 1;\n
}), function(idx, obj) {\n
var input_job = null, input_order = null, i, j, node, node_key, order, component, duration, seen_parts = {};\n
if (obj.family === "Job") {\n
// find the corresponding input\n
// find the input order and order component for this job\n
for (node_key in input_data.nodes) {\n
if (input_data.nodes.hasOwnProperty(node_key)) {\n
node = input_data.nodes[node_key];\n
if (node.wip) {\n
for (i = 0; i < node.wip.length; i += 1) {\n
order = node.wip[i];\n
if (order.id === obj.id) {\n
input_job = input_order = order;\n
}\n
if (input_job === null && order.componentsList) {\n
for (j = 0; j < order.componentsList.length; j += 1) {\n
component = order.componentsList[j];\n
if (component.id === obj.id) {\n
input_order = order;\n
input_job = component;\n
}\n
}\n
}\n
}\n
}\n
}\n
}\n
duration = 0;\n
if (input_job === input_order) {\n
// if we are on the order definition\n
gantt_data.data.push({\n
id: input_order.id,\n
text: input_order.name,\n
project: 1,\n
open: false,\n
parent: "by_order"\n
});\n
}\n
seen_parts = {};\n
$.each(obj.results.schedule, function(i, schedule) {\n
var task_start_date, job_full_id;\n
// Filter intermediate steps in part job shop\n
if (isVisibleStation(schedule.stationId)) {\n
if (schedule.exitTime) {\n
duration = 24 * (schedule.exitTime - schedule.entranceTime);\n
} else {\n
if (obj.results.schedule[i + 1]) {\n
duration = obj.results.schedule[i + 1].entranceTime - schedule.entranceTime;\n
} else {\n
duration = obj.results.completionTime - schedule.entranceTime;\n
}\n
}\n
if (duration > 0) {\n
task_start_date = new Date(start_date.getTime());\n
// for simulation time unit as days\n
// task_start_date.setDate(task_start_date.getDate() +\n
// schedule[\'entranceTime\']);\n
// for simulation time unit as days hours\n
task_start_date.setTime(task_start_date.getTime() + schedule.entranceTime * 1e3 * 3600 * 24);\n
job_full_id = input_job.id + "." + input_order.id;\n
if (seen_parts[job_full_id] === undefined) {\n
gantt_data.data.push({\n
id: job_full_id,\n
text: input_job.name,\n
parent: input_order.id\n
});\n
seen_parts[job_full_id] = 1;\n
}\n
gantt_data.data.push({\n
id: input_order.id + "." + idx + "_" + i,\n
text: schedule.stationId,\n
start_date: task_start_date,\n
duration: duration,\n
parent: job_full_id\n
});\n
gantt_data.data.push({\n
id: "job." + obj.id + "." + idx + "_" + i,\n
text: input_order.name + "-" + input_job.name,\n
start_date: task_start_date,\n
duration: duration,\n
parent: schedule.stationId,\n
by_station: 1\n
});\n
}\n
}\n
});\n
} else {\n
if (isVisibleStation(obj.id)) {\n
gantt_data.data.push({\n
id: obj.id,\n
text: obj.id,\n
project: 1,\n
open: false,\n
parent: "by_station"\n
});\n
}\n
}\n
});\n
// gantt_output_height = 35 * (gantt_data.data.length + 1) + 1;\n
gantt_data.data.sort(function(a, b) {\n
// sort gantt data in a chronological order\n
var result;\n
if (a.start_date === undefined && b.start_date !== undefined) {\n
result = 1;\n
} else if (a.start_date !== undefined && b.start_date === undefined) {\n
result = -1;\n
} else if (a.start_date === undefined && b.start_date === undefined) {\n
result = 0;\n
} else if (a.start_date > b.start_date) {\n
result = 1;\n
} else if (a.start_date < b.start_date) {\n
result = -1;\n
} else {\n
result = 0;\n
}\n
return result;\n
});\n
return gantt_data;\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
gadget.props.result = options.result;\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "simulation.json"\n
}).push(function(simulation_json) {\n
gadget.props.result = job_gantt_widget(JSON.parse(simulation_json)[gadget.props.result]);\n
});\n
}).declareMethod("startService", function() {\n
$(this.props.element).find(".gant_container").dhx_gantt({\n
data: this.props.result,\n
readonly: true,\n
/* for days has simulation time unit\n
scale_unit: \'day\',\n
step: 7\n
*/\n
// for hours has simulation time unit\n
scale_unit: "day",\n
duration_unit: 60 * 60 * 1e3,\n
//date_grid: "%H:%i",\n
date_scale: "%M/%d",\n
step: 1,\n
subscales: [ {\n
unit: "hour",\n
step: 4,\n
date: "%H:%i"\n
} ]\n
});\n
return new RSVP.Queue().push(function() {\n
// Infinite wait, until cancelled\n
return new RSVP.defer().promise;\n
}).push(undefined, function(error) {\n
gantt.clearAll();\n
throw error;\n
});\n
});\n
})(window, rJS, RSVP, jQuery, gantt, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>9180</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681763.05</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewJobScheduleSpreadsheet.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Job Schedule</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
\n
<script src="../lib/moment.js" type="text/javascript"></script>\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Output_viewJobScheduleSpreadsheet.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div data-gadget-url="../handsontable/index.html"\n
data-gadget-scope="tableeditor"></div>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>671</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681763.17</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewJobScheduleSpreadsheet.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, moment, initGadgetMixin */\n
/*jslint nomen: true */\n
(function(window, rJS, RSVP, moment, initGadgetMixin) {\n
"use strict";\n
function job_schedule_spreadsheet_widget(all_data) {\n
var now = new Date(), name, input_data = all_data.input, output_data = all_data.result, spreadsheet_data = [], spreadsheet_header = [ [ "Jobs", "ID", "Project Manager", "Due Date", "Priority", "Entrance Time", "Processing Time", "Station ID", "Step No." ] ], simulation_start_date = new Date(input_data.general.currentDate || now.getTime()), i, j, k, obj, node, component, order, node_id, due_date, entrance_date, duration, schedule, input_job = null, input_order = null;\n
// XXX why ?\n
now.setHours(0);\n
now.setMinutes(0);\n
now.setSeconds(0);\n
// XXX: time unit for later\n
// or an utility function to map sim time to real time & vice\n
// versa.\n
for (i = 0; i < output_data.elementList.length; i += 1) {\n
obj = output_data.elementList[i];\n
if (obj.family === "Job") {\n
input_job = null;\n
input_order = null;\n
// find the input order and order component for this job\n
// XXX this has no real meaning with capacity project\n
for (node_id in input_data.nodes) {\n
if (input_data.nodes.hasOwnProperty(node_id)) {\n
node = input_data.nodes[node_id];\n
if (node.wip) {\n
for (j = 0; j < node.wip.length; j += 1) {\n
order = node.wip[j];\n
if (order.id === obj.id) {\n
input_job = input_order = order;\n
}\n
if (input_job === null && order.componentsList) {\n
for (k = 0; k < order.componentsList.length; k += 1) {\n
component = order.componentsList[k];\n
if (component.id === obj.id) {\n
input_order = order;\n
input_job = component;\n
}\n
}\n
}\n
}\n
}\n
}\n
}\n
// XXX does not make sense in the case of capacity project\n
due_date = new Date(simulation_start_date.getTime() + input_order.dueDate * 1e3 * 3600);\n
for (j = 0; j < obj.results.schedule.length; j += 1) {\n
schedule = obj.results.schedule[j];\n
entrance_date = new Date(simulation_start_date.getTime() + // XXX: time unit\n
schedule.entranceTime * 1e3 * 3600);\n
duration = 0;\n
if (schedule.exitTime) {\n
duration = schedule.exitTime - schedule.entranceTime * 24;\n
} else {\n
// When duration is not returned by ManPy, it is calculated by\n
// difference of entranceTime of this step and entranceTime of the\n
// next step, or completionTime when this is the last step\n
if (j + 1 === obj.results.schedule.length) {\n
duration = obj.results.completionTime - schedule.entranceTime;\n
} else {\n
duration = obj.results.schedule[j + 1].entranceTime - schedule.entranceTime;\n
}\n
}\n
name = "";\n
if (obj._class === "Dream.CapacityProject") {\n
name = input_order.name + "-" + schedule.stationId;\n
} else {\n
name = input_order.name + "-" + input_job.name;\n
}\n
// Duration is calculated by difference of entranceTime of this\n
// step and entranceTime of the next step, or completionTime when\n
// this is the last step\n
if (j + 1 === obj.results.schedule.length) {\n
duration = obj.results.completionTime - schedule.entranceTime;\n
} else {\n
duration = obj.results.schedule[j + 1].entranceTime - schedule.entranceTime;\n
}\n
spreadsheet_data.push([ // XXX this label is incorrect for design step, during design\n
// phase we still have an order and not an order component.\n
name, obj.id, input_order.manager, moment(due_date).format("YYYY/MM/DD"), input_order.priority, moment(entrance_date).format("MMM/DD HH:mm"), duration, schedule.stationId, j ]);\n
}\n
}\n
}\n
if (spreadsheet_data.length > 1) {\n
// Sort the spreadsheet data to an order convenient for end users\n
// XXX: search for a default cmp in javascript\n
spreadsheet_data.sort(function(a, b) {\n
var result = 0, order_id_a, order_id_b, entrance_a, entrance_b;\n
order_id_a = a[0].split("-")[0];\n
order_id_b = b[0].split("-")[0];\n
if (order_id_a !== order_id_b) {\n
if (order_id_a > order_id_b) {\n
result = 1;\n
} else {\n
result = -1;\n
}\n
} else {\n
entrance_a = a[4];\n
entrance_b = b[4];\n
if (entrance_a > entrance_b) {\n
result = 1;\n
} else if (entrance_a < entrance_b) {\n
result = -1;\n
} else {\n
result = 0;\n
}\n
}\n
return result;\n
});\n
}\n
return spreadsheet_header.concat(spreadsheet_data);\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
gadget.props.result = options.result;\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ gadget.aq_getAttachment({\n
_id: jio_key,\n
_attachment: "simulation.json"\n
}), gadget.getDeclaredGadget("tableeditor") ]);\n
}).push(function(result_list) {\n
return result_list[1].render(JSON.stringify(job_schedule_spreadsheet_widget(JSON.parse(result_list[0])[gadget.props.result])));\n
});\n
}).declareMethod("startService", function() {\n
return this.getDeclaredGadget("tableeditor").push(function(tableeditor) {\n
return tableeditor.startService();\n
});\n
});\n
})(window, rJS, RSVP, moment, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>7105</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681763.27</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewQueueStatGraph.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Queues Statistics</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.flot.js"></script>\n
<script src="../lib/jquery.flot.stack.js"></script>\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Output_viewQueueStatGraph.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div class="graph_container" style="width: 100%;height:300px"></div>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>676</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681763.37</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewQueueStatGraph.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global rJS, jQuery, initGadgetMixin */\n
/*jslint nomen: true, unparam: true */\n
(function(window, rJS, $, initGadgetMixin) {\n
"use strict";\n
function queue_stat_widget(output_data) {\n
/* FIXME: does not support more than one replic.\n
* + see george email to integrate without the need of an EG\n
*/\n
var series = [];\n
$.each(output_data.elementList, function(idx, el) {\n
if (el.family === "Buffer") {\n
series.push({\n
label: el.name || el.id,\n
data: el.results.wip_stat_list\n
});\n
}\n
});\n
return series;\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
gadget.props.result = options.result;\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "simulation.json"\n
}).push(function(simulation_json) {\n
gadget.props.series = queue_stat_widget(JSON.parse(simulation_json)[gadget.props.result].result);\n
});\n
}).declareMethod("startService", function() {\n
// XXX Manually calculate width and height when resizing\n
$.plot(this.props.element.querySelector(".graph_container"), this.props.series);\n
});\n
})(window, rJS, jQuery, initGadgetMixin);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1519</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681763.61</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewStationUtilisationGraph.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Stations Utilization</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquery.flot.js"></script>\n
<script src="../lib/jquery.flot.stack.js"></script>\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="Output_viewStationUtilisationGraph.js" type="text/javascript"></script>\n
</head>\n
<body>\n
<div class="graph_container" style="width: 100%;height:300px"></div>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>756</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681763.72</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>Output_viewStationUtilisationGraph.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, jQuery, initGadgetMixin */\n
/*jslint unparam: true */\n
(function(window, rJS, $, initGadgetMixin) {\n
"use strict";\n
function station_utilisation_graph_widget(output_data) {\n
var blockage_data = [], waiting_data = [], failure_data = [], working_data = [], ticks = [], counter = 1, series, options;\n
// XXX output is still elementList ???\n
$.each(output_data.elementList.sort(function(a, b) {\n
return a.id < b.id ? -1 : 1;\n
}), function(idx, obj) {\n
// add each object that has a working ratio\n
if (obj.results !== undefined && obj.results.working_ratio !== undefined) {\n
/* when there is only one replication, the ratio is given as a float,\n
otherwise we have a mapping avg, ub lb */\n
var blockage_ratio = 0, working_ratio = 0, waiting_ratio = 0, failure_ratio = 0;\n
if (obj.results.blockage_ratio !== undefined) {\n
if (obj.results.blockage_ratio.avg !== undefined) {\n
blockage_ratio = obj.results.blockage_ratio.avg;\n
} else {\n
blockage_ratio = obj.results.blockage_ratio;\n
}\n
}\n
blockage_data.push([ counter, blockage_ratio ]);\n
// XXX merge setup & loading ratio in working ratio for now\n
if (obj.results.setup_ratio !== undefined) {\n
if (obj.results.setup_ratio.avg !== undefined) {\n
working_ratio += obj.results.setup_ratio.avg;\n
} else {\n
working_ratio += obj.results.setup_ratio;\n
}\n
}\n
if (obj.results.loading_ratio !== undefined) {\n
if (obj.results.loading_ratio.avg !== undefined) {\n
working_ratio += obj.results.loading_ratio.avg;\n
} else {\n
working_ratio += obj.results.loading_ratio;\n
}\n
}\n
if (obj.results.working_ratio !== undefined) {\n
if (obj.results.working_ratio.avg !== undefined) {\n
working_ratio += obj.results.working_ratio.avg;\n
} else {\n
working_ratio += obj.results.working_ratio;\n
}\n
}\n
working_data.push([ counter, working_ratio ]);\n
if (obj.results.waiting_ratio !== undefined) {\n
if (obj.results.waiting_ratio.avg !== undefined) {\n
waiting_ratio = obj.results.waiting_ratio.avg;\n
} else {\n
waiting_ratio = obj.results.waiting_ratio;\n
}\n
}\n
waiting_data.push([ counter, waiting_ratio ]);\n
if (obj.results.failure_ratio !== undefined) {\n
if (obj.results.failure_ratio.avg !== undefined) {\n
failure_ratio = obj.results.failure_ratio.avg;\n
} else {\n
failure_ratio = obj.results.failure_ratio;\n
}\n
}\n
failure_data.push([ counter, failure_ratio ]);\n
ticks.push([ counter, obj.id ]);\n
counter += 1;\n
}\n
});\n
series = [ {\n
label: "Working",\n
data: working_data\n
}, {\n
label: "Waiting",\n
data: waiting_data\n
}, {\n
label: "Failures",\n
data: failure_data\n
}, {\n
label: "Blockage",\n
data: blockage_data\n
} ];\n
options = {\n
xaxis: {\n
minTickSize: 1,\n
ticks: ticks\n
},\n
yaxis: {\n
max: 100\n
},\n
series: {\n
bars: {\n
show: true,\n
barWidth: .8,\n
align: "center"\n
},\n
stack: true\n
}\n
};\n
return [ series, options ];\n
}\n
var gadget_klass = rJS(window);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("aq_getAttachment", "jio_getAttachment").declareMethod("render", function(options) {\n
var jio_key = options.id, gadget = this;\n
gadget.props.jio_key = jio_key;\n
gadget.props.result = options.result;\n
return gadget.aq_getAttachment({\n
_id: gadget.props.jio_key,\n
_attachment: "simulation.json"\n
}).push(function(simulation_json) {\n
gadget.props.result_list = station_utilisation_graph_widget(JSON.parse(simulation_json)[gadget.props.result].result);\n
});\n
}).declareMethod("startService", function() {\n
// XXX Manually calculate width and height when resizing\n
$.plot(this.props.element.querySelector(".graph_container"), this.props.result_list[0], this.props.result_list[1]);\n
});\n
})(window, rJS, jQuery, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>5059</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681763.82</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>favicon.ico</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/vnd.microsoft.icon</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAA
AAAAAAD+/////////+H79P+t9Nz/sPTe/+/9+P///////v79//7+/f//////6/z3/63z3P+s89r/
6Pv0///////+//////////////+W8NH/buq//27qv/+r8tv///////7//v/+//7//////6rz2f9n
6br/auq8/6Dy1v///////v/////////t/Pf/dOvC/3jrwf9768T/he7M//j79//87uX//PDm//j6
9v+C7sn/devB/33sxv947MT/7v34///////9//7//////7H03v9q6Lv/bui9/8j87v/8z7H/6aBi
/+qgZv/90rr/wfzt/2/ov/9z6r//uvTh///////9//7////////////3/vz/3fvx/+H++P/59e3/
7aZt/+ugav/spHD/7adw//j38f/g/PL/3fns//f+/P/////////////+/f//////+d/L//axhP/2
sof/+uvf//LAlv/smlv/7J1g//G+l//659j/9a9///Wvff/54M3////////+/f///////ffy/+2p
d//pomr/6Jla//C4jf/78ef/6su4/+nDrf/67+f/8baH/+mbYf/pnWT/7bF8//77+P//////////
//349P/tqXX/6p9n/+ibZv/1u4z/qK73/3J7+P91fvn/qKz4//a8h//plVr/66Br/+2reP/9+vb/
///////+/f//////+dvF//Stfv/7tID/z77U/2109P9pa+n/Z2jp/2Rr9f/TxNT/9rN9/+2pe//4
3cj////////+/f////////////T9+v/Y9ej/6v/v/7Cx9f9fYez/cnju/3B37v9dZO7/s7Xz///x
1f/35db//vr3/////////////f/+//////+q89r/a+m//3DtwP+u4OL/dG/x/1xk7P9hZuv/cHj3
/+HAuv/voF//6Zxg//TMrv////////79///////r/Pf/dOvC/37sxv9z6b//iPPH/8zR+/+bn/X/
l5rz/8/O9P/zr3T/659p/+2jbf/so2z//PXt/////////////////5nw0/9x6sD/bOm6/6z34///
6tP/9b2M//W3g//+7db/8sam/+qWXf/rnGD/8LuR//////////7//v/////////n+/T/uPTf/7r2
4v/w+vP/761+/+mbZv/qnmj/7a19//vw5v/0zrP/9M6w//vw5/////////7+/////////////v//
/////v///////fz4/+6xhP/snGP/7KJp/+6ugP/++vf//////////v////7/////////////////
//////7////9//7//P78///////44dD/7qt3/+2uef/34M7///////78+////fz///7+////////
////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAA==</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1150</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681758.24</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>@media (min-width:110em){.jqm-navmenu-panel.ui-panel-closed{visibility:visible!important;width:17em;-webkit-transition:none!important;-moz-transition:none!important;transition:none!important;-webkit-transform:none!important;-moz-transform:none!important;transform:none!important;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;height:100%;position:absolute;display:block}.ui-panel-page-content-open{width:auto}.ui-panel-page-content-open.ui-panel-page-content-position-left{margin-right:17em}.ui-panel-dismiss,.menu_link{display:none!important}.gadget_container,header,nav{margin-left:17em}.close-entry{display:none!important}.gadget_container{padding:1em}}[data-gadget-scope=productionline_toolbox]{position:relative;width:19.5%;float:left}[data-gadget-scope=productionline_graph]{position:relative;width:79.5%;float:right}form.save_form{display:none}</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>865</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681763.93</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Dream Simulation test debug</title>\n
<link rel="shortcut icon" href="favicon.ico">\n
\n
<link rel="stylesheet" href="../lib/jquerymobile.css">\n
<link rel="stylesheet" href="index.css" />\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/handlebars.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
<script src="mixin_gadget.js" type="text/javascript"></script>\n
<script src="index.js" type="text/javascript"></script>\n
\n
<script id="panel-template" type="text/x-handlebars-template">\n
<ul data-role="listview">\n
<li><a class="home_link ui-btn ui-icon-home ui-btn-icon-left" data-icon="home">Documents</a></li>\n
<li><a class="fast_input_link ui-btn ui-icon-plus ui-btn-icon-left" data-icon="plus">New Document</a></li>\n
{{#navigationlist}}\n
<li><a href="{{link}}">{{title}}</a></li>\n
{{/navigationlist}}\n
</ul>\n
</script>\n
\n
<script id="active-navigation-template" type="text/x-handlebars-template">\n
<li><a class="ui-btn-active ui-state-persist" href="{{link}}">{{title}} ahah</a></li>\n
</script>\n
\n
<script id="navigation-template" type="text/x-handlebars-template">\n
<li><a href="{{link}}">{{title}}</a></li>\n
</script>\n
\n
<script id="error-template" type="text/x-handlebars-template">\n
<h1>An Error Has Occurred</h1>\n
<a href="javascript: location.reload()">Click here to reload the page</a><br/>\n
The error detail is:\n
<pre>{{error}}</pre>\n
</script>\n
\n
</head>\n
<body>\n
\n
<!-- ID are bad, but required for JQM panel -->\n
<div class="jqm-navmenu-panel"\n
data-role="panel"\n
id="leftpanel"\n
data-display="overlay"\n
data-position="left"\n
data-theme="b">\n
</div>\n
\n
<header data-role="header">\n
\n
<div data-role="controlgroup" data-type="horizontal" class="ui-btn-left">\n
<a href="#leftpanel"\n
data-icon="bars"\n
class="menu_link ui-btn ui-icon-bars ui-btn-icon-left">Menu</a>\n
<a data-icon="carat-u"\n
class="back_link ui-btn ui-icon-carat-u ui-btn-icon-left">Parent</a>\n
</div>\n
<h1>Dream Simulation</h1>\n
\n
<div data-role="controlgroup" data-type="horizontal" class="ui-btn-right">\n
<a data-icon="forward"\n
class="next_link ui-btn ui-icon-forward ui-btn-icon-right">Next</a>\n
</div>\n
\n
</header>\n
\n
<div class="nav_container"></div>\n
\n
<article class="gadget_container"></article>\n
\n
<aside>\n
<section data-gadget-url="../jio_bridge/index.html"\n
data-gadget-scope="jio"\n
data-gadget-sandbox="public"></section>\n
</aside>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3023</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681758.43</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.js.orig</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/octet-stream</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global console, jQuery, rJS, RSVP, alert, Handlebars, initGadgetMixin */\n
/*jslint nomen: true */\n
(function(window, $, rJS, RSVP, Handlebars, initGadgetMixin) {\n
"use strict";\n
/////////////////////////////////////////////////////////////////\n
// Desactivate jQuery Mobile URL management\n
/////////////////////////////////////////////////////////////////\n
$.mobile.ajaxEnabled = false;\n
$.mobile.linkBindingEnabled = false;\n
$.mobile.hashListeningEnabled = false;\n
$.mobile.pushStateEnabled = false;\n
/////////////////////////////////////////////////////////////////\n
// Minimalistic ERP5\'s like portal type configuration\n
/////////////////////////////////////////////////////////////////\n
// XXX we should use lists instead to keep ordering\n
var portal_types = {\n
"Input Module": {\n
view: {\n
gadget: "InputModule_viewInputList",\n
type: "object_list",\n
title: "Document List"\n
},\n
view_fast_input: {\n
gadget: "InputModule_viewAddDocumentDialog",\n
type: "object_fast_input",\n
title: "Create Document"\n
}\n
},\n
Input: {\n
view: {\n
gadget: "Input_viewProductionLine",\n
type: "object_view",\n
title: "Production Line"\n
},\n
view_wip_part_spreadsheet: {\n
gadget: "Input_viewWipPartSpreadsheet",\n
type: "object_view",\n
title: "WIP Part Spreadsheet",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.wip_part_spreadsheet;\n
}\n
},\n
view_shift_spreadsheet: {\n
gadget: "Input_viewShiftSpreadsheet",\n
type: "object_view",\n
title: "Shift Spreadsheet",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.shift_spreadsheet;\n
}\n
},\n
view_available_capacity_spreadsheet: {\n
gadget: "Input_viewAvailableCapacitySpreadsheet",\n
type: "object_view",\n
title: "Available Capacity Spreadsheet",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.capacity_by_project_spreadsheet;\n
}\n
},\n
view_required_capacity_spreadsheet: {\n
gadget: "Input_viewRequiredCapacitySpreadsheet",\n
type: "object_view",\n
title: "Required Capacity Spreadsheet",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.capacity_by_station_spreadsheet;\n
}\n
},\n
view_dp_capacity_spreadsheet: {\n
gadget: "Input_viewDemandPlanningCapacitySpreadsheet",\n
type: "object_view",\n
title: "Demand Planning Required Capacity Spreadsheet",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.dp_capacity_spreadsheet;\n
}\n
},\n
view_dp_route_spreadsheet: {\n
gadget: "Input_viewDemandPlanningRouteSpreadsheet",\n
type: "object_view",\n
title: "Demand Planning Route Spreadsheet",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.dp_route_spreadsheet;\n
}\n
},\n
view_simu: {\n
gadget: "Input_viewSimulation",\n
type: "object_view",\n
title: "Run simulation"\n
},\n
view_management: {\n
gadget: "Input_viewDocumentManagement",\n
type: "object_view",\n
title: "Manage document"\n
},\n
view_result: {\n
gadget: "Input_viewResultList",\n
type: "object_view",\n
title: "Results"\n
}\n
},\n
Output: {\n
view: {\n
gadget: "Output_viewStationUtilisationGraph",\n
type: "object_view",\n
title: "Stations Utilization",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.station_utilisation_graph;\n
}\n
},\n
download_excel_spreadsheet: {\n
gadget: "Output_viewDownloadExcelSpreadsheet",\n
type: "object_view",\n
title: "Download Excel Spreadsheet",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.download_excel_spreadsheet;\n
}\n
},\n
view_capacity_utilization: {\n
gadget: "Output_viewCapacityUtilisationGraph",\n
type: "object_view",\n
title: "Capacity Utilization",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.capacity_utilisation_graph;\n
}\n
},\n
view_queue_stat: {\n
gadget: "Output_viewQueueStatGraph",\n
type: "object_view",\n
title: "Queues Statistics",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.queue_stat;\n
}\n
},\n
view_exit_stat: {\n
gadget: "Output_viewExitStatistics",\n
type: "object_view",\n
title: "Exit Statistics",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.exit_stat;\n
}\n
},\n
view_gantt: {\n
gadget: "Output_viewJobGantt",\n
type: "object_view",\n
title: "Job Gantt",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.job_gantt;\n
}\n
},\n
view_schedule: {\n
gadget: "Output_viewJobScheduleSpreadsheet",\n
type: "object_view",\n
title: "Job Schedule",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.job_schedule_spreadsheet;\n
}\n
},\n
view_debug: {\n
gadget: "Output_viewDebugJson",\n
type: "object_view",\n
title: "Debug JSON",\n
condition: function(gadget) {\n
return gadget.props.configuration_dict["Dream-Configuration"].gui.debug_json;\n
}\n
}\n
}\n
}, panel_template, navigation_template, active_navigation_template, error_template, gadget_klass = rJS(window);\n
function calculateTabHTML(gadget, options, key, title, active) {\n
return new RSVP.Queue().push(function() {\n
var kw = {\n
action: key,\n
id: options.id\n
};\n
if (options.result !== undefined) {\n
kw.result = options.result;\n
}\n
return gadget.aq_pleasePublishMyState(kw);\n
}).push(function(url) {\n
var kw = {\n
title: title,\n
link: url\n
};\n
if (active === true) {\n
return active_navigation_template(kw);\n
}\n
return navigation_template(kw);\n
});\n
}\n
function getNextLink(gadget, portal_type, options) {\n
var forward_kw = {\n
action: options.action || "view"\n
}, queue = new RSVP.Queue();\n
if (portal_type === "Input") {\n
forward_kw.id = options.id;\n
} else if (portal_type === "Output") {\n
forward_kw.id = options.id;\n
queue.push(function() {\n
return gadget.getDeclaredGadget("jio");\n
}).push(function(jio_gadget) {\n
return jio_gadget.getAttachment({\n
_id: options.id,\n
_attachment: "simulation.json"\n
});\n
}).push(function(sim_json) {\n
var document_list = JSON.parse(sim_json), current = parseInt(options.result, 10);\n
if (current === document_list.length - 1) {\n
forward_kw.result = 0;\n
} else {\n
forward_kw.result = current + 1;\n
}\n
});\n
} else if (portal_type !== "Input Module") {\n
throw new Error("Unknown portal type: " + portal_type);\n
}\n
return queue.push(function() {\n
return gadget.aq_pleasePublishMyState(forward_kw);\n
});\n
}\n
function getTitle(gadget, portal_type, options) {\n
var title;\n
if (portal_type === "Input Module") {\n
title = "Documents";\n
} else if (portal_type === "Input") {\n
title = gadget.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.get({\n
_id: options.id\n
});\n
}).push(function(jio_doc) {\n
return jio_doc.data.title + " (" + jio_doc.data.modified + ")";\n
});\n
} else if (portal_type === "Output") {\n
title = gadget.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.getAttachment({\n
_id: options.id,\n
_attachment: "simulation.json"\n
});\n
}).push(function(sim_json) {\n
var document_list = JSON.parse(sim_json);\n
return document_list[options.result].score + " " + document_list[options.result].key;\n
});\n
} else {\n
throw new Error("Unknown portal type: " + portal_type);\n
}\n
return title;\n
}\n
function calculateNavigationHTML(gadget, portal_type, options) {\n
var nav_html, action;\n
if (portal_types[portal_type][options.action].type === "object_view") {\n
return new RSVP.Queue().push(function() {\n
var url_list = [], key2;\n
for (key2 in portal_types[portal_type]) {\n
if (portal_types[portal_type].hasOwnProperty(key2)) {\n
action = portal_types[portal_type][key2];\n
if (action.type === "object_view") {\n
if (action.condition === undefined || action.condition(gadget)) {\n
url_list.push(calculateTabHTML(gadget, options, key2, action.title, key2 === options.action));\n
}\n
}\n
}\n
}\n
return RSVP.all(url_list);\n
}).push(function(entry_list) {\n
var i;\n
nav_html = \'<nav data-role="navbar" data-collapsible="true"><ul>\';\n
for (i = 0; i < entry_list.length; i += 1) {\n
nav_html += entry_list[i];\n
}\n
nav_html += "</ul></nav>";\n
return nav_html;\n
});\n
}\n
}\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("pleaseRedirectMyHash", "pleaseRedirectMyHash").allowPublicAcquisition("jio_allDocs", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.allDocs.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_ajax", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.ajax.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_post", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.post.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_remove", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.remove.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_get", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.get.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_putAttachment", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.putAttachment.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_getAttachment", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.getAttachment.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("whoWantsToDisplayHome", function() {\n
// Hey, I want to display some URL\n
return this.aq_pleasePublishMyState({});\n
}).allowPublicAcquisition("whoWantsToDisplayThisDocument", function(param_list) {\n
// Hey, I want to display some jIO document\n
// XXX should be merged with whoWantsToDisplayThisResult\n
var kw = {\n
action: param_list[1] || "view"\n
};\n
if (param_list[0] !== undefined) {\n
kw.id = param_list[0];\n
}\n
return this.aq_pleasePublishMyState(kw);\n
}).allowPublicAcquisition("whoWantsToDisplayThisResult", function(param_list) {\n
// Hey, I want to display some jIO document\n
// We\'ll display the result using the first enabled action\n
var action = "view", action_info, action_id;\n
for (action_id in portal_types.Output) {\n
if (portal_types.Output.hasOwnProperty(action_id)) {\n
action_info = portal_types.Output[action_id];\n
if (action_info.condition === undefined || action_info.condition(this)) {\n
action = action_id;\n
break;\n
}\n
}\n
}\n
return this.aq_pleasePublishMyState({\n
action: action,\n
id: param_list[0],\n
result: param_list[1]\n
});\n
}).allowPublicAcquisition("getConfigurationDict", function() {\n
return this.props.configuration_dict;\n
}).ready(function() {\n
if (panel_template === undefined) {\n
// XXX Only works as root gadget\n
panel_template = Handlebars.compile(document.getElementById("panel-template").innerHTML);\n
navigation_template = Handlebars.compile(document.getElementById("navigation-template").innerHTML);\n
active_navigation_template = Handlebars.compile(document.getElementById("active-navigation-template").innerHTML);\n
error_template = Handlebars.compile(document.getElementById("error-template").innerHTML);\n
}\n
}).ready(function(g) {\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ g.aq_pleasePublishMyState({}), g.aq_pleasePublishMyState({\n
action: "view_fast_input"\n
}) ]);\n
}).push(function(link_list) {\n
var panel = g.props.element.querySelector("#leftpanel");\n
panel.innerHTML = panel_template({\n
navigationlist: []\n
});\n
panel.getElementsByClassName("home_link")[0].href = link_list[0];\n
panel.getElementsByClassName("fast_input_link")[0].href = link_list[1];\n
// XXX JQuery mobile\n
$(panel).trigger("create");\n
});\n
}).ready(function(g) {\n
var jio_gadget;\n
return g.getDeclaredGadget("jio").push(function(gadget) {\n
jio_gadget = gadget;\n
return jio_gadget.createJio({\n
type: "local",\n
username: "dream",\n
applicationname: "dream"\n
});\n
}).push(function() {\n
g.props.configuration_dict = {\n
"Dream-Configuration": {\n
_class: "Dream.Configuration",\n
gui: {\n
debug_json: 1,\n
download_excel_spreadsheet: 0,\n
exit_stat: 1,\n
job_gantt: 0,\n
job_schedule_spreadsheet: 0,\n
queue_stat: 1,\n
shift_spreadsheet: 0,\n
station_utilisation_graph: 1,\n
wip_part_spreadsheet: 0,\n
wip_spreadsheet: 0\n
},\n
property_list: [ {\n
_class: "Dream.Property",\n
_default: 10,\n
id: "numberOfReplications",\n
name: "Number of replications",\n
type: "number"\n
} ]\n
}\n
};\n
});\n
}).declareMethod("render", function(options) {\n
var gadget = this, back_kw = {\n
action: "view"\n
}, page_gadget, portal_type = "Input Module", nav_element = gadget.props.element.getElementsByClassName("nav_container")[0], element = gadget.props.element.getElementsByClassName("gadget_container")[0];\n
if (options.action === undefined) {\n
// Redirect to the view action\n
options.action = "view";\n
return gadget.aq_pleasePublishMyState(options).push(gadget.pleaseRedirectMyHash.bind(gadget));\n
}\n
// Detect what is the kind of document displayed\n
if (options.id !== undefined) {\n
if (options.result === undefined) {\n
portal_type = "Input";\n
} else {\n
portal_type = "Output";\n
back_kw.action = "view_result";\n
back_kw.id = options.id;\n
}\n
}\n
// Get the action information\n
return gadget.declareGadget(portal_types[portal_type][options.action].gadget + ".html").push(function(g) {\n
page_gadget = g;\n
if (page_gadget.render !== undefined) {\n
return page_gadget.render(options);\n
}\n
}).push(function() {\n
return RSVP.all([ page_gadget.getElement(), calculateNavigationHTML(gadget, portal_type, options), gadget.aq_pleasePublishMyState(back_kw), getTitle(gadget, portal_type, options), getNextLink(gadget, portal_type, options) ]);\n
}).push(function(result_list) {\n
var nav_html = result_list[1], page_element = result_list[0];\n
// Update title\n
gadget.props.element.querySelector("header h1").textContent = result_list[3];\n
// XXX Hide the back button in case of module display?\n
// Update back link\n
gadget.props.element.getElementsByClassName("back_link")[0].href = result_list[2];\n
// XXX Hide the forward button in case of non result?\n
// Update forward link\n
gadget.props.element.getElementsByClassName("next_link")[0].href = result_list[4];\n
// Update the navigation panel\n
// Clear the previous rendering\n
while (nav_element.firstChild) {\n
nav_element.removeChild(nav_element.firstChild);\n
}\n
if (nav_html !== undefined) {\n
nav_element.innerHTML = nav_html;\n
$(nav_element).trigger("create");\n
}\n
// Append in the DOM at the end to reduce flickering and reduce DOM\n
// modifications\n
// Clear the previous rendering\n
while (element.firstChild) {\n
element.removeChild(element.firstChild);\n
}\n
element.appendChild(page_element);\n
$(element).trigger("create");\n
// XXX RenderJS hack to start sub gadget services\n
// Only work if this gadget has no parent.\n
if (page_gadget.startService !== undefined) {\n
return page_gadget.startService();\n
}\n
}).push(undefined, function(error) {\n
if (error instanceof RSVP.CancellationError) {\n
throw error;\n
}\n
console.error(error);\n
document.querySelector("article[class=\'gadget_container\']").innerHTML = error_template({\n
error: error\n
});\n
});\n
});\n
})(window, jQuery, rJS, RSVP, Handlebars, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>20699</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681764.24</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global console, jQuery, rJS, RSVP, alert, Handlebars, initGadgetMixin */\n
/*jslint nomen: true */\n
(function(window, $, rJS, RSVP, Handlebars, initGadgetMixin) {\n
"use strict";\n
/////////////////////////////////////////////////////////////////\n
// Desactivate jQuery Mobile URL management\n
/////////////////////////////////////////////////////////////////\n
$.mobile.ajaxEnabled = false;\n
$.mobile.linkBindingEnabled = false;\n
$.mobile.hashListeningEnabled = false;\n
$.mobile.pushStateEnabled = false;\n
/////////////////////////////////////////////////////////////////\n
// Minimalistic ERP5\'s like portal type configuration\n
/////////////////////////////////////////////////////////////////\n
// XXX we should use lists instead to keep ordering\n
var portal_types = {\n
"Input Module": {\n
view: {\n
gadget: "InputModule_viewInputList",\n
type: "object_list",\n
title: "Document List"\n
},\n
view_fast_input: {\n
gadget: "InputModule_viewAddDocumentDialog",\n
type: "object_fast_input",\n
title: "Create Document"\n
}\n
},\n
// TODO: remove this once everything is merged.\n
Input: {\n
view: {\n
gadget: "Input_viewProductionLine",\n
type: "object_view",\n
title: "Production Line"\n
},\n
view_wip_part_spreadsheet: {\n
gadget: "Input_viewWipPartSpreadsheet",\n
type: "object_view",\n
title: "WIP Part Spreadsheet"\n
},\n
view_shift_spreadsheet: {\n
gadget: "Input_viewShiftSpreadsheet",\n
type: "object_view",\n
title: "Shift Spreadsheet"\n
},\n
view_available_capacity_spreadsheet: {\n
gadget: "Input_viewAvailableCapacitySpreadsheet",\n
type: "object_view",\n
title: "Available Capacity Spreadsheet"\n
},\n
view_required_capacity_spreadsheet: {\n
gadget: "Input_viewRequiredCapacitySpreadsheet",\n
type: "object_view",\n
title: "Required Capacity Spreadsheet"\n
},\n
view_dp_capacity_spreadsheet: {\n
gadget: "Input_viewDemandPlanningCapacitySpreadsheet",\n
type: "object_view",\n
title: "Demand Planning Required Capacity Spreadsheet"\n
},\n
view_dp_route_spreadsheet: {\n
gadget: "Input_viewDemandPlanningRouteSpreadsheet",\n
type: "object_view",\n
title: "Demand Planning Route Spreadsheet"\n
},\n
view_simu: {\n
gadget: "Input_viewSimulation",\n
type: "object_view",\n
title: "Run simulation"\n
},\n
view_management: {\n
gadget: "Input_viewDocumentManagement",\n
type: "object_view",\n
title: "Manage document"\n
},\n
view_result: {\n
gadget: "Input_viewResultList",\n
type: "object_view",\n
title: "Results"\n
}\n
},\n
Output: {\n
view: {\n
gadget: "Output_viewStationUtilisationGraph",\n
type: "object_view",\n
title: "Stations Utilization"\n
},\n
download_excel_spreadsheet: {\n
gadget: "Output_viewDownloadExcelSpreadsheet",\n
type: "object_view",\n
title: "Download Excel Spreadsheet"\n
},\n
view_capacity_utilization: {\n
gadget: "Output_viewCapacityUtilisationGraph",\n
type: "object_view",\n
title: "Capacity Utilization"\n
},\n
view_queue_stat: {\n
gadget: "Output_viewQueueStatGraph",\n
type: "object_view",\n
title: "Queues Statistics"\n
},\n
view_exit_stat: {\n
gadget: "Output_viewExitStatistics",\n
type: "object_view",\n
title: "Exit Statistics"\n
},\n
view_gantt: {\n
gadget: "Output_viewJobGantt",\n
type: "object_view",\n
title: "Job Gantt"\n
},\n
view_schedule: {\n
gadget: "Output_viewJobScheduleSpreadsheet",\n
type: "object_view",\n
title: "Job Schedule"\n
},\n
view_debug: {\n
gadget: "Output_viewDebugJson",\n
type: "object_view",\n
title: "Debug JSON"\n
}\n
}\n
}, panel_template, navigation_template, active_navigation_template, error_template, gadget_klass = rJS(window);\n
function calculateTabHTML(gadget, options, key, title, active) {\n
return new RSVP.Queue().push(function() {\n
var kw = {\n
action: key,\n
id: options.id\n
};\n
if (options.result !== undefined) {\n
kw.result = options.result;\n
}\n
return gadget.aq_pleasePublishMyState(kw);\n
}).push(function(url) {\n
var kw = {\n
title: title,\n
link: url\n
};\n
if (active === true) {\n
return active_navigation_template(kw);\n
}\n
return navigation_template(kw);\n
});\n
}\n
function getNextLink(gadget, portal_type, options) {\n
var forward_kw = {\n
action: options.action || "view"\n
}, queue = new RSVP.Queue();\n
if (portal_type === "Input") {\n
forward_kw.id = options.id;\n
} else if (portal_type === "Output") {\n
forward_kw.id = options.id;\n
queue.push(function() {\n
return gadget.getDeclaredGadget("jio");\n
}).push(function(jio_gadget) {\n
return jio_gadget.getAttachment({\n
_id: options.id,\n
_attachment: "simulation.json"\n
});\n
}).push(function(sim_json) {\n
var document_list = JSON.parse(sim_json), current = parseInt(options.result, 10);\n
if (current === document_list.length - 1) {\n
forward_kw.result = 0;\n
} else {\n
forward_kw.result = current + 1;\n
}\n
});\n
} else if (portal_type !== "Input Module") {\n
throw new Error("Unknown portal type: " + portal_type);\n
}\n
return queue.push(function() {\n
return gadget.aq_pleasePublishMyState(forward_kw);\n
});\n
}\n
function getTitle(gadget, portal_type, options) {\n
var title;\n
if (portal_type === "Input Module") {\n
title = "Documents";\n
} else if (portal_type === "Input") {\n
title = gadget.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.get({\n
_id: options.id\n
});\n
}).push(function(jio_doc) {\n
return jio_doc.data.title + " (" + jio_doc.data.modified + ")";\n
});\n
} else if (portal_type === "Output") {\n
title = gadget.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.getAttachment({\n
_id: options.id,\n
_attachment: "simulation.json"\n
});\n
}).push(function(sim_json) {\n
var document_list = JSON.parse(sim_json);\n
return document_list[options.result].score + " " + document_list[options.result].key;\n
});\n
} else {\n
throw new Error("Unknown portal type: " + portal_type);\n
}\n
return title;\n
}\n
function calculateNavigationHTML(gadget, portal_type, options) {\n
var nav_html, action;\n
if (portal_types[portal_type][options.action].type === "object_view") {\n
return new RSVP.Queue().push(function() {\n
var url_list = [], key2;\n
for (key2 in portal_types[portal_type]) {\n
if (portal_types[portal_type].hasOwnProperty(key2)) {\n
action = portal_types[portal_type][key2];\n
if (action.type === "object_view") {\n
if (action.condition === undefined || action.condition(gadget)) {\n
url_list.push(calculateTabHTML(gadget, options, key2, action.title, key2 === options.action));\n
}\n
}\n
}\n
}\n
return RSVP.all(url_list);\n
}).push(function(entry_list) {\n
var i;\n
nav_html = \'<nav data-role="navbar" data-collapsible="true"><ul>\';\n
for (i = 0; i < entry_list.length; i += 1) {\n
nav_html += entry_list[i];\n
}\n
nav_html += "</ul></nav>";\n
return nav_html;\n
});\n
}\n
}\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareAcquiredMethod("pleaseRedirectMyHash", "pleaseRedirectMyHash").allowPublicAcquisition("jio_allDocs", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.allDocs.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_ajax", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.ajax.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_post", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.post.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_remove", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.remove.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_get", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.get.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_putAttachment", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.putAttachment.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("jio_getAttachment", function(param_list) {\n
return this.getDeclaredGadget("jio").push(function(jio_gadget) {\n
return jio_gadget.getAttachment.apply(jio_gadget, param_list);\n
});\n
}).allowPublicAcquisition("whoWantsToDisplayHome", function() {\n
// Hey, I want to display some URL\n
return this.aq_pleasePublishMyState({});\n
}).allowPublicAcquisition("whoWantsToDisplayThisDocument", function(param_list) {\n
// Hey, I want to display some jIO document\n
// XXX should be merged with whoWantsToDisplayThisResult\n
var kw = {\n
action: param_list[1] || "view"\n
};\n
if (param_list[0] !== undefined) {\n
kw.id = param_list[0];\n
}\n
return this.aq_pleasePublishMyState(kw);\n
}).allowPublicAcquisition("whoWantsToDisplayThisResult", function(param_list) {\n
// Hey, I want to display some jIO document\n
// We\'ll display the result using the first enabled action\n
var action = "view", action_info, action_id;\n
for (action_id in portal_types.Output) {\n
if (portal_types.Output.hasOwnProperty(action_id)) {\n
action_info = portal_types.Output[action_id];\n
if (action_info.condition === undefined || action_info.condition(this)) {\n
action = action_id;\n
break;\n
}\n
}\n
}\n
return this.aq_pleasePublishMyState({\n
action: action,\n
id: param_list[0],\n
result: param_list[1]\n
});\n
}).ready(function() {\n
if (panel_template === undefined) {\n
// XXX Only works as root gadget\n
panel_template = Handlebars.compile(document.getElementById("panel-template").innerHTML);\n
navigation_template = Handlebars.compile(document.getElementById("navigation-template").innerHTML);\n
active_navigation_template = Handlebars.compile(document.getElementById("active-navigation-template").innerHTML);\n
error_template = Handlebars.compile(document.getElementById("error-template").innerHTML);\n
}\n
}).ready(function(g) {\n
return new RSVP.Queue().push(function() {\n
return RSVP.all([ g.aq_pleasePublishMyState({}), g.aq_pleasePublishMyState({\n
action: "view_fast_input"\n
}) ]);\n
}).push(function(link_list) {\n
var panel = g.props.element.querySelector("#leftpanel");\n
panel.innerHTML = panel_template({\n
navigationlist: []\n
});\n
panel.getElementsByClassName("home_link")[0].href = link_list[0];\n
panel.getElementsByClassName("fast_input_link")[0].href = link_list[1];\n
// XXX JQuery mobile\n
$(panel).trigger("create");\n
});\n
}).ready(function(g) {\n
return g.getDeclaredGadget("jio").push(function(gadget) {\n
return gadget.createJio({\n
type: "local",\n
username: "dream",\n
applicationname: "dream"\n
});\n
});\n
}).declareMethod("render", function(options) {\n
var gadget = this, back_kw = {\n
action: "view"\n
}, page_gadget, portal_type = "Input Module", nav_element = gadget.props.element.getElementsByClassName("nav_container")[0], element = gadget.props.element.getElementsByClassName("gadget_container")[0];\n
if (options.action === undefined) {\n
// Redirect to the view action\n
options.action = "view";\n
return gadget.aq_pleasePublishMyState(options).push(gadget.pleaseRedirectMyHash.bind(gadget));\n
}\n
// Detect what is the kind of document displayed\n
if (options.id !== undefined) {\n
if (options.result === undefined) {\n
portal_type = "Input";\n
} else {\n
portal_type = "Output";\n
back_kw.action = "view_result";\n
back_kw.id = options.id;\n
}\n
}\n
return gadget.getDeclaredGadget("jio").push(function(jio_gadget) {\n
if (options.id) {\n
return jio_gadget.getAttachment({\n
_id: options.id,\n
_attachment: "body.json"\n
});\n
}\n
}).push(function(result) {\n
var data;\n
if (result) {\n
data = JSON.parse(result);\n
gadget.props.data = data;\n
portal_types.Input = data.application_configuration.input;\n
portal_types.Output = data.application_configuration.output;\n
}\n
// Get the action information\n
return gadget.declareGadget(portal_types[portal_type][options.action].gadget + ".html");\n
}).push(function(g) {\n
page_gadget = g;\n
if (page_gadget.render !== undefined) {\n
return page_gadget.render(options);\n
}\n
}).push(function() {\n
return RSVP.all([ page_gadget.getElement(), calculateNavigationHTML(gadget, portal_type, options), gadget.aq_pleasePublishMyState(back_kw), getTitle(gadget, portal_type, options), getNextLink(gadget, portal_type, options) ]);\n
}).push(function(result_list) {\n
var nav_html = result_list[1], page_element = result_list[0];\n
// Update title\n
gadget.props.element.querySelector("header h1").textContent = result_list[3];\n
// XXX Hide the back button in case of module display?\n
// Update back link\n
gadget.props.element.getElementsByClassName("back_link")[0].href = result_list[2];\n
// XXX Hide the forward button in case of non result?\n
// Update forward link\n
gadget.props.element.getElementsByClassName("next_link")[0].href = result_list[4];\n
// Update the navigation panel\n
// Clear the previous rendering\n
while (nav_element.firstChild) {\n
nav_element.removeChild(nav_element.firstChild);\n
}\n
if (nav_html !== undefined) {\n
nav_element.innerHTML = nav_html;\n
$(nav_element).trigger("create");\n
}\n
// Append in the DOM at the end to reduce flickering and reduce DOM\n
// modifications\n
// Clear the previous rendering\n
while (element.firstChild) {\n
element.removeChild(element.firstChild);\n
}\n
element.appendChild(page_element);\n
$(element).trigger("create");\n
// XXX RenderJS hack to start sub gadget services\n
// Only work if this gadget has no parent.\n
if (page_gadget.startService !== undefined) {\n
return page_gadget.startService();\n
}\n
}).push(undefined, function(error) {\n
if (error instanceof RSVP.CancellationError) {\n
throw error;\n
}\n
console.error(error);\n
document.querySelector("article[class=\'gadget_container\']").innerHTML = error_template({\n
error: error\n
});\n
});\n
});\n
})(window, jQuery, rJS, RSVP, Handlebars, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>17784</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681757.81</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>mixin_document_page.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global console, RSVP */\n
(function(window, RSVP) {\n
"use strict";\n
window.initDocumentPageMixin = function(gadget_klass) {\n
gadget_klass.declareAcquiredMethod("whoWantToDisplayThisDocumentPage", "whoWantToDisplayThisDocumentPage").declareMethod("getNavigationList", function() {\n
var key = this.props.jio_key, gadget = this;\n
return new RSVP.Queue().push(function() {\n
// XXX Conditional simulation menu\n
return RSVP.all([ gadget.whoWantToDisplayThisDocumentPage("Input_viewProductionLine", key), gadget.whoWantToDisplayThisDocumentPage("Input_viewTable", key), gadget.whoWantToDisplayThisDocumentPage("Input_viewSimulation", key), gadget.whoWantToDisplayThisDocumentPage("Input_viewDocumentManagement", key), gadget.whoWantToDisplayThisDocumentPage("Output_viewStationUtilisationGraph", key), gadget.whoWantToDisplayThisDocumentPage("Output_viewQueueStatGraph", key), gadget.whoWantToDisplayThisDocumentPage("Output_viewExitStatistics", key), gadget.whoWantToDisplayThisDocumentPage("Output_viewJobGantt", key), gadget.whoWantToDisplayThisDocumentPage("Output_viewJobScheduleSpreadsheet", key), gadget.whoWantToDisplayThisDocumentPage("Output_viewDebugJson", key) ]);\n
}).push(function(result_list) {\n
return [ {\n
link: result_list[0],\n
title: "Production line"\n
}, {\n
link: result_list[1],\n
title: "Edit table"\n
}, {\n
link: result_list[2],\n
title: "Run simulation"\n
}, {\n
link: result_list[3],\n
title: "Manage document"\n
}, {\n
link: result_list[4],\n
title: "Stations Utilization"\n
}, {\n
link: result_list[5],\n
title: "Queues Statistics"\n
}, {\n
link: result_list[6],\n
title: "Exit Statistics"\n
}, {\n
link: result_list[7],\n
title: "Job Gantt"\n
}, {\n
link: result_list[8],\n
title: "Job Schedule"\n
}, {\n
link: result_list[9],\n
title: "Debug JSON"\n
} ];\n
});\n
});\n
};\n
})(window, RSVP);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2425</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681764.03</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>mixin_gadget.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>(function(window) {\n
"use strict";\n
window.initGadgetMixin = function(gadget_klass) {\n
gadget_klass.ready(function(g) {\n
g.props = {};\n
}).ready(function(g) {\n
return g.getElement().push(function(element) {\n
g.props.element = element;\n
});\n
});\n
};\n
})(window);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>338</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681764.13</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>mixin_promise.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global RSVP, FileReader */\n
/*jslint unparam: true */\n
(function(window, RSVP, FileReader) {\n
"use strict";\n
window.loopEventListener = function(target, type, useCapture, callback, allowDefault) {\n
//////////////////////////\n
// Infinite event listener (promise is never resolved)\n
// eventListener is removed when promise is cancelled/rejected\n
//////////////////////////\n
var handle_event_callback, callback_promise;\n
function cancelResolver() {\n
if (callback_promise !== undefined && typeof callback_promise.cancel === "function") {\n
callback_promise.cancel();\n
}\n
}\n
function canceller() {\n
if (handle_event_callback !== undefined) {\n
target.removeEventListener(type, handle_event_callback, useCapture);\n
}\n
cancelResolver();\n
}\n
function itsANonResolvableTrap(resolve, reject) {\n
handle_event_callback = function(evt) {\n
evt.stopPropagation();\n
if (allowDefault !== true) {\n
evt.preventDefault();\n
}\n
cancelResolver();\n
callback_promise = new RSVP.Queue().push(function() {\n
return callback(evt);\n
}).push(undefined, function(error) {\n
if (!(error instanceof RSVP.CancellationError)) {\n
canceller();\n
reject(error);\n
}\n
});\n
};\n
target.addEventListener(type, handle_event_callback, useCapture);\n
}\n
return new RSVP.Promise(itsANonResolvableTrap, canceller);\n
};\n
window.promiseEventListener = function(target, type, useCapture) {\n
//////////////////////////\n
// Resolve the promise as soon as the event is triggered\n
// eventListener is removed when promise is cancelled/resolved/rejected\n
//////////////////////////\n
var handle_event_callback;\n
function canceller() {\n
target.removeEventListener(type, handle_event_callback, useCapture);\n
}\n
function resolver(resolve) {\n
handle_event_callback = function(evt) {\n
canceller();\n
evt.stopPropagation();\n
evt.preventDefault();\n
resolve(evt);\n
return false;\n
};\n
target.addEventListener(type, handle_event_callback, useCapture);\n
}\n
return new RSVP.Promise(resolver, canceller);\n
};\n
window.promiseReadAsText = function(file) {\n
return new RSVP.Promise(function(resolve, reject) {\n
var reader = new FileReader();\n
reader.onload = function(evt) {\n
resolve(evt.target.result);\n
};\n
reader.onerror = function(evt) {\n
reject(evt);\n
};\n
reader.readAsText(file);\n
});\n
};\n
})(window, RSVP, FileReader);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2995</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>fieldset</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681764.56</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>fieldset.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, RSVP, jQuery, Handlebars,\n
promiseEventListener, initGadgetMixin*/\n
/*jslint nomen: true */\n
(function(window, rJS, RSVP, Handlebars, initGadgetMixin) {\n
"use strict";\n
/////////////////////////////////////////////////////////////////\n
// Handlebars\n
/////////////////////////////////////////////////////////////////\n
// Precompile the templates while loading the first gadget instance\n
var gadget_klass = rJS(window), source = gadget_klass.__template_element.getElementById("label-template").innerHTML, label_template = Handlebars.compile(source);\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareMethod("render", function(options, node_id) {\n
// XXX node_id is added like a property so that one can change the node\n
// id\n
var gadget = this, queue;\n
gadget.props.key = options.key;\n
// used for recursive fieldsets\n
gadget.props.field_gadget_list = [];\n
function addField(property_id, property_definition, value) {\n
var sub_gadget;\n
queue.push(function() {\n
// XXX this is incorrect for recursive fieldsets.\n
// we should use nested fieldset with legend\n
gadget.props.element.insertAdjacentHTML("beforeend", label_template({\n
"for": property_id,\n
name: property_definition.name || property_id\n
}));\n
if (property_definition.type === "object") {\n
// Create a recursive fieldset for this key.\n
return gadget.declareGadget("../fieldset/index.html");\n
}\n
if (property_definition.type === "number") {\n
return gadget.declareGadget("../number_field/index.html");\n
}\n
if (property_definition.enum) {\n
return gadget.declareGadget("../list_field/index.html");\n
}\n
return gadget.declareGadget("../string_field/index.html");\n
}).push(function(gg) {\n
sub_gadget = gg;\n
return sub_gadget.render({\n
key: property_id,\n
value: value,\n
property_definition: property_definition\n
});\n
}).push(function() {\n
return sub_gadget.getElement();\n
}).push(function(sub_element) {\n
gadget.props.element.appendChild(sub_element);\n
gadget.props.field_gadget_list.push(sub_gadget);\n
});\n
}\n
queue = new RSVP.Queue().push(function() {\n
if (node_id) {\n
addField("id", {\n
type: "string"\n
}, node_id);\n
}\n
Object.keys(options.property_definition.properties).forEach(function(property_name) {\n
var property_definition = options.property_definition.properties[property_name], value = (options.value || {})[property_name] === undefined ? property_definition._default : options.value[property_name];\n
// XXX some properties are not editable\n
if (property_name !== "coordinate" && property_name !== "_class") {\n
addField(property_name, property_definition, value);\n
}\n
});\n
});\n
return queue;\n
}).declareMethod("getContent", function() {\n
var i, promise_list = [], gadget = this;\n
for (i = 0; i < this.props.field_gadget_list.length; i += 1) {\n
promise_list.push(this.props.field_gadget_list[i].getContent());\n
}\n
return RSVP.Queue().push(function() {\n
return RSVP.all(promise_list);\n
}).push(function(result_list) {\n
var name, result = {}, content = result;\n
if (gadget.props.key) {\n
content = result[gadget.props.key] = {};\n
}\n
for (i = 0; i < result_list.length; i += 1) {\n
for (name in result_list[i]) {\n
if (result_list[i].hasOwnProperty(name)) {\n
content[name] = result_list[i][name];\n
}\n
}\n
}\n
return result;\n
});\n
});\n
})(window, rJS, RSVP, Handlebars, initGadgetMixin);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4262</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681764.69</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<meta name="viewport" content="width=device-width, initial-scale=1">\n
<title>Fieldset</title>\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/handlebars.min.js" type="text/javascript"></script>\n
<script src="../lib/jquery.js" type="text/javascript"></script>\n
<script src="../lib/jquerymobile.js" type="text/javascript"></script>\n
\n
<script id="label-template" type="text/x-handlebars-template">\n
<label for="{{for}}">{{name}}</label>\n
</script>\n
\n
<script src="../dream/mixin_gadget.js" type="text/javascript"></script>\n
<script src="fieldset.js" type="text/javascript"></script>\n
</head>\n
<body>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>825</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>handsontable</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681765.0</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>handsontable.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global jQuery, rJS, window, JSON, RSVP */\n
(function(window, $, rJS, JSON, RSVP) {\n
"use strict";\n
rJS(window).declareMethod("render", function(content, options) {\n
var data = JSON.parse(content);\n
return this.getElement().push(function(element) {\n
$(element).find(".table-container").handsontable($.extend({\n
data: data,\n
stretchH: "all"\n
}, options || {}));\n
});\n
}).declareMethod("getData", function() {\n
return this.getElement().push(function(element) {\n
var data = $(element).find(".table-container").handsontable("getData");\n
return JSON.stringify(data);\n
});\n
}).declareMethod("startService", function() {\n
var gadget_element;\n
return this.getElement().push(function(element) {\n
gadget_element = element;\n
$(element).find(".table-container").handsontable("render");\n
}).push(function() {\n
// Infinite wait, until cancelled\n
return new RSVP.defer().promise;\n
}).push(undefined, function(error) {\n
$(gadget_element).find(".table-container").handsontable("destroy");\n
throw error;\n
});\n
});\n
})(window, jQuery, rJS, JSON, RSVP);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1257</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681765.14</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!doctype html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<link rel="stylesheet" href="../lib/handsontable.css">\n
\n
<script src="../lib/jquery.js"></script>\n
<script src="../lib/rsvp.min.js"></script>\n
<script src="../lib/renderjs.min.js"></script>\n
<script src="../lib/handsontable.js"></script>\n
\n
<script src="handsontable.js"></script>\n
</head>\n
<body>\n
<div class="table-container"></div>\n
\n
mmmh ?\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>455</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681765.26</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>test.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!doctype html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<link rel="stylesheet" href="../lib/qunit.css">\n
\n
<script src="../lib/rsvp.min.js"></script>\n
<script src="../lib/renderjs.min.js"></script>\n
<script src="../lib/qunit.js"></script>\n
<script src="../lib/jquery.js"></script>\n
<script src="test.js"></script>\n
</head>\n
<body>\n
<div id="qunit"></div>\n
<div id="qunit-fixture"></div>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>438</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681765.36</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>test.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global rJS, JSON, QUnit, jQuery*/\n
(function(rJS, JSON, QUnit, $) {\n
"use strict";\n
var start = QUnit.start, stop = QUnit.stop, test = QUnit.test, equal = QUnit.equal, sample = JSON.stringify([ [ "row1", "data11", "data12", "data13" ], [ "row2", "data21", "data22", "data23" ], [ "row3", "data31", "data32", "data33" ] ]);\n
QUnit.config.testTimeout = 5e3;\n
rJS(window).ready(function(g) {\n
test("data output is equal to input", function() {\n
var hstable_gadget;\n
stop();\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
hstable_gadget = new_gadget;\n
return hstable_gadget.render(sample);\n
}).then(function() {\n
return hstable_gadget.getData();\n
}).then(function(data) {\n
equal(data, sample);\n
}).always(start);\n
});\n
test("the table is displayed", function() {\n
var hstable_gadget;\n
stop();\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
hstable_gadget = new_gadget;\n
return hstable_gadget.render(sample);\n
}).then(function() {\n
var rows = $("table tbody tr");\n
equal(rows.length, 3);\n
equal(rows[0].childNodes.length, 4);\n
equal(rows[0].childNodes[2].innerHTML, "data12");\n
}).always(start);\n
});\n
test("the gadget can be configured", function() {\n
var hstable_gadget;\n
stop();\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
hstable_gadget = new_gadget;\n
return hstable_gadget.render(sample, {\n
minSpareRows: 1\n
});\n
}).then(function() {\n
var rows = $("table tbody tr");\n
// There is one spare row\n
equal(rows.length, 4);\n
}).then(function() {\n
return hstable_gadget.getData();\n
}).then(function(data) {\n
equal(data, JSON.stringify([ [ "row1", "data11", "data12", "data13" ], [ "row2", "data21", "data22", "data23" ], [ "row3", "data31", "data32", "data33" ], [ null, null, null, null ] ]));\n
}).always(start);\n
});\n
});\n
})(rJS, JSON, QUnit, jQuery);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2588</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>jio_bridge</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681765.77</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n
<meta name="viewport" content="width=device-width, user-scalable=no" />\n
<title>Jio Gadget</title>\n
\n
<!-- renderjs -->\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/uritemplate.min.js" type="text/javascript"></script>\n
<script src="../lib/URI.js" type="text/javascript"></script>\n
<script src="../lib/jio.js" type="text/javascript"></script>\n
<!-- custom script -->\n
<script src="jiogadget.js" type="text/javascript"></script>\n
\n
</head>\n
<body>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>641</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681765.94</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>jiogadget.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global rJS, jIO */\n
(function(rJS, jIO) {\n
"use strict";\n
rJS(window).ready(function(gadget) {\n
// Initialize the gadget local parameters\n
gadget.state_parameter_dict = {};\n
}).declareMethod("createJio", function(jio_options) {\n
this.state_parameter_dict.jio_storage = jIO.createJIO(jio_options);\n
}).declareMethod("ajax", function() {\n
return jIO.util.ajax.apply(this, arguments);\n
}).declareMethod("allDocs", function() {\n
var storage = this.state_parameter_dict.jio_storage;\n
return storage.allDocs.apply(storage, arguments);\n
}).declareMethod("get", function() {\n
var storage = this.state_parameter_dict.jio_storage;\n
return storage.get.apply(storage, arguments);\n
}).declareMethod("remove", function() {\n
var storage = this.state_parameter_dict.jio_storage;\n
return storage.remove.apply(storage, arguments);\n
}).declareMethod("getAttachment", function() {\n
var storage = this.state_parameter_dict.jio_storage;\n
return storage.getAttachment.apply(storage, arguments).then(function(response) {\n
return jIO.util.readBlobAsText(response.data);\n
}).then(function(lala) {\n
return lala.target.result;\n
});\n
}).declareMethod("putAttachment", function() {\n
var storage = this.state_parameter_dict.jio_storage;\n
return storage.putAttachment.apply(storage, arguments);\n
}).declareMethod("post", function() {\n
// XXX set modified value\n
var storage = this.state_parameter_dict.jio_storage;\n
return storage.post.apply(storage, arguments);\n
});\n
})(rJS, jIO);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1638</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>jsplumb</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17687388.65</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!doctype html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<link rel="stylesheet" href="../lib/jquery-ui.css">\n
\n
<!-- <link rel="stylesheet" href="../lib/jquerymobile.css"> -->\n
<link rel="stylesheet" href="jsplumb.css">\n
\n
<script src="../lib/jquery.js"></script>\n
<script src="../lib/jquery-ui.js"></script>\n
<script src="../lib/jquerymobile.js"></script> \n
<!--\n
<script src="../lib/rsvp.min.js"></script>\n
<script src="../lib/renderjs.min.js"></script>\n
-->\n
<script src="../lib/jquery.jsplumb.js"></script>\n
<script src="../lib/handlebars.min.js"></script>\n
\n
<script id="node-template" type="text/x-handlebars-template">\n
<div class="window {{class}}"\n
id="{{element_id}}"\n
title="{{title}}">\n
{{name}}\n
<div class="ep"></div>\n
</div>\n
</script>\n
\n
<template id="popup-edit-template">\n
<div id="node-edit-popup" data-position-to="origin">\n
<div data-role="header" data-theme="a">\n
<h1 class="node_class">Node edition</h1>\n
<a href="#" data-rel="back" class="ui-btn ui-corner-all ui-shadow ui-btn-a ui-icon-delete ui-btn-icon-notext ui-btn-right">Close</a>\n
</div>\n
<br/>\n
<form class="ui-content">\n
<fieldset></fieldset>\n
<input type="button" value="Delete">\n
<input type="submit" value="Validate">\n
</form>\n
</div>\n
</template>\n
\n
<script src="../dream/mixin_gadget.js"></script>\n
<script src="../dream/mixin_promise.js"></script>\n
\n
<script src="jsplumb.js"></script>\n
</head>\n
<body>\n
<div id="main"></div>\n
<div class="dummy_window"></div>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1656</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17682995.33</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>jsplumb.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>#main {\n
/* these two margins settings are here just to ensure that jsPlumb handles\n
margins properly.*/\n
position: relative;\n
margin:20px auto;\n
font-size: 80%;\n
border: 1px solid #999;\n
/* width: 100%; */\n
width: 600px;\n
height: 600px;\n
overflow: hidden;\n
border-radius: 10px;\n
background-color:#eaedef;\n
text-align: center;\n
}\n
\n
.selected {\n
color:rgb(189, 11, 11) !important;\n
}\n
\n
.window, .label {\n
background-color:white;\n
text-align:center;\n
z-index:23;\n
cursor:pointer;\n
box-shadow: 2px 2px 19px #aaa;\n
-o-box-shadow: 2px 2px 19px #aaa;\n
-webkit-box-shadow: 2px 2px 19px #aaa;\n
-moz-box-shadow: 2px 2px 19px #aaa;\n
}\n
\n
path, ._jsPlumb_endpoint {\n
cursor:pointer;\n
}\n
\n
._jsPlumb_endpoint_drop_allowed {\n
border: 4px solid #123456;\n
box-shadow: 6px 6px 19px #444;\n
-o-box-shadow: 6px 6px 19px #444;\n
-webkit-box-shadow: 6px 6px 19px #444;\n
-moz-box-shadow: 6px 6px 19px #444;\n
}\n
\n
/* z index stuff */\n
\n
._jsPlumb_connector {\n
z-index:18;\n
}\n
\n
._jsPlumb_endpoint {\n
z-index:19;\n
}\n
\n
._jsPlumb_overlay {\n
z-index:23;\n
}\n
\n
._jsPlumb_connector._jsPlumb_hover {\n
z-index:21 !important;\n
}\n
\n
._jsPlumb_endpoint._jsPlumb_hover {\n
z-index:22 !important;\n
}\n
\n
._jsPlumb_overlay {\n
border:1px solid #346789;\n
opacity:0.8;\n
filter:alpha(opacity=80);\n
background-color:white;\n
color:black;\n
font-family:helvetica;\n
padding:0.5em;\n
}\n
\n
.Dream-Source, .Dream-BatchSource {\n
border: 1px solid #bbc;\n
background-color:#ffe;\n
background-image: linear-gradient(to bottom, #ffe 0%, #dde 100%);\n
}\n
\n
.Dream-Machine, .Dream-MachineJobShop, .Dream-BatchScrapMachine, .Dream-MachineManagedJob, .Dream-MouldAssembly {\n
border: 1px solid #cbc;\n
background-color: #fef;\n
background-image: linear-gradient(to bottom, #fef 0%, #ede 100%);\n
}\n
\n
.Dream-Queue, .Dream-QueueJobShop, .Dream-LineClearance, .Dream-QueueManagedJob, .Dream-ConditionalBuffer, .Dream-OrderDecomposition, .Dream-MouldAssemblyBuffer {\n
border: 1px solid #bcc;\n
background-color:#eff;\n
background-image: linear-gradient(to bottom, #eff 0%, #dee 100%);\n
}\n
\n
.Dream-Exit, .Dream-ExitJobShop {\n
border: 1px solid #ccb;\n
background-color:#eef;\n
background-image: linear-gradient(to bottom, #eef 0%, #dde 100%);\n
}\n
\n
.Dream-EventGenerator {\n
border: 1px solid #cba;\n
background-color:#fdc;\n
background-image: linear-gradient(to bottom, #fdc 0%, #ecb 100%);\n
}\n
\n
.Dream-BatchDecomposition, .Dream-BatchDecompositionStartTime, .Dream-BatchReassembly {\n
border: 1px solid #bcb;\n
background-color:#dfd;\n
background-image: linear-gradient(to bottom, #dfd 0%, #cec 100%);\n
}\n
\n
.Dream-Repairman {\n
border: 1px solid #cbb;\n
background-color:#fdd;\n
background-image: linear-gradient(to bottom, #fdd 0%, #dcc 100%);\n
}\n
\n
.window, .dummy_window {\n
border:1px solid lightgray;\n
width:100px;\n
height:64px;\n
position:absolute;\n
color:black;\n
font-family:serif;\n
font-style:italic;\n
padding-top:0.9em;\n
font-size:0.9em;\n
cursor:move;\n
font-size:11px;\n
-webkit-transition:background-color 0.1s ease-in;\n
-moz-transition:background-color 0.1s ease-in;\n
transition:background-color 0.1s ease-in;\n
border-radius: 5px;\n
}\n
\n
.window:hover {\n
background-color: #5c96bc;\n
background-image: none;\n
color:white;\n
}\n
\n
.dummy_window {\n
position: absolute;\n
top: 0;\n
left: 0;\n
visibility: hidden;\n
}\n
\n
.ep {\n
position:absolute;\n
bottom:37%;\n
right:5px;\n
width:1em;\n
height:1em;\n
background-color:orange;\n
cursor:pointer;\n
box-shadow: 0px 0px 2px black;\n
-webkit-transition:-webkit-box-shadow 0.25s ease-in;\n
-moz-transition:-moz-box-shadow 0.25s ease-in;\n
transition:box-shadow 0.25s ease-in;\n
}\n
\n
._jsPlumb_source_hover, ._jsPlumb_target_hover, .dragHover {\n
background-color:#1e8151;\n
background-image: none;\n
color:white;\n
}\n
\n
path {\n
cursor:pointer;\n
}\n
</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>3922</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17687421.03</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>jsplumb.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/* ===========================================================================\n
* Copyright 2013 Nexedi SA and Contributors\n
*\n
* This file is part of DREAM.\n
*\n
* DREAM is free software: you can redistribute it and/or modify\n
* it under the terms of the GNU Lesser General Public License as published by\n
* the Free Software Foundation, either version 3 of the License, or\n
* (at your option) any later version.\n
*\n
* DREAM is distributed in the hope that it will be useful,\n
* but WITHOUT ANY WARRANTY; without even the implied warranty of\n
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n
* GNU Lesser General Public License for more details.\n
*\n
* You should have received a copy of the GNU Lesser General Public License\n
* along with DREAM. If not, see <http://www.gnu.org/licenses/>.\n
* ==========================================================================*/\n
/*global RSVP, rJS, $, jsPlumb, Handlebars,\n
loopEventListener, promiseEventListener, DOMParser, confirm */\n
/*jslint unparam: true todo: true */\n
(function(RSVP, rJS, $, jsPlumb, Handlebars, loopEventListener, promiseEventListener, DOMParser) {\n
"use strict";\n
/* TODO:\n
* drop jquery ui dependency\n
* less dependancies ( promise event listner ? )\n
* document exposed css / jsplumb config\n
* no more handlebars\n
* auto springy layout\n
* drop zoom level\n
* edge edit popup on click\n
* rename draggable()\n
* somehow choose edge class on connect\n
*/\n
/*jslint nomen: true */\n
var gadget_klass = rJS(window),\n
domParser = new DOMParser(),\n
node_template_source = gadget_klass.__template_element.getElementById("node-template").innerHTML,\n
node_template = Handlebars.compile(node_template_source),\n
popup_edit_template = gadget_klass.__template_element.getElementById("popup-edit-template");\n
\n
function loopJsplumbBind(gadget, type, callback) {\n
//////////////////////////\n
// Infinite event listener (promise is never resolved)\n
// eventListener is removed when promise is cancelled/rejected\n
//////////////////////////\n
var handle_event_callback, callback_promise, jsplumb_instance = gadget.props.jsplumb_instance;\n
function cancelResolver() {\n
if (callback_promise !== undefined && typeof callback_promise.cancel === "function") {\n
callback_promise.cancel();\n
}\n
}\n
function canceller() {\n
if (handle_event_callback !== undefined) {\n
jsplumb_instance.unbind(type);\n
}\n
cancelResolver();\n
}\n
function resolver(resolve, reject) {\n
handle_event_callback = function() {\n
var args = arguments;\n
cancelResolver();\n
callback_promise = new RSVP.Queue().push(function() {\n
return callback.apply(jsplumb_instance, args);\n
}).push(undefined, function(error) {\n
if (!(error instanceof RSVP.CancellationError)) {\n
canceller();\n
reject(error);\n
}\n
});\n
};\n
jsplumb_instance.bind(type, handle_event_callback);\n
}\n
return new RSVP.Promise(resolver, canceller);\n
}\n
function getNodeId(gadget, element_id) {\n
// returns the ID of the node in the graph from its DOM element id\n
var node_id;\n
$.each(gadget.props.node_id_to_dom_element_id, function(k, v) {\n
if (v === element_id) {\n
node_id = k;\n
return false;\n
}\n
});\n
return node_id;\n
}\n
function generateNodeId(gadget, element) {\n
// Generate a node id\n
var n = 1, class_def = gadget.props.data.class_definition[element._class], id = class_def.short_id || element._class;\n
while (gadget.props.data.graph.node[id + n] !== undefined) {\n
n += 1;\n
}\n
return id + n;\n
}\n
function generateDomElementId(gadget_element) {\n
// Generate a probably unique DOM element ID.\n
var n = 1;\n
while ($(gadget_element).find("#DreamNode_" + n).length > 0) {\n
n += 1;\n
}\n
return "DreamNode_" + n;\n
}\n
function updateConnectionData(gadget, connection, remove, edge_data) {\n
if (remove) {\n
delete gadget.props.data.graph.edge[connection.id];\n
} else {\n
edge_data = edge_data || {\n
_class: "Dream.Edge"\n
};\n
edge_data.source = getNodeId(gadget, connection.sourceId);\n
edge_data.destination = getNodeId(gadget, connection.targetId);\n
gadget.props.data.graph.edge[connection.id] = edge_data;\n
}\n
gadget.notifyDataChanged();\n
}\n
function waitForConnection(gadget) {\n
loopJsplumbBind(gadget, "connection", function(info, originalEvent) {\n
updateConnectionData(gadget, info.connection);\n
});\n
}\n
function waitForConnectionDetached(gadget) {\n
loopJsplumbBind(gadget, "connectionDetached", function(info, originalEvent) {\n
updateConnectionData(gadget, info.connection, true);\n
});\n
}\n
function waitForConnectionClick(gadget) {\n
// TODO: dialog to edit connection properties\n
loopJsplumbBind(gadget, "click", function(connection) {\n
if (confirm("Delete connection ?")) {\n
gadget.props.jsplumb_instance.detach(connection);\n
}\n
});\n
}\n
function convertToAbsolutePosition(gadget, x, y) {\n
var zoom_level = gadget.props.zoom_level * 1.1111, canvas_size_x = $(gadget.props.main).width(), canvas_size_y = $(gadget.props.main).height(), size_x = $(gadget.props.element).find(".dummy_window").width() * zoom_level, size_y = $(gadget.props.element).find(".dummy_window").height() * zoom_level, top = Math.floor(y * (canvas_size_y - size_y)) + "px", left = Math.floor(x * (canvas_size_x - size_x)) + "px";\n
return [ left, top ];\n
}\n
function convertToRelativePosition(gadget, x, y) {\n
var zoom_level = gadget.props.zoom_level * 1.1111, canvas_size_x = $(gadget.props.main).width(), canvas_size_y = $(gadget.props.main).height(), size_x = $(gadget.props.element).find(".dummy_window").width() * zoom_level, size_y = $(gadget.props.element).find(".dummy_window").height() * zoom_level, top = Math.max(Math.min(y.replace("px", "") / (canvas_size_y - size_y), 1), 0), left = Math.max(Math.min(x.replace("px", "") / (canvas_size_x - size_x), 1), 0);\n
return [ left, top ];\n
}\n
function updateElementCoordinate(gadget, node_id, coordinate) {\n
var element_id = gadget.props.node_id_to_dom_element_id[node_id], element, relative_position;\n
if (coordinate === undefined) {\n
element = $(gadget.props.element).find("#" + element_id);\n
relative_position = convertToRelativePosition(gadget, element.css("left"), element.css("top"));\n
coordinate = {\n
left: relative_position[0],\n
top: relative_position[1]\n
};\n
}\n
gadget.props.data.graph.node[node_id].coordinate = coordinate;\n
gadget.notifyDataChanged();\n
return coordinate;\n
}\n
function draggable(gadget) {\n
var jsplumb_instance = gadget.props.jsplumb_instance, stop = function(element) {\n
updateElementCoordinate(gadget, getNodeId(gadget, element.target.id));\n
};\n
// XXX This function should only touch the node element that we just added.\n
jsplumb_instance.draggable(jsplumb_instance.getSelector(".window"), {\n
containment: "parent",\n
grid: [ 10, 10 ],\n
stop: stop\n
});\n
jsplumb_instance.makeSource(jsplumb_instance.getSelector(".window"), {\n
filter: ".ep",\n
anchor: "Continuous",\n
connector: [ "StateMachine", {\n
curviness: 20\n
} ],\n
connectorStyle: {\n
strokeStyle: "#5c96bc",\n
lineWidth: 2,\n
outlineColor: "transparent",\n
outlineWidth: 4\n
}\n
});\n
jsplumb_instance.makeTarget(jsplumb_instance.getSelector(".window"), {\n
dropOptions: {\n
hoverClass: "dragHover"\n
},\n
anchor: "Continuous"\n
});\n
}\n
function updateNodeStyle(gadget, element_id) {\n
// Update node size according to the zoom level\n
// XXX does nothing for now\n
var zoom_level = gadget.props.zoom_level * 1.1111, element = $(gadget.props.element).find("#" + element_id), new_value;\n
$.each(gadget.props.style_attr_list, function(i, j) {\n
new_value = $(gadget.props.element).find(".dummy_window").css(j).replace("px", "") * zoom_level + "px";\n
element.css(j, new_value);\n
});\n
}\n
// function redraw(gadget) {\n
// var coordinates = gadget.props.preference_container.coordinates || {},\n
// absolute_position,\n
// element;\n
// $.each(coordinates, function (node_id, v) {\n
// absolute_position = convertToAbsolutePosition(\n
// gadget,\n
// v.left,\n
// v.top\n
// );\n
// element = $(gadget.props.element).find(\n
// \'#\' + gadget.props.node_id_to_dom_element_id[node_id];\n
// );\n
// element.css(\'top\', absolute_position[1]);\n
// element.css(\'left\', absolute_position[0]);\n
// gadget.props.jsplumb_instance.repaint(element);\n
// });\n
// }\n
// function positionGraph(gadget) {\n
// $.ajax(\n
// \'/positionGraph\',\n
// {\n
// data: JSON.stringify(getData()),\n
// contentType: \'application/json\',\n
// type: \'POST\',\n
// success: function (data, textStatus, jqXHR) {\n
// $.each(data, function (node, pos) {\n
// convertToAbsolutePosition(\n
// gadget,\n
// pos.left,\n
// pos.top\n
// );\n
// updateElementCoordinate(gadget, node, {\n
// top: pos.top,\n
// left: pos.left\n
// });\n
// });\n
// redraw(gadget);\n
// }\n
// }\n
// );\n
// }\n
function removeElement(gadget, node_id) {\n
var element_id = gadget.props.node_id_to_dom_element_id[node_id];\n
gadget.props.jsplumb_instance.removeAllEndpoints($(gadget.props.element).find("#" + element_id));\n
$(gadget.props.element).find("#" + element_id).remove();\n
delete gadget.props.data.graph.node[node_id];\n
$.each(gadget.props.data.graph.edge, function(k, v) {\n
if (node_id === v.source || node_id === v.destination) {\n
delete gadget.props.data.graph.edge[k];\n
}\n
});\n
gadget.notifyDataChanged();\n
}\n
function updateElementData(gadget, node_id, data) {\n
var element_id = gadget.props.node_id_to_dom_element_id[node_id], new_id = data.id;\n
if (data.data.name) {\n
$(gadget.props.element).find("#" + element_id).text(data.data.name).attr("title", data.data.name).append(\'<div class="ep"></div></div>\');\n
gadget.props.data.graph.node[node_id].name = data.data.name;\n
}\n
delete data.id;\n
$.extend(gadget.props.data.graph.node[node_id], data.data);\n
if (new_id && new_id !== node_id) {\n
gadget.props.data.graph.node[new_id] = gadget.props.data.graph.node[node_id];\n
delete gadget.props.data.graph.node[node_id];\n
gadget.props.node_id_to_dom_element_id[new_id] = gadget.props.node_id_to_dom_element_id[node_id];\n
delete gadget.props.node_id_to_dom_element_id[node_id];\n
delete gadget.props.data.graph.node[new_id].id;\n
$.each(gadget.props.data.graph.edge, function(k, v) {\n
if (v.source === node_id) {\n
v.source = new_id;\n
}\n
if (v.destination === node_id) {\n
v.destination = new_id;\n
}\n
});\n
}\n
gadget.notifyDataChanged();\n
}\n
function addEdge(gadget, edge_id, edge_data) {\n
var overlays = [], connection;\n
if (edge_data.name) {\n
overlays = [ [ "Label", {\n
cssClass: "l1 component label",\n
label: edge_data.name\n
} ] ];\n
}\n
if (gadget.props.data.graph.node[edge_data.source] === undefined) {\n
throw new Error("Edge Source " + edge_data.source + " does not exist");\n
}\n
if (gadget.props.data.graph.node[edge_data.source] === undefined) {\n
throw new Error("Edge Destination " + edge_data.source + " does not exist");\n
}\n
// If an edge has this data:\n
// { _class: \'Edge\', \n
// source: \'N1\',\n
// destination: \'N2\',\n
// jsplumb_source_endpoint: \'BottomCenter\',\n
// jsplumb_destination_endpoint: \'LeftMiddle\',\n
// jsplumb_connector: \'Flowchart\' }\n
// Then it is rendered using a flowchart connector. The difficulty is that\n
// jsplumb does not let you configure the connector type on the edge, but\n
// on the source endpoint. One solution seem to create all types of\n
// endpoints on nodes.\n
if (edge_data.jsplumb_connector === "Flowchart") {\n
connection = gadget.props.jsplumb_instance.connect({\n
uuids: [ edge_data.source + ".flowChart" + edge_data.jsplumb_source_endpoint, edge_data.destination + ".flowChart" + edge_data.jsplumb_destination_endpoint ],\n
overlays: overlays\n
});\n
} else {\n
connection = gadget.props.jsplumb_instance.connect({\n
source: gadget.props.node_id_to_dom_element_id[edge_data.source],\n
target: gadget.props.node_id_to_dom_element_id[edge_data.destination],\n
Connector: [ "Bezier", {\n
curviness: 75\n
} ],\n
overlays: overlays\n
});\n
}\n
// jsplumb assigned an id, but we are controlling ids ourselves.\n
connection.id = edge_id;\n
}\n
function expandSchema(class_definition, full_schema) {\n
// minimal expanding of json schema, supports merging allOf and $ref\n
// references\n
// TODO: check for a library that would provide full support\n
var property, referenced, i, expanded_class_definition = {\n
properties: class_definition.properties || {}\n
};\n
if (class_definition.allOf) {\n
for (i = 0; i < class_definition.allOf.length; i += 1) {\n
referenced = class_definition.allOf[i];\n
if (referenced.$ref) {\n
referenced = expandSchema(full_schema.class_definition[referenced.$ref.substr(1, referenced.$ref.length)], full_schema);\n
}\n
if (referenced.properties) {\n
for (property in referenced.properties) {\n
if (referenced.properties.hasOwnProperty(property)) {\n
if (referenced.properties[property].type) {\n
expanded_class_definition.properties[property] = referenced.properties[property];\n
}\n
}\n
}\n
}\n
}\n
}\n
return expanded_class_definition;\n
}\n
function openNodeDialog(gadget, element) {\n
var node_id = getNodeId(gadget, element.id), node_data = gadget.props.data.graph.node[node_id], node_edit_popup = $(gadget.props.element).find("#popup-edit-template"), schema, fieldset_element, delete_promise;\n
// If we have no definition for this, we do not allow edition.\n
if (gadget.props.data.class_definition[node_data._class] === undefined) {\n
return;\n
}\n
schema = expandSchema(gadget.props.data.class_definition[node_data._class], gadget.props.data);\n
if (node_edit_popup.length !== 0) {\n
node_edit_popup.remove();\n
}\n
gadget.props.element.appendChild(document.importNode(popup_edit_template.content, true).children[0]);\n
node_edit_popup = $(gadget.props.element).find("#node-edit-popup");\n
// Set the name of the popup to the node class\n
node_edit_popup.find(".node_class").text(node_data._class);\n
fieldset_element = node_edit_popup.find("fieldset")[0];\n
node_edit_popup.popup();\n
node_data.id = node_id;\n
// XXX\n
function save_promise(fieldset_gadget, node_id) {\n
return RSVP.Queue().push(function() {\n
return promiseEventListener(node_edit_popup.find("form")[0], "submit", false);\n
}).push(function(evt) {\n
var data = {\n
// XXX id should not be handled differently ...\n
id: $(evt.target[1]).val(),\n
data: {}\n
};\n
return fieldset_gadget.getContent().then(function(r) {\n
$.extend(data.data, r);\n
updateElementData(gadget, node_id, data);\n
});\n
});\n
}\n
delete_promise = new RSVP.Queue().push(function() {\n
return promiseEventListener(node_edit_popup.find("form [type=\'button\']")[0], "click", false);\n
}).push(function() {\n
return removeElement(gadget, node_id);\n
});\n
return gadget.declareGadget("../fieldset/index.html", {\n
element: fieldset_element,\n
scope: "fieldset"\n
}).push(function(fieldset_gadget) {\n
return RSVP.all([ fieldset_gadget, fieldset_gadget.render({\n
value: node_data,\n
property_definition: schema\n
}, node_id) ]);\n
}).push(function(fieldset_gadget) {\n
node_edit_popup.enhanceWithin();\n
node_edit_popup.popup("open");\n
return fieldset_gadget[0];\n
}).push(function(fieldset_gadget) {\n
// Expose the dialog handling promise so that we can wait for it in\n
// test.\n
gadget.props.dialog_promise = RSVP.any([ save_promise(fieldset_gadget, node_id), delete_promise ]);\n
return gadget.props.dialog_promise;\n
}).push(function() {\n
node_edit_popup.popup("close");\n
node_edit_popup.remove();\n
delete gadget.props.dialog_promise;\n
});\n
}\n
function waitForNodeClick(gadget, node) {\n
gadget.props.nodes_click_monitor.monitor(loopEventListener(node, "dblclick", false, openNodeDialog.bind(null, gadget, node)));\n
}\n
function addNode(gadget, node_id, node_data) {\n
var render_element = $(gadget.props.main), class_definition = gadget.props.data.class_definition[node_data._class], coordinate = node_data.coordinate, dom_element_id, box, absolute_position, domElement;\n
dom_element_id = generateDomElementId(gadget.props.element);\n
gadget.props.node_id_to_dom_element_id[node_id] = dom_element_id;\n
node_data.name = node_data.name || class_definition.name;\n
gadget.props.data.graph.node[node_id] = node_data;\n
if (coordinate === undefined) {\n
coordinate = {\n
top: 0,\n
left: 0\n
};\n
}\n
node_data.coordinate = updateElementCoordinate(gadget, node_id, coordinate);\n
// XXX make node template an option, or use CSS from class_definition\n
/*jslint nomen: true*/\n
domElement = domParser.parseFromString(node_template({\n
"class": node_data._class.replace(".", "-"),\n
element_id: dom_element_id,\n
title: node_data.name || node_data.id,\n
name: node_data.name || node_data.id\n
}), "text/html").querySelector(".window");\n
render_element.append(domElement);\n
waitForNodeClick(gadget, domElement);\n
box = $(gadget.props.element).find("#" + dom_element_id);\n
absolute_position = convertToAbsolutePosition(gadget, coordinate.left, coordinate.top);\n
box.css("top", absolute_position[1]);\n
box.css("left", absolute_position[0]);\n
updateNodeStyle(gadget, dom_element_id);\n
draggable(gadget);\n
// XXX make only this element draggable.\n
// Add some flowchart endpoints\n
// TODO: add them all !\n
gadget.props.jsplumb_instance.addEndpoint(dom_element_id, {\n
isSource: true,\n
maxConnections: -1,\n
connector: [ "Flowchart", {\n
stub: [ 40, 60 ],\n
gap: 10,\n
cornerRadius: 5,\n
alwaysRespectStubs: true\n
} ]\n
}, {\n
anchor: "BottomCenter",\n
uuid: node_id + ".flowchartBottomCenter"\n
});\n
gadget.props.jsplumb_instance.addEndpoint(dom_element_id, {\n
isTarget: true,\n
maxConnections: -1\n
}, {\n
anchor: "LeftMiddle",\n
uuid: node_id + ".flowChartLeftMiddle"\n
});\n
gadget.notifyDataChanged();\n
}\n
function waitForDrop(gadget) {\n
var callback;\n
function canceller() {\n
if (callback !== undefined) {\n
gadget.props.main.removeEventListener("drop", callback, false);\n
}\n
}\n
/*jslint unparam: true*/\n
function resolver(resolve, reject) {\n
callback = function(evt) {\n
try {\n
var class_name = JSON.parse(evt.dataTransfer.getData("application/json")), offset = $(gadget.props.main).offset(), relative_position = convertToRelativePosition(gadget, evt.clientX - offset.left + "px", evt.clientY - offset.top + "px");\n
addNode(gadget, generateNodeId(gadget, {\n
_class: class_name\n
}), {\n
coordinate: {\n
left: relative_position[0],\n
top: relative_position[1]\n
},\n
_class: class_name\n
});\n
} catch (e) {\n
reject(e);\n
}\n
};\n
gadget.props.main.addEventListener("drop", callback, false);\n
}\n
return new RSVP.all([ // loopEventListener adds an event listener that will prevent default for\n
// dragover\n
loopEventListener(gadget.props.main, "dragover", false, function() {\n
return undefined;\n
}), RSVP.Promise(resolver, canceller) ]);\n
}\n
gadget_klass.ready(function(g) {\n
g.props = {};\n
g.props.node_id_to_dom_element_id = {};\n
g.props.zoom_level = 1;\n
g.props.style_attr_list = [ "width", "height", "padding-top", "line-height" ];\n
g.getElement().then(function(element) {\n
g.props.element = element;\n
});\n
}).declareAcquiredMethod("notifyDataChanged", "notifyDataChanged").declareMethod("render", function(data) {\n
var gadget = this;\n
this.props.data = {};\n
console.log("render", data);\n
if (data.value) {\n
// Gadget embedded in ERP5\n
this.props.erp5_key = data.key;\n
data = data.value;\n
}\n
\n
if (data) {\n
this.props.data = JSON.parse(data);\n
// load the data\n
$.each(this.props.data.graph.node, function(key, value) {\n
addNode(gadget, key, value);\n
});\n
$.each(this.props.data.graph.edge, function(key, value) {\n
addEdge(gadget, key, value);\n
});\n
}\n
this.props.jsplumb_instance = jsPlumb.getInstance();\n
}).declareMethod("getContent", function() {\n
if (this.props.erp5_key) {\n
// ERP5\n
return JSON.stringify({key: this.props.erp5_key, value: this.props.data});\n
}\n
return JSON.stringify(this.props.data);\n
}).declareMethod("startService", function() {\n
// no more needed, see below\n
}).declareService(function() {\n
var gadget = this, jsplumb_instance;\n
this.props.jsplumb_instance = jsPlumb.getInstance();\n
jsplumb_instance= gadget.props.jsplumb_instance;\n
this.props.main = this.props.element.querySelector("#main");\n
jsplumb_instance.setRenderMode(jsplumb_instance.SVG);\n
jsplumb_instance.importDefaults({\n
HoverPaintStyle: {\n
strokeStyle: "#1e8151",\n
lineWidth: 2\n
},\n
Endpoint: [ "Dot", {\n
radius: 2\n
} ],\n
ConnectionOverlays: [ [ "Arrow", {\n
location: 1,\n
id: "arrow",\n
length: 14,\n
foldback: .8\n
} ] ],\n
Container: this.props.main\n
});\n
draggable(gadget);\n
this.props.nodes_click_monitor = RSVP.Monitor();\n
console.log(this.props.data);\n
if (this.props.data) {\n
// load the data\n
$.each(this.props.data.graph.node, function(key, value) {\n
addNode(gadget, key, value);\n
});\n
$.each(this.props.data.graph.edge, function(key, value) {\n
addEdge(gadget, key, value);\n
});\n
}\n
return RSVP.all([ waitForDrop(gadget), waitForConnection(gadget), waitForConnectionDetached(gadget), waitForConnectionClick(gadget), gadget.props.nodes_click_monitor ]);\n
});\n
})(RSVP, rJS, $, jsPlumb, Handlebars, loopEventListener, promiseEventListener, DOMParser);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>25449</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681766.24</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>test.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!doctype html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<link rel="stylesheet" href="../lib/qunit.css">\n
\n
<script src="../lib/rsvp.min.js"></script>\n
<script src="../lib/renderjs.min.js"></script>\n
<script src="../lib/qunit.js"></script>\n
<script src="../lib/jquery.js"></script>\n
<script src="../lib/jquery.simulate.js"></script>\n
<script src="test.js"></script>\n
</head>\n
<body>\n
<div id="qunit"></div>\n
<div id="qunit-fixture"></div>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>492</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681766.37</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>test.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global rJS, JSON, QUnit, jQuery, RSVP, console, setTimeout*/\n
(function(rJS, JSON, QUnit, RSVP, $) {\n
"use strict";\n
var start = QUnit.start, stop = QUnit.stop, test = QUnit.test, equal = QUnit.equal, ok = QUnit.ok, error_handler = function(e) {\n
console.error(e);\n
ok(false, e);\n
}, sample_class_definition = {\n
edge: {\n
description: "Base definition for edge",\n
properties: {\n
_class: {\n
type: "string"\n
},\n
destination: {\n
type: "string"\n
},\n
name: {\n
type: "string"\n
},\n
required: [ "name", "_class", "source", "destination" ],\n
source: {\n
type: "string"\n
}\n
},\n
type: "object"\n
},\n
"Example.Edge": {\n
_class: "edge",\n
allOf: [ {\n
$ref: "#edge"\n
}, {\n
properties: {\n
color: {\n
"enum": [ "red", "green", "blue" ]\n
}\n
}\n
} ],\n
description: "An example edge with a color property"\n
},\n
"Example.Node": {\n
_class: "node",\n
allOf: [ {\n
$ref: "#node"\n
}, {\n
properties: {\n
shape: {\n
type: "string"\n
}\n
}\n
} ],\n
description: "An example node with a shape property"\n
},\n
node: {\n
description: "Base definition for node",\n
properties: {\n
_class: {\n
type: "string"\n
},\n
coordinate: {\n
properties: {\n
left: "number",\n
top: "number"\n
},\n
type: "object"\n
},\n
name: {\n
type: "string"\n
},\n
required: [ "name", "_class" ]\n
},\n
type: "object"\n
}\n
}, sample_graph = {\n
edge: {\n
edge1: {\n
_class: "Example.Edge",\n
source: "N1",\n
destination: "N2",\n
color: "blue"\n
}\n
},\n
node: {\n
N1: {\n
_class: "Example.Node",\n
name: "Node 1",\n
coordinate: {\n
top: 0,\n
left: 0\n
},\n
shape: "square"\n
},\n
N2: {\n
_class: "Example.Node",\n
name: "Node 2",\n
shape: "circle"\n
}\n
}\n
}, sample_graph_not_connected = {\n
edge: {},\n
node: {\n
N1: {\n
_class: "Example.Node",\n
name: "Node 1",\n
shape: "square"\n
},\n
N2: {\n
_class: "Example.Node",\n
name: "Node 2",\n
shape: "circle"\n
}\n
}\n
}, sample_data_graph = JSON.stringify({\n
class_definition: sample_class_definition,\n
graph: sample_graph\n
}), sample_data_graph_not_connected = JSON.stringify({\n
class_definition: sample_class_definition,\n
graph: sample_graph_not_connected\n
}), sample_data_empty_graph = JSON.stringify({\n
class_definition: sample_class_definition,\n
graph: {\n
node: {},\n
edge: {}\n
}\n
});\n
QUnit.config.testTimeout = 5e3;\n
rJS(window).ready(function(g) {\n
test("Sample graph can be loaded and output is equal to input", function() {\n
var jsplumb_gadget;\n
stop();\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
jsplumb_gadget = new_gadget;\n
return jsplumb_gadget.render(sample_data_graph);\n
}).then(function() {\n
return jsplumb_gadget.getContent();\n
}).then(function(content) {\n
equal(content, sample_data_graph);\n
}).fail(error_handler).always(start);\n
});\n
test("New node can be drag & dropped", function() {\n
var jsplumb_gadget;\n
stop();\n
function runTest() {\n
// XXX here I used getContent to have a promise, but there must be a\n
// more elegant way.\n
return jsplumb_gadget.getContent().then(function() {\n
// fake a drop event\n
var e = new Event("drop");\n
e.dataTransfer = {\n
getData: function(type) {\n
// make sure we are called properly\n
equal("application/json", type, "The drag&dropped element must have data type application/json");\n
return JSON.stringify("Example.Node");\n
}\n
};\n
jsplumb_gadget.props.main.dispatchEvent(e);\n
}).then(function() {\n
return jsplumb_gadget.getContent();\n
}).then(function(content) {\n
var node, graph = JSON.parse(content).graph;\n
equal(1, Object.keys(graph.node).length);\n
node = graph.node[Object.keys(graph.node)[0]];\n
equal("Example.Node", node._class);\n
});\n
}\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
jsplumb_gadget = new_gadget;\n
jsplumb_gadget.render(sample_data_empty_graph);\n
}).then(function() {\n
return RSVP.any([ jsplumb_gadget.startService(), runTest() ]);\n
}).fail(error_handler).always(start);\n
});\n
test("Node can be dragged", function() {\n
var jsplumb_gadget;\n
stop();\n
function runTest() {\n
return jsplumb_gadget.getContent().then(function() {\n
// 100 and 60 are about 10% of the #main div ( set by css, so this\n
// might change )\n
$("div[title=\'Node 1\']").simulate("drag", {\n
dx: 100,\n
dy: 60\n
});\n
}).then(function() {\n
return jsplumb_gadget.getContent();\n
}).then(function(content) {\n
var graph = JSON.parse(content).graph, node_coordinate = graph.node.N1.coordinate;\n
// Since original coordinates where 0,0 we are now about 0.1,0.1\n
// as we moved 10%\n
ok(node_coordinate.top - .1 < .1, "Top is ok");\n
ok(node_coordinate.left - .1 < .1, "Left is ok");\n
});\n
}\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
jsplumb_gadget = new_gadget;\n
jsplumb_gadget.render(sample_data_graph);\n
}).then(function() {\n
return RSVP.any([ jsplumb_gadget.startService(), runTest() ]);\n
}).fail(error_handler).always(start);\n
});\n
test("Node properties can be edited", function() {\n
var jsplumb_gadget;\n
stop();\n
function runTest() {\n
return jsplumb_gadget.getContent().then(function() {\n
// click on a node to see display the popup\n
$("div[title=\'Node 1\']").simulate("dblclick");\n
// Promises that handle the dialog actions are not available\n
// immediately after clicking.\n
var promise = RSVP.Promise(function(resolve) {\n
var fillDialog = function() {\n
if (!jsplumb_gadget.props.dialog_promise) {\n
// Dialog not ready. Let\'s retry later.\n
// XXX this condition is actually incorrect. We need to wait\n
// for the event listener to have been registered for the\n
// dialog buttons. This setTimeout is good enough for now.\n
return setTimeout(fillDialog, 1e3);\n
}\n
// check displayed values\n
equal($("input[name=\'id\']").val(), "N1");\n
equal($("input[name=\'name\']").val(), "Node 1");\n
equal($("input[name=\'shape\']").val(), "square");\n
// change the name\n
$("input[name=\'name\']").val("Modified Name");\n
equal(1, $("input[value=\'Validate\']").length, "There should be one validate button");\n
// and save\n
$("input[value=\'Validate\']").click();\n
// resolve our test promise once the dialog handling promise is\n
// finished.\n
jsplumb_gadget.props.dialog_promise.then(resolve);\n
};\n
fillDialog();\n
});\n
return promise.then(function() {\n
return jsplumb_gadget.getContent().then(function(content) {\n
var graph = JSON.parse(content).graph, node = graph.node.N1;\n
equal("Modified Name", node.name, "Data is modified");\n
equal("Modified Name", $("div#" + jsplumb_gadget.props.node_id_to_dom_element_id.N1).text(), "DOM is modified");\n
equal(1, $("div[title=\'Modified Name\']").length, "DOM title attribute is modified");\n
});\n
});\n
});\n
}\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
jsplumb_gadget = new_gadget;\n
jsplumb_gadget.render(sample_data_graph);\n
}).then(function() {\n
return RSVP.any([ jsplumb_gadget.startService(), runTest() ]);\n
}).fail(error_handler).always(start);\n
});\n
test("Node can be connected", function() {\n
var jsplumb_gadget;\n
stop();\n
function runTest() {\n
return jsplumb_gadget.getContent().then(function(content) {\n
var node1 = jsplumb_gadget.props.main.querySelector("div[title=\'Node 1\']"), node2 = jsplumb_gadget.props.main.querySelector("div[title=\'Node 2\']");\n
equal(0, Object.keys(JSON.parse(content).graph.edge).length, "There are no edge at the beginning");\n
jsplumb_gadget.props.jsplumb_instance.connect({\n
source: node1.id,\n
target: node2.id\n
});\n
}).then(function() {\n
return jsplumb_gadget.getContent();\n
}).then(function(content) {\n
var edge, graph = JSON.parse(content).graph;\n
equal(2, Object.keys(graph.node).length, "We still have 2 nodes");\n
equal(1, Object.keys(graph.edge).length, "We have 1 edge");\n
edge = graph.edge[Object.keys(graph.edge)[0]];\n
// XXX how edge class would be set ? the first one from schema ?\n
//equal("Example.Edge", edge._class, "Edge class is correct");\n
equal("N1", edge.source, "edge source is correct");\n
equal("N2", edge.destination, "edge destination is correct");\n
});\n
}\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
jsplumb_gadget = new_gadget;\n
jsplumb_gadget.render(sample_data_graph_not_connected);\n
}).then(function() {\n
return RSVP.any([ jsplumb_gadget.startService(), runTest() ]);\n
}).fail(error_handler).always(start);\n
});\n
test("Node can be deleted", function() {\n
var jsplumb_gadget;\n
stop();\n
function runTest() {\n
return jsplumb_gadget.getContent().then(function() {\n
equal(1, $("div[title=\'Node 1\']").length, "node 1 is visible");\n
equal(1, $("._jsPlumb_connector").length, "there is 1 connection");\n
// click on node 1 to see display the popup\n
$("div[title=\'Node 1\']").simulate("dblclick");\n
// Promises that handle the dialog actions are not available\n
// immediately after clicking.\n
var promise = RSVP.Promise(function(resolve) {\n
var waitForDialogAndDelete = function() {\n
if (!jsplumb_gadget.props.dialog_promise) {\n
// Dialog not ready. Let\'s retry later.\n
// XXX this condition is actually incorrect. We need to wait\n
// for the event listener to have been registered for the\n
// dialog buttons. This setTimeout is good enough for now.\n
return setTimeout(waitForDialogAndDelete, 1e3);\n
}\n
equal(1, $("input[value=\'Delete\']").length, "There should be one delete button");\n
$("input[value=\'Delete\']").click();\n
// resolve our test promise once the dialog handling promise is\n
// finished.\n
jsplumb_gadget.props.dialog_promise.then(resolve);\n
};\n
waitForDialogAndDelete();\n
});\n
return promise.then(function() {\n
return jsplumb_gadget.getContent().then(function(content) {\n
var graph = JSON.parse(content).graph;\n
equal(1, Object.keys(graph.node).length, "node is removed from data");\n
equal(0, Object.keys(graph.edge).length, "edge referencing this node is also removed");\n
equal(0, $("div[title=\'Node 1\']").length, "DOM element for node is removed");\n
equal(0, $("._jsPlumb_connector").length, "DOM element for edge is removed");\n
});\n
});\n
});\n
}\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
jsplumb_gadget = new_gadget;\n
jsplumb_gadget.render(sample_data_graph);\n
}).then(function() {\n
return RSVP.any([ jsplumb_gadget.startService(), runTest() ]);\n
}).fail(error_handler).always(start);\n
});\n
test("Node id can be changed (connections are updated and node" + " can be edited afterwards)", function() {\n
var jsplumb_gadget;\n
stop();\n
function runTest() {\n
return jsplumb_gadget.getContent().then(function() {\n
// click on a node to see display the popup\n
$("div[title=\'Node 1\']").simulate("dblclick");\n
// Promises that handle the dialog actions are not available\n
// immediately after clicking.\n
var promise = RSVP.Promise(function(resolve) {\n
var fillDialog = function() {\n
if (!jsplumb_gadget.props.dialog_promise) {\n
// Dialog not ready. Let\'s retry later.\n
// XXX this condition is actually incorrect. We need to wait\n
// for the event listener to have been registered for the\n
// dialog buttons. This setTimeout is good enough for now.\n
return setTimeout(fillDialog, 1e3);\n
}\n
equal($("input[name=\'id\']").val(), "N1");\n
// change the id\n
$("input[name=\'id\']").val("N1b");\n
equal(1, $("input[value=\'Validate\']").length, "There should be one validate button");\n
$("input[value=\'Validate\']").click();\n
// resolve our test promise once the dialog handling promise is\n
// finished.\n
jsplumb_gadget.props.dialog_promise.then(resolve);\n
};\n
fillDialog();\n
});\n
return promise.then(function() {\n
return jsplumb_gadget.getContent().then(function(content) {\n
var graph = JSON.parse(content).graph;\n
equal(2, Object.keys(graph.node).length, "We still have two nodes");\n
ok(graph.node.N1b !== undefined, "Node Id changed");\n
equal(1, Object.keys(graph.edge).length, "We still have one connection");\n
equal("N1b", graph.edge.edge1.source, "Connection source has been updated");\n
});\n
});\n
});\n
}\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
jsplumb_gadget = new_gadget;\n
jsplumb_gadget.render(sample_data_graph);\n
}).then(function() {\n
return RSVP.any([ jsplumb_gadget.startService(), runTest() ]);\n
}).fail(error_handler).always(start);\n
});\n
test("New node can be edited", function() {\n
var jsplumb_gadget, node_id;\n
stop();\n
function runTest() {\n
// XXX here I used getContent to have a promise, but there must be a\n
// more elegant way.\n
return jsplumb_gadget.getContent().then(function() {\n
// fake a drop event\n
var e = new Event("drop");\n
e.dataTransfer = {\n
getData: function(type) {\n
// make sure we are called properly\n
equal("application/json", type, "The drag&dropped element must have data type application/json");\n
return JSON.stringify("Example.Node");\n
}\n
};\n
jsplumb_gadget.props.main.dispatchEvent(e);\n
}).then(function() {\n
return jsplumb_gadget.getContent();\n
}).then(function(content) {\n
var node, graph = JSON.parse(content).graph;\n
equal(1, Object.keys(graph.node).length);\n
node_id = Object.keys(graph.node)[0];\n
node = graph.node[node_id];\n
equal("Example.Node", node._class);\n
}).then(function() {\n
// click the new node to see display the popup\n
// XXX at the moment nodes have class window\n
equal(1, $("div.window").length, "We have a new node");\n
$("div.window").simulate("dblclick");\n
// Promises that handle the dialog actions are not available\n
// immediately after clicking.\n
var promise = RSVP.Promise(function(resolve) {\n
var fillDialog = function() {\n
if (!jsplumb_gadget.props.dialog_promise) {\n
// Dialog not ready. Let\'s retry later.\n
// XXX this condition is actually incorrect. We need to wait\n
// for the event listener to have been registered for the\n
// dialog buttons. This setTimeout is good enough for now.\n
return setTimeout(fillDialog, 1e3);\n
}\n
// check displayed values\n
equal($("input[name=\'id\']").val(), node_id);\n
equal($("input[name=\'name\']").val(), "");\n
equal($("input[name=\'shape\']").val(), "");\n
// change the name\n
$("input[name=\'name\']").val("Modified Name");\n
equal(1, $("input[value=\'Validate\']").length, "There should be one validate button");\n
// and save\n
$("input[value=\'Validate\']").click();\n
// resolve our test promise once the dialog handling promise is\n
// finished.\n
jsplumb_gadget.props.dialog_promise.then(resolve);\n
};\n
fillDialog();\n
});\n
return promise.then(function() {\n
return jsplumb_gadget.getContent().then(function(content) {\n
var graph = JSON.parse(content).graph, node = graph.node[node_id];\n
equal("Modified Name", node.name, "Data is modified");\n
equal("Modified Name", $("div.window").text(), "DOM is modified");\n
});\n
});\n
});\n
}\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
jsplumb_gadget = new_gadget;\n
jsplumb_gadget.render(sample_data_empty_graph);\n
}).then(function() {\n
return RSVP.any([ jsplumb_gadget.startService(), runTest() ]);\n
}).fail(error_handler).always(start);\n
});\n
test("New node can be deleted", function() {\n
var jsplumb_gadget, node_id;\n
stop();\n
function runTest() {\n
// XXX here I used getContent to have a promise, but there must be a\n
// more elegant way.\n
return jsplumb_gadget.getContent().then(function() {\n
// fake a drop event\n
var e = new Event("drop");\n
e.dataTransfer = {\n
getData: function(type) {\n
// make sure we are called properly\n
equal("application/json", type, "The drag&dropped element must have data type application/json");\n
return JSON.stringify("Example.Node");\n
}\n
};\n
jsplumb_gadget.props.main.dispatchEvent(e);\n
}).then(function() {\n
return jsplumb_gadget.getContent();\n
}).then(function(content) {\n
var node, graph = JSON.parse(content).graph;\n
equal(1, Object.keys(graph.node).length);\n
node_id = Object.keys(graph.node)[0];\n
node = graph.node[node_id];\n
equal("Example.Node", node._class);\n
}).then(function() {\n
// click the new node to see display the popup\n
// XXX at the moment nodes have class window\n
equal(1, $("div.window").length, "We have a new node");\n
$("div.window").simulate("dblclick");\n
// Promises that handle the dialog actions are not available\n
// immediately after clicking.\n
var promise = RSVP.Promise(function(resolve) {\n
var waitForDialogAndDelete = function() {\n
if (!jsplumb_gadget.props.dialog_promise) {\n
// Dialog not ready. Let\'s retry later.\n
// XXX this condition is actually incorrect. We need to wait\n
// for the event listener to have been registered for the\n
// dialog buttons. This setTimeout is good enough for now.\n
return setTimeout(waitForDialogAndDelete, 1e3);\n
}\n
equal(1, $("input[value=\'Delete\']").length, "There should be one delete button");\n
$("input[value=\'Delete\']").click();\n
// resolve our test promise once the dialog handling promise is\n
// finished.\n
jsplumb_gadget.props.dialog_promise.then(resolve);\n
};\n
waitForDialogAndDelete();\n
});\n
return promise.then(function() {\n
return jsplumb_gadget.getContent().then(function(content) {\n
var graph = JSON.parse(content).graph;\n
equal(0, Object.keys(graph.node).length, "node is removed from data");\n
equal(0, $("div.window").length, "DOM is modified");\n
});\n
});\n
});\n
}\n
g.declareGadget("./index.html", {\n
element: document.querySelector("#qunit-fixture")\n
}).then(function(new_gadget) {\n
jsplumb_gadget = new_gadget;\n
jsplumb_gadget.render(sample_data_empty_graph);\n
}).then(function() {\n
return RSVP.any([ jsplumb_gadget.startService(), runTest() ]);\n
}).fail(error_handler).always(start);\n
});\n
});\n
})(rJS, JSON, QUnit, RSVP, jQuery);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>26485</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>lib</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681771.3</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>URI.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*! URI.js v1.12.0 http://medialize.github.com/URI.js/ */\n
/* build contains: IPv6.js, punycode.js, SecondLevelDomains.js, URI.js, URI.fragmentQuery.js */\n
(function(e,k){"object"===typeof exports?module.exports=k():"function"===typeof define&&define.amd?define(k):e.IPv6=k(e)})(this,function(e){var k=e&&e.IPv6;return{best:function(e){e=e.toLowerCase().split(":");var k=e.length,d=8;""===e[0]&&""===e[1]&&""===e[2]?(e.shift(),e.shift()):""===e[0]&&""===e[1]?e.shift():""===e[k-1]&&""===e[k-2]&&e.pop();k=e.length;-1!==e[k-1].indexOf(".")&&(d=7);var g;for(g=0;g<k&&""!==e[g];g++);if(g<d)for(e.splice(g,1,"0000");e.length<d;)e.splice(g,0,"0000");for(g=0;g<d;g++){for(var k=\n
e[g].split(""),q=0;3>q;q++)if("0"===k[0]&&1<k.length)k.splice(0,1);else break;e[g]=k.join("")}var k=-1,l=q=0,r=-1,z=!1;for(g=0;g<d;g++)z?"0"===e[g]?l+=1:(z=!1,l>q&&(k=r,q=l)):"0"==e[g]&&(z=!0,r=g,l=1);l>q&&(k=r,q=l);1<q&&e.splice(k,q,"");k=e.length;d="";""===e[0]&&(beststr=":");for(g=0;g<k;g++){d+=e[g];if(g===k-1)break;d+=":"}""===e[k-1]&&(d+=":");return d},noConflict:function(){e.IPv6===this&&(e.IPv6=k);return this}}});\n
(function(e){function k(a){throw RangeError(p[a]);}function u(a,b){for(var c=a.length;c--;)a[c]=b(a[c]);return a}function m(a,b){return u(a.split(h),b).join(".")}function d(a){for(var b=[],c=0,d=a.length,h,p;c<d;)h=a.charCodeAt(c++),55296<=h&&56319>=h&&c<d?(p=a.charCodeAt(c++),56320==(p&64512)?b.push(((h&1023)<<10)+(p&1023)+65536):(b.push(h),c--)):b.push(h);return b}function g(a){return u(a,function(a){var b="";65535<a&&(a-=65536,b+=x(a>>>10&1023|55296),a=56320|a&1023);return b+=x(a)}).join("")}function q(a,\n
b){return a+22+75*(26>a)-((0!=b)<<5)}function l(a,b,c){var d=0;a=c?A(a/H):a>>1;for(a+=A(a/b);a>n*y>>1;d+=s)a=A(a/n);return A(d+(n+1)*a/(a+I))}function r(b){var c=[],d=b.length,h,p=0,e=F,f=G,n,x,q,t,m;n=b.lastIndexOf(a);0>n&&(n=0);for(x=0;x<n;++x)128<=b.charCodeAt(x)&&k("not-basic"),c.push(b.charCodeAt(x));for(n=0<n?n+1:0;n<d;){x=p;h=1;for(q=s;;q+=s){n>=d&&k("invalid-input");t=b.charCodeAt(n++);t=10>t-48?t-22:26>t-65?t-65:26>t-97?t-97:s;(t>=s||t>A((w-p)/h))&&k("overflow");p+=t*h;m=q<=f?v:q>=f+y?y:\n
q-f;if(t<m)break;t=s-m;h>A(w/t)&&k("overflow");h*=t}h=c.length+1;f=l(p-x,h,0==x);A(p/h)>w-e&&k("overflow");e+=A(p/h);p%=h;c.splice(p++,0,e)}return g(c)}function z(b){var c,h,p,e,f,n,g,m,r,t=[],B,u,z;b=d(b);B=b.length;c=F;h=0;f=G;for(n=0;n<B;++n)r=b[n],128>r&&t.push(x(r));for((p=e=t.length)&&t.push(a);p<B;){g=w;for(n=0;n<B;++n)r=b[n],r>=c&&r<g&&(g=r);u=p+1;g-c>A((w-h)/u)&&k("overflow");h+=(g-c)*u;c=g;for(n=0;n<B;++n)if(r=b[n],r<c&&++h>w&&k("overflow"),r==c){m=h;for(g=s;;g+=s){r=g<=f?v:g>=f+y?y:g-f;\n
if(m<r)break;z=m-r;m=s-r;t.push(x(q(r+z%m,0)));m=A(z/m)}t.push(x(q(m,0)));f=l(h,u,p==e);h=0;++p}++h;++c}return t.join("")}var D="object"==typeof exports&&exports,E="object"==typeof module&&module&&module.exports==D&&module,C="object"==typeof global&&global;if(C.global===C||C.window===C)e=C;var f,w=2147483647,s=36,v=1,y=26,I=38,H=700,G=72,F=128,a="-",b=/^xn--/,c=/[^ -~]/,h=/\\x2E|\\u3002|\\uFF0E|\\uFF61/g,p={overflow:"Overflow: input needs wider integers to process","not-basic":"Illegal input >= 0x80 (not a basic code point)",\n
"invalid-input":"Invalid input"},n=s-v,A=Math.floor,x=String.fromCharCode,B;f={version:"1.2.3",ucs2:{decode:d,encode:g},decode:r,encode:z,toASCII:function(a){return m(a,function(a){return c.test(a)?"xn--"+z(a):a})},toUnicode:function(a){return m(a,function(a){return b.test(a)?r(a.slice(4).toLowerCase()):a})}};if("function"==typeof define&&"object"==typeof define.amd&&define.amd)define(function(){return f});else if(D&&!D.nodeType)if(E)E.exports=f;else for(B in f)f.hasOwnProperty(B)&&(D[B]=f[B]);else e.punycode=\n
f})(this);\n
(function(e,k){"object"===typeof exports?module.exports=k():"function"===typeof define&&define.amd?define(k):e.SecondLevelDomains=k(e)})(this,function(e){var k=e&&e.SecondLevelDomains,u=Object.prototype.hasOwnProperty,m={list:{ac:"com|gov|mil|net|org",ae:"ac|co|gov|mil|name|net|org|pro|sch",af:"com|edu|gov|net|org",al:"com|edu|gov|mil|net|org",ao:"co|ed|gv|it|og|pb",ar:"com|edu|gob|gov|int|mil|net|org|tur",at:"ac|co|gv|or",au:"asn|com|csiro|edu|gov|id|net|org",ba:"co|com|edu|gov|mil|net|org|rs|unbi|unmo|unsa|untz|unze",bb:"biz|co|com|edu|gov|info|net|org|store|tv",\n
bh:"biz|cc|com|edu|gov|info|net|org",bn:"com|edu|gov|net|org",bo:"com|edu|gob|gov|int|mil|net|org|tv",br:"adm|adv|agr|am|arq|art|ato|b|bio|blog|bmd|cim|cng|cnt|com|coop|ecn|edu|eng|esp|etc|eti|far|flog|fm|fnd|fot|fst|g12|ggf|gov|imb|ind|inf|jor|jus|lel|mat|med|mil|mus|net|nom|not|ntr|odo|org|ppg|pro|psc|psi|qsl|rec|slg|srv|tmp|trd|tur|tv|vet|vlog|wiki|zlg",bs:"com|edu|gov|net|org",bz:"du|et|om|ov|rg",ca:"ab|bc|mb|nb|nf|nl|ns|nt|nu|on|pe|qc|sk|yk",ck:"biz|co|edu|gen|gov|info|net|org",cn:"ac|ah|bj|com|cq|edu|fj|gd|gov|gs|gx|gz|ha|hb|he|hi|hl|hn|jl|js|jx|ln|mil|net|nm|nx|org|qh|sc|sd|sh|sn|sx|tj|tw|xj|xz|yn|zj",\n
co:"com|edu|gov|mil|net|nom|org",cr:"ac|c|co|ed|fi|go|or|sa",cy:"ac|biz|com|ekloges|gov|ltd|name|net|org|parliament|press|pro|tm","do":"art|com|edu|gob|gov|mil|net|org|sld|web",dz:"art|asso|com|edu|gov|net|org|pol",ec:"com|edu|fin|gov|info|med|mil|net|org|pro",eg:"com|edu|eun|gov|mil|name|net|org|sci",er:"com|edu|gov|ind|mil|net|org|rochest|w",es:"com|edu|gob|nom|org",et:"biz|com|edu|gov|info|name|net|org",fj:"ac|biz|com|info|mil|name|net|org|pro",fk:"ac|co|gov|net|nom|org",fr:"asso|com|f|gouv|nom|prd|presse|tm",\n
gg:"co|net|org",gh:"com|edu|gov|mil|org",gn:"ac|com|gov|net|org",gr:"com|edu|gov|mil|net|org",gt:"com|edu|gob|ind|mil|net|org",gu:"com|edu|gov|net|org",hk:"com|edu|gov|idv|net|org",id:"ac|co|go|mil|net|or|sch|web",il:"ac|co|gov|idf|k12|muni|net|org","in":"ac|co|edu|ernet|firm|gen|gov|i|ind|mil|net|nic|org|res",iq:"com|edu|gov|i|mil|net|org",ir:"ac|co|dnssec|gov|i|id|net|org|sch",it:"edu|gov",je:"co|net|org",jo:"com|edu|gov|mil|name|net|org|sch",jp:"ac|ad|co|ed|go|gr|lg|ne|or",ke:"ac|co|go|info|me|mobi|ne|or|sc",\n
kh:"com|edu|gov|mil|net|org|per",ki:"biz|com|de|edu|gov|info|mob|net|org|tel",km:"asso|com|coop|edu|gouv|k|medecin|mil|nom|notaires|pharmaciens|presse|tm|veterinaire",kn:"edu|gov|net|org",kr:"ac|busan|chungbuk|chungnam|co|daegu|daejeon|es|gangwon|go|gwangju|gyeongbuk|gyeonggi|gyeongnam|hs|incheon|jeju|jeonbuk|jeonnam|k|kg|mil|ms|ne|or|pe|re|sc|seoul|ulsan",kw:"com|edu|gov|net|org",ky:"com|edu|gov|net|org",kz:"com|edu|gov|mil|net|org",lb:"com|edu|gov|net|org",lk:"assn|com|edu|gov|grp|hotel|int|ltd|net|ngo|org|sch|soc|web",\n
lr:"com|edu|gov|net|org",lv:"asn|com|conf|edu|gov|id|mil|net|org",ly:"com|edu|gov|id|med|net|org|plc|sch",ma:"ac|co|gov|m|net|org|press",mc:"asso|tm",me:"ac|co|edu|gov|its|net|org|priv",mg:"com|edu|gov|mil|nom|org|prd|tm",mk:"com|edu|gov|inf|name|net|org|pro",ml:"com|edu|gov|net|org|presse",mn:"edu|gov|org",mo:"com|edu|gov|net|org",mt:"com|edu|gov|net|org",mv:"aero|biz|com|coop|edu|gov|info|int|mil|museum|name|net|org|pro",mw:"ac|co|com|coop|edu|gov|int|museum|net|org",mx:"com|edu|gob|net|org",my:"com|edu|gov|mil|name|net|org|sch",\n
nf:"arts|com|firm|info|net|other|per|rec|store|web",ng:"biz|com|edu|gov|mil|mobi|name|net|org|sch",ni:"ac|co|com|edu|gob|mil|net|nom|org",np:"com|edu|gov|mil|net|org",nr:"biz|com|edu|gov|info|net|org",om:"ac|biz|co|com|edu|gov|med|mil|museum|net|org|pro|sch",pe:"com|edu|gob|mil|net|nom|org|sld",ph:"com|edu|gov|i|mil|net|ngo|org",pk:"biz|com|edu|fam|gob|gok|gon|gop|gos|gov|net|org|web",pl:"art|bialystok|biz|com|edu|gda|gdansk|gorzow|gov|info|katowice|krakow|lodz|lublin|mil|net|ngo|olsztyn|org|poznan|pwr|radom|slupsk|szczecin|torun|warszawa|waw|wroc|wroclaw|zgora",\n
pr:"ac|biz|com|edu|est|gov|info|isla|name|net|org|pro|prof",ps:"com|edu|gov|net|org|plo|sec",pw:"belau|co|ed|go|ne|or",ro:"arts|com|firm|info|nom|nt|org|rec|store|tm|www",rs:"ac|co|edu|gov|in|org",sb:"com|edu|gov|net|org",sc:"com|edu|gov|net|org",sh:"co|com|edu|gov|net|nom|org",sl:"com|edu|gov|net|org",st:"co|com|consulado|edu|embaixada|gov|mil|net|org|principe|saotome|store",sv:"com|edu|gob|org|red",sz:"ac|co|org",tr:"av|bbs|bel|biz|com|dr|edu|gen|gov|info|k12|name|net|org|pol|tel|tsk|tv|web",tt:"aero|biz|cat|co|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel",\n
tw:"club|com|ebiz|edu|game|gov|idv|mil|net|org",mu:"ac|co|com|gov|net|or|org",mz:"ac|co|edu|gov|org",na:"co|com",nz:"ac|co|cri|geek|gen|govt|health|iwi|maori|mil|net|org|parliament|school",pa:"abo|ac|com|edu|gob|ing|med|net|nom|org|sld",pt:"com|edu|gov|int|net|nome|org|publ",py:"com|edu|gov|mil|net|org",qa:"com|edu|gov|mil|net|org",re:"asso|com|nom",ru:"ac|adygeya|altai|amur|arkhangelsk|astrakhan|bashkiria|belgorod|bir|bryansk|buryatia|cbg|chel|chelyabinsk|chita|chukotka|chuvashia|com|dagestan|e-burg|edu|gov|grozny|int|irkutsk|ivanovo|izhevsk|jar|joshkar-ola|kalmykia|kaluga|kamchatka|karelia|kazan|kchr|kemerovo|khabarovsk|khakassia|khv|kirov|koenig|komi|kostroma|kranoyarsk|kuban|kurgan|kursk|lipetsk|magadan|mari|mari-el|marine|mil|mordovia|mosreg|msk|murmansk|nalchik|net|nnov|nov|novosibirsk|nsk|omsk|orenburg|org|oryol|penza|perm|pp|pskov|ptz|rnd|ryazan|sakhalin|samara|saratov|simbirsk|smolensk|spb|stavropol|stv|surgut|tambov|tatarstan|tom|tomsk|tsaritsyn|tsk|tula|tuva|tver|tyumen|udm|udmurtia|ulan-ude|vladikavkaz|vladimir|vladivostok|volgograd|vologda|voronezh|vrn|vyatka|yakutia|yamal|yekaterinburg|yuzhno-sakhalinsk",\n
rw:"ac|co|com|edu|gouv|gov|int|mil|net",sa:"com|edu|gov|med|net|org|pub|sch",sd:"com|edu|gov|info|med|net|org|tv",se:"a|ac|b|bd|c|d|e|f|g|h|i|k|l|m|n|o|org|p|parti|pp|press|r|s|t|tm|u|w|x|y|z",sg:"com|edu|gov|idn|net|org|per",sn:"art|com|edu|gouv|org|perso|univ",sy:"com|edu|gov|mil|net|news|org",th:"ac|co|go|in|mi|net|or",tj:"ac|biz|co|com|edu|go|gov|info|int|mil|name|net|nic|org|test|web",tn:"agrinet|com|defense|edunet|ens|fin|gov|ind|info|intl|mincom|nat|net|org|perso|rnrt|rns|rnu|tourism",tz:"ac|co|go|ne|or",\n
ua:"biz|cherkassy|chernigov|chernovtsy|ck|cn|co|com|crimea|cv|dn|dnepropetrovsk|donetsk|dp|edu|gov|if|in|ivano-frankivsk|kh|kharkov|kherson|khmelnitskiy|kiev|kirovograd|km|kr|ks|kv|lg|lugansk|lutsk|lviv|me|mk|net|nikolaev|od|odessa|org|pl|poltava|pp|rovno|rv|sebastopol|sumy|te|ternopil|uzhgorod|vinnica|vn|zaporizhzhe|zhitomir|zp|zt",ug:"ac|co|go|ne|or|org|sc",uk:"ac|bl|british-library|co|cym|gov|govt|icnet|jet|lea|ltd|me|mil|mod|national-library-scotland|nel|net|nhs|nic|nls|org|orgn|parliament|plc|police|sch|scot|soc",\n
us:"dni|fed|isa|kids|nsn",uy:"com|edu|gub|mil|net|org",ve:"co|com|edu|gob|info|mil|net|org|web",vi:"co|com|k12|net|org",vn:"ac|biz|com|edu|gov|health|info|int|name|net|org|pro",ye:"co|com|gov|ltd|me|net|org|plc",yu:"ac|co|edu|gov|org",za:"ac|agric|alt|bourse|city|co|cybernet|db|edu|gov|grondar|iaccess|imt|inca|landesign|law|mil|net|ngo|nis|nom|olivetti|org|pix|school|tm|web",zm:"ac|co|com|edu|gov|net|org|sch"},has_expression:null,is_expression:null,has:function(d){return!!d.match(m.has_expression)},\n
is:function(d){return!!d.match(m.is_expression)},get:function(d){return(d=d.match(m.has_expression))&&d[1]||null},noConflict:function(){e.SecondLevelDomains===this&&(e.SecondLevelDomains=k);return this},init:function(){var d="",e;for(e in m.list)u.call(m.list,e)&&(d+="|("+("("+m.list[e]+")."+e)+")");m.has_expression=RegExp("\\\\.("+d.substr(1)+")$","i");m.is_expression=RegExp("^("+d.substr(1)+")$","i")}};m.init();return m});\n
(function(e,k){"object"===typeof exports?module.exports=k(require("./punycode"),require("./IPv6"),require("./SecondLevelDomains")):"function"===typeof define&&define.amd?define(["./punycode","./IPv6","./SecondLevelDomains"],k):e.URI=k(e.punycode,e.IPv6,e.SecondLevelDomains,e)})(this,function(e,k,u,m){function d(a,b){if(!(this instanceof d))return new d(a,b);void 0===a&&(a="undefined"!==typeof location?location.href+"":"");this.href(a);return void 0!==b?this.absoluteTo(b):this}function g(a){return a.replace(/([.*+?^=!:${}()|[\\]\\/\\\\])/g,\n
"\\\\$1")}function q(a){return void 0===a?"Undefined":String(Object.prototype.toString.call(a)).slice(8,-1)}function l(a){return"Array"===q(a)}function r(a,b){var c,d;if(l(b)){c=0;for(d=b.length;c<d;c++)if(!r(a,b[c]))return!1;return!0}var p=q(b);c=0;for(d=a.length;c<d;c++)if("RegExp"===p){if("string"===typeof a[c]&&a[c].match(b))return!0}else if(a[c]===b)return!0;return!1}function z(a,b){if(!l(a)||!l(b)||a.length!==b.length)return!1;a.sort();b.sort();for(var c=0,d=a.length;c<d;c++)if(a[c]!==b[c])return!1;\n
return!0}function D(a){return escape(a)}function E(a){return encodeURIComponent(a).replace(/[!\'()*]/g,D).replace(/\\*/g,"%2A")}var C=m&&m.URI;d.version="1.12.0";var f=d.prototype,w=Object.prototype.hasOwnProperty;d._parts=function(){return{protocol:null,username:null,password:null,hostname:null,urn:null,port:null,path:null,query:null,fragment:null,duplicateQueryParameters:d.duplicateQueryParameters,escapeQuerySpace:d.escapeQuerySpace}};d.duplicateQueryParameters=!1;d.escapeQuerySpace=!0;d.protocol_expression=\n
/^[a-z][a-z0-9.+-]*$/i;d.idn_expression=/[^a-z0-9\\.-]/i;d.punycode_expression=/(xn--)/i;d.ip4_expression=/^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/;d.ip6_expression=/^\\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(\\.(25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(%.+)?\\s*$/;\n
d.find_uri_expression=/\\b((?:[a-z][\\w-]+:(?:\\/{1,3}|[a-z0-9%])|www\\d{0,3}[.]|[a-z0-9.\\-]+[.][a-z]{2,4}\\/)(?:[^\\s()<>]+|\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\))+(?:\\(([^\\s()<>]+|(\\([^\\s()<>]+\\)))*\\)|[^\\s`!()\\[\\]{};:\'".,<>?\\u00ab\\u00bb\\u201c\\u201d\\u2018\\u2019]))/ig;d.findUri={start:/\\b(?:([a-z][a-z0-9.+-]*:\\/\\/)|www\\.)/gi,end:/[\\s\\r\\n]|$/,trim:/[`!()\\[\\]{};:\'".,<>?\\u00ab\\u00bb\\u201c\\u201d\\u201e\\u2018\\u2019]+$/};d.defaultPorts={http:"80",https:"443",ftp:"21",gopher:"70",ws:"80",wss:"443"};d.invalid_hostname_characters=\n
/[^a-zA-Z0-9\\.-]/;d.domAttributes={a:"href",blockquote:"cite",link:"href",base:"href",script:"src",form:"action",img:"src",area:"href",iframe:"src",embed:"src",source:"src",track:"src",input:"src"};d.getDomAttribute=function(a){if(a&&a.nodeName){var b=a.nodeName.toLowerCase();return"input"===b&&"image"!==a.type?void 0:d.domAttributes[b]}};d.encode=E;d.decode=decodeURIComponent;d.iso8859=function(){d.encode=escape;d.decode=unescape};d.unicode=function(){d.encode=E;d.decode=decodeURIComponent};d.characters=\n
{pathname:{encode:{expression:/%(24|26|2B|2C|3B|3D|3A|40)/ig,map:{"%24":"$","%26":"&","%2B":"+","%2C":",","%3B":";","%3D":"=","%3A":":","%40":"@"}},decode:{expression:/[\\/\\?#]/g,map:{"/":"%2F","?":"%3F","#":"%23"}}},reserved:{encode:{expression:/%(21|23|24|26|27|28|29|2A|2B|2C|2F|3A|3B|3D|3F|40|5B|5D)/ig,map:{"%3A":":","%2F":"/","%3F":"?","%23":"#","%5B":"[","%5D":"]","%40":"@","%21":"!","%24":"$","%26":"&","%27":"\'","%28":"(","%29":")","%2A":"*","%2B":"+","%2C":",","%3B":";","%3D":"="}}}};d.encodeQuery=\n
function(a,b){var c=d.encode(a+"");return b?c.replace(/%20/g,"+"):c};d.decodeQuery=function(a,b){a+="";try{return d.decode(b?a.replace(/\\+/g,"%20"):a)}catch(c){return a}};d.recodePath=function(a){a=(a+"").split("/");for(var b=0,c=a.length;b<c;b++)a[b]=d.encodePathSegment(d.decode(a[b]));return a.join("/")};d.decodePath=function(a){a=(a+"").split("/");for(var b=0,c=a.length;b<c;b++)a[b]=d.decodePathSegment(a[b]);return a.join("/")};var s={encode:"encode",decode:"decode"},v,y=function(a,b){return function(c){return d[b](c+\n
"").replace(d.characters[a][b].expression,function(c){return d.characters[a][b].map[c]})}};for(v in s)d[v+"PathSegment"]=y("pathname",s[v]);d.encodeReserved=y("reserved","encode");d.parse=function(a,b){var c;b||(b={});c=a.indexOf("#");-1<c&&(b.fragment=a.substring(c+1)||null,a=a.substring(0,c));c=a.indexOf("?");-1<c&&(b.query=a.substring(c+1)||null,a=a.substring(0,c));"//"===a.substring(0,2)?(b.protocol=null,a=a.substring(2),a=d.parseAuthority(a,b)):(c=a.indexOf(":"),-1<c&&(b.protocol=a.substring(0,\n
c)||null,b.protocol&&!b.protocol.match(d.protocol_expression)?b.protocol=void 0:"file"===b.protocol?a=a.substring(c+3):"//"===a.substring(c+1,c+3)?(a=a.substring(c+3),a=d.parseAuthority(a,b)):(a=a.substring(c+1),b.urn=!0)));b.path=a;return b};d.parseHost=function(a,b){var c=a.indexOf("/"),d;-1===c&&(c=a.length);"["===a.charAt(0)?(d=a.indexOf("]"),b.hostname=a.substring(1,d)||null,b.port=a.substring(d+2,c)||null):a.indexOf(":")!==a.lastIndexOf(":")?(b.hostname=a.substring(0,c)||null,b.port=null):(d=\n
a.substring(0,c).split(":"),b.hostname=d[0]||null,b.port=d[1]||null);b.hostname&&"/"!==a.substring(c).charAt(0)&&(c++,a="/"+a);return a.substring(c)||"/"};d.parseAuthority=function(a,b){a=d.parseUserinfo(a,b);return d.parseHost(a,b)};d.parseUserinfo=function(a,b){var c=a.indexOf("/"),h=-1<c?a.lastIndexOf("@",c):a.indexOf("@");-1<h&&(-1===c||h<c)?(c=a.substring(0,h).split(":"),b.username=c[0]?d.decode(c[0]):null,c.shift(),b.password=c[0]?d.decode(c.join(":")):null,a=a.substring(h+1)):(b.username=null,\n
b.password=null);return a};d.parseQuery=function(a,b){if(!a)return{};a=a.replace(/&+/g,"&").replace(/^\\?*&*|&+$/g,"");if(!a)return{};for(var c={},h=a.split("&"),p=h.length,n,e,f=0;f<p;f++)n=h[f].split("="),e=d.decodeQuery(n.shift(),b),n=n.length?d.decodeQuery(n.join("="),b):null,c[e]?("string"===typeof c[e]&&(c[e]=[c[e]]),c[e].push(n)):c[e]=n;return c};d.build=function(a){var b="";a.protocol&&(b+=a.protocol+":");a.urn||!b&&!a.hostname||(b+="//");b+=d.buildAuthority(a)||"";"string"===typeof a.path&&\n
("/"!==a.path.charAt(0)&&"string"===typeof a.hostname&&(b+="/"),b+=a.path);"string"===typeof a.query&&a.query&&(b+="?"+a.query);"string"===typeof a.fragment&&a.fragment&&(b+="#"+a.fragment);return b};d.buildHost=function(a){var b="";if(a.hostname)d.ip6_expression.test(a.hostname)?b=a.port?b+("["+a.hostname+"]:"+a.port):b+a.hostname:(b+=a.hostname,a.port&&(b+=":"+a.port));else return"";return b};d.buildAuthority=function(a){return d.buildUserinfo(a)+d.buildHost(a)};d.buildUserinfo=function(a){var b=\n
"";a.username&&(b+=d.encode(a.username),a.password&&(b+=":"+d.encode(a.password)),b+="@");return b};d.buildQuery=function(a,b,c){var h="",p,e,f,k;for(e in a)if(w.call(a,e)&&e)if(l(a[e]))for(p={},f=0,k=a[e].length;f<k;f++)void 0!==a[e][f]&&void 0===p[a[e][f]+""]&&(h+="&"+d.buildQueryParameter(e,a[e][f],c),!0!==b&&(p[a[e][f]+""]=!0));else void 0!==a[e]&&(h+="&"+d.buildQueryParameter(e,a[e],c));return h.substring(1)};d.buildQueryParameter=function(a,b,c){return d.encodeQuery(a,c)+(null!==b?"="+d.encodeQuery(b,\n
c):"")};d.addQuery=function(a,b,c){if("object"===typeof b)for(var h in b)w.call(b,h)&&d.addQuery(a,h,b[h]);else if("string"===typeof b)void 0===a[b]?a[b]=c:("string"===typeof a[b]&&(a[b]=[a[b]]),l(c)||(c=[c]),a[b]=a[b].concat(c));else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");};d.removeQuery=function(a,b,c){var h;if(l(b))for(c=0,h=b.length;c<h;c++)a[b[c]]=void 0;else if("object"===typeof b)for(h in b)w.call(b,h)&&d.removeQuery(a,h,b[h]);else if("string"===\n
typeof b)if(void 0!==c)if(a[b]===c)a[b]=void 0;else{if(l(a[b])){h=a[b];var p={},e,f;if(l(c))for(e=0,f=c.length;e<f;e++)p[c[e]]=!0;else p[c]=!0;e=0;for(f=h.length;e<f;e++)void 0!==p[h[e]]&&(h.splice(e,1),f--,e--);a[b]=h}}else a[b]=void 0;else throw new TypeError("URI.addQuery() accepts an object, string as the first parameter");};d.hasQuery=function(a,b,c,h){if("object"===typeof b){for(var e in b)if(w.call(b,e)&&!d.hasQuery(a,e,b[e]))return!1;return!0}if("string"!==typeof b)throw new TypeError("URI.hasQuery() accepts an object, string as the name parameter");\n
switch(q(c)){case "Undefined":return b in a;case "Boolean":return a=Boolean(l(a[b])?a[b].length:a[b]),c===a;case "Function":return!!c(a[b],b,a);case "Array":return l(a[b])?(h?r:z)(a[b],c):!1;case "RegExp":return l(a[b])?h?r(a[b],c):!1:Boolean(a[b]&&a[b].match(c));case "Number":c=String(c);case "String":return l(a[b])?h?r(a[b],c):!1:a[b]===c;default:throw new TypeError("URI.hasQuery() accepts undefined, boolean, string, number, RegExp, Function as the value parameter");}};d.commonPath=function(a,b){var c=\n
Math.min(a.length,b.length),d;for(d=0;d<c;d++)if(a.charAt(d)!==b.charAt(d)){d--;break}if(1>d)return a.charAt(0)===b.charAt(0)&&"/"===a.charAt(0)?"/":"";if("/"!==a.charAt(d)||"/"!==b.charAt(d))d=a.substring(0,d).lastIndexOf("/");return a.substring(0,d+1)};d.withinString=function(a,b,c){c||(c={});var h=c.start||d.findUri.start,e=c.end||d.findUri.end,f=c.trim||d.findUri.trim,k=/[a-z0-9-]=["\']?$/i;for(h.lastIndex=0;;){var g=h.exec(a);if(!g)break;g=g.index;if(c.ignoreHtml){var l=a.slice(Math.max(g-3,0),\n
g);if(l&&k.test(l))continue}var l=g+a.slice(g).search(e),q=a.slice(g,l).replace(f,"");c.ignore&&c.ignore.test(q)||(l=g+q.length,q=b(q,g,l,a),a=a.slice(0,g)+q+a.slice(l),h.lastIndex=g+q.length)}h.lastIndex=0;return a};d.ensureValidHostname=function(a){if(a.match(d.invalid_hostname_characters)){if(!e)throw new TypeError("Hostname \'"+a+"\' contains characters other than [A-Z0-9.-] and Punycode.js is not available");if(e.toASCII(a).match(d.invalid_hostname_characters))throw new TypeError("Hostname \'"+\n
a+"\' contains characters other than [A-Z0-9.-]");}};d.noConflict=function(a){if(a)return a={URI:this.noConflict()},URITemplate&&"function"==typeof URITemplate.noConflict&&(a.URITemplate=URITemplate.noConflict()),k&&"function"==typeof k.noConflict&&(a.IPv6=k.noConflict()),SecondLevelDomains&&"function"==typeof SecondLevelDomains.noConflict&&(a.SecondLevelDomains=SecondLevelDomains.noConflict()),a;m.URI===this&&(m.URI=C);return this};f.build=function(a){if(!0===a)this._deferred_build=!0;else if(void 0===\n
a||this._deferred_build)this._string=d.build(this._parts),this._deferred_build=!1;return this};f.clone=function(){return new d(this)};f.valueOf=f.toString=function(){return this.build(!1)._string};s={protocol:"protocol",username:"username",password:"password",hostname:"hostname",port:"port"};y=function(a){return function(b,c){if(void 0===b)return this._parts[a]||"";this._parts[a]=b||null;this.build(!c);return this}};for(v in s)f[v]=y(s[v]);s={query:"?",fragment:"#"};y=function(a,b){return function(c,\n
d){if(void 0===c)return this._parts[a]||"";null!==c&&(c+="",c.charAt(0)===b&&(c=c.substring(1)));this._parts[a]=c;this.build(!d);return this}};for(v in s)f[v]=y(v,s[v]);s={search:["?","query"],hash:["#","fragment"]};y=function(a,b){return function(c,d){var e=this[a](c,d);return"string"===typeof e&&e.length?b+e:e}};for(v in s)f[v]=y(s[v][1],s[v][0]);f.pathname=function(a,b){if(void 0===a||!0===a){var c=this._parts.path||(this._parts.hostname?"/":"");return a?d.decodePath(c):c}this._parts.path=a?d.recodePath(a):\n
"/";this.build(!b);return this};f.path=f.pathname;f.href=function(a,b){var c;if(void 0===a)return this.toString();this._string="";this._parts=d._parts();var h=a instanceof d,e="object"===typeof a&&(a.hostname||a.path||a.pathname);a.nodeName&&(e=d.getDomAttribute(a),a=a[e]||"",e=!1);!h&&e&&void 0!==a.pathname&&(a=a.toString());if("string"===typeof a)this._parts=d.parse(a,this._parts);else if(h||e)for(c in h=h?a._parts:a,h)w.call(this._parts,c)&&(this._parts[c]=h[c]);else throw new TypeError("invalid input");\n
this.build(!b);return this};f.is=function(a){var b=!1,c=!1,h=!1,e=!1,f=!1,g=!1,k=!1,l=!this._parts.urn;this._parts.hostname&&(l=!1,c=d.ip4_expression.test(this._parts.hostname),h=d.ip6_expression.test(this._parts.hostname),b=c||h,f=(e=!b)&&u&&u.has(this._parts.hostname),g=e&&d.idn_expression.test(this._parts.hostname),k=e&&d.punycode_expression.test(this._parts.hostname));switch(a.toLowerCase()){case "relative":return l;case "absolute":return!l;case "domain":case "name":return e;case "sld":return f;\n
case "ip":return b;case "ip4":case "ipv4":case "inet4":return c;case "ip6":case "ipv6":case "inet6":return h;case "idn":return g;case "url":return!this._parts.urn;case "urn":return!!this._parts.urn;case "punycode":return k}return null};var I=f.protocol,H=f.port,G=f.hostname;f.protocol=function(a,b){if(void 0!==a&&a&&(a=a.replace(/:(\\/\\/)?$/,""),!a.match(d.protocol_expression)))throw new TypeError("Protocol \'"+a+"\' contains characters other than [A-Z0-9.+-] or doesn\'t start with [A-Z]");return I.call(this,\n
a,b)};f.scheme=f.protocol;f.port=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a&&(0===a&&(a=null),a&&(a+="",":"===a.charAt(0)&&(a=a.substring(1)),a.match(/[^0-9]/))))throw new TypeError("Port \'"+a+"\' contains characters other than [0-9]");return H.call(this,a,b)};f.hostname=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0!==a){var c={};d.parseHost(a,c);a=c.hostname}return G.call(this,a,b)};f.host=function(a,b){if(this._parts.urn)return void 0===a?"":this;\n
if(void 0===a)return this._parts.hostname?d.buildHost(this._parts):"";d.parseHost(a,this._parts);this.build(!b);return this};f.authority=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a)return this._parts.hostname?d.buildAuthority(this._parts):"";d.parseAuthority(a,this._parts);this.build(!b);return this};f.userinfo=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.username)return"";var c=d.buildUserinfo(this._parts);return c.substring(0,\n
c.length-1)}"@"!==a[a.length-1]&&(a+="@");d.parseUserinfo(a,this._parts);this.build(!b);return this};f.resource=function(a,b){var c;if(void 0===a)return this.path()+this.search()+this.hash();c=d.parse(a);this._parts.path=c.path;this._parts.query=c.query;this._parts.fragment=c.fragment;this.build(!b);return this};f.subdomain=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.length-this.domain().length-\n
1;return this._parts.hostname.substring(0,c)||""}c=this._parts.hostname.length-this.domain().length;c=this._parts.hostname.substring(0,c);c=RegExp("^"+g(c));a&&"."!==a.charAt(a.length-1)&&(a+=".");a&&d.ensureValidHostname(a);this._parts.hostname=this._parts.hostname.replace(c,a);this.build(!b);return this};f.domain=function(a,b){if(this._parts.urn)return void 0===a?"":this;"boolean"===typeof a&&(b=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.match(/\\./g);\n
if(c&&2>c.length)return this._parts.hostname;c=this._parts.hostname.length-this.tld(b).length-1;c=this._parts.hostname.lastIndexOf(".",c-1)+1;return this._parts.hostname.substring(c)||""}if(!a)throw new TypeError("cannot set domain empty");d.ensureValidHostname(a);!this._parts.hostname||this.is("IP")?this._parts.hostname=a:(c=RegExp(g(this.domain())+"$"),this._parts.hostname=this._parts.hostname.replace(c,a));this.build(!b);return this};f.tld=function(a,b){if(this._parts.urn)return void 0===a?"":\n
this;"boolean"===typeof a&&(b=a,a=void 0);if(void 0===a){if(!this._parts.hostname||this.is("IP"))return"";var c=this._parts.hostname.lastIndexOf("."),c=this._parts.hostname.substring(c+1);return!0!==b&&u&&u.list[c.toLowerCase()]?u.get(this._parts.hostname)||c:c}if(a)if(a.match(/[^a-zA-Z0-9-]/))if(u&&u.is(a))c=RegExp(g(this.tld())+"$"),this._parts.hostname=this._parts.hostname.replace(c,a);else throw new TypeError("TLD \'"+a+"\' contains characters other than [A-Z0-9]");else{if(!this._parts.hostname||\n
this.is("IP"))throw new ReferenceError("cannot set TLD on non-domain host");c=RegExp(g(this.tld())+"$");this._parts.hostname=this._parts.hostname.replace(c,a)}else throw new TypeError("cannot set TLD empty");this.build(!b);return this};f.directory=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path&&!this._parts.hostname)return"";if("/"===this._parts.path)return"/";var c=this._parts.path.length-this.filename().length-1,c=this._parts.path.substring(0,\n
c)||(this._parts.hostname?"/":"");return a?d.decodePath(c):c}c=this._parts.path.length-this.filename().length;c=this._parts.path.substring(0,c);c=RegExp("^"+g(c));this.is("relative")||(a||(a="/"),"/"!==a.charAt(0)&&(a="/"+a));a&&"/"!==a.charAt(a.length-1)&&(a+="/");a=d.recodePath(a);this._parts.path=this._parts.path.replace(c,a);this.build(!b);return this};f.filename=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";\n
var c=this._parts.path.lastIndexOf("/"),c=this._parts.path.substring(c+1);return a?d.decodePathSegment(c):c}c=!1;"/"===a.charAt(0)&&(a=a.substring(1));a.match(/\\.?\\//)&&(c=!0);var h=RegExp(g(this.filename())+"$");a=d.recodePath(a);this._parts.path=this._parts.path.replace(h,a);c?this.normalizePath(b):this.build(!b);return this};f.suffix=function(a,b){if(this._parts.urn)return void 0===a?"":this;if(void 0===a||!0===a){if(!this._parts.path||"/"===this._parts.path)return"";var c=this.filename(),h=c.lastIndexOf(".");\n
if(-1===h)return"";c=c.substring(h+1);c=/^[a-z0-9%]+$/i.test(c)?c:"";return a?d.decodePathSegment(c):c}"."===a.charAt(0)&&(a=a.substring(1));if(c=this.suffix())h=a?RegExp(g(c)+"$"):RegExp(g("."+c)+"$");else{if(!a)return this;this._parts.path+="."+d.recodePath(a)}h&&(a=d.recodePath(a),this._parts.path=this._parts.path.replace(h,a));this.build(!b);return this};f.segment=function(a,b,c){var d=this._parts.urn?":":"/",e=this.path(),f="/"===e.substring(0,1),e=e.split(d);void 0!==a&&"number"!==typeof a&&\n
(c=b,b=a,a=void 0);if(void 0!==a&&"number"!==typeof a)throw Error("Bad segment \'"+a+"\', must be 0-based integer");f&&e.shift();0>a&&(a=Math.max(e.length+a,0));if(void 0===b)return void 0===a?e:e[a];if(null===a||void 0===e[a])if(l(b)){e=[];a=0;for(var g=b.length;a<g;a++)if(b[a].length||e.length&&e[e.length-1].length)e.length&&!e[e.length-1].length&&e.pop(),e.push(b[a])}else{if(b||"string"===typeof b)""===e[e.length-1]?e[e.length-1]=b:e.push(b)}else b||"string"===typeof b&&b.length?e[a]=b:e.splice(a,\n
1);f&&e.unshift("");return this.path(e.join(d),c)};f.segmentCoded=function(a,b,c){var e,f;"number"!==typeof a&&(c=b,b=a,a=void 0);if(void 0===b){a=this.segment(a,b,c);if(l(a))for(e=0,f=a.length;e<f;e++)a[e]=d.decode(a[e]);else a=void 0!==a?d.decode(a):void 0;return a}if(l(b))for(e=0,f=b.length;e<f;e++)b[e]=d.decode(b[e]);else b="string"===typeof b?d.encode(b):b;return this.segment(a,b,c)};var F=f.query;f.query=function(a,b){if(!0===a)return d.parseQuery(this._parts.query,this._parts.escapeQuerySpace);\n
if("function"===typeof a){var c=d.parseQuery(this._parts.query,this._parts.escapeQuerySpace),e=a.call(this,c);this._parts.query=d.buildQuery(e||c,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);this.build(!b);return this}return void 0!==a&&"string"!==typeof a?(this._parts.query=d.buildQuery(a,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace),this.build(!b),this):F.call(this,a,b)};f.setQuery=function(a,b,c){var e=d.parseQuery(this._parts.query,this._parts.escapeQuerySpace);\n
if("object"===typeof a)for(var f in a)w.call(a,f)&&(e[f]=a[f]);else if("string"===typeof a)e[a]=void 0!==b?b:null;else throw new TypeError("URI.addQuery() accepts an object, string as the name parameter");this._parts.query=d.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(c=b);this.build(!c);return this};f.addQuery=function(a,b,c){var e=d.parseQuery(this._parts.query,this._parts.escapeQuerySpace);d.addQuery(e,a,void 0===b?null:b);this._parts.query=\n
d.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(c=b);this.build(!c);return this};f.removeQuery=function(a,b,c){var e=d.parseQuery(this._parts.query,this._parts.escapeQuerySpace);d.removeQuery(e,a,b);this._parts.query=d.buildQuery(e,this._parts.duplicateQueryParameters,this._parts.escapeQuerySpace);"string"!==typeof a&&(c=b);this.build(!c);return this};f.hasQuery=function(a,b,c){var e=d.parseQuery(this._parts.query,this._parts.escapeQuerySpace);\n
return d.hasQuery(e,a,b,c)};f.setSearch=f.setQuery;f.addSearch=f.addQuery;f.removeSearch=f.removeQuery;f.hasSearch=f.hasQuery;f.normalize=function(){return this._parts.urn?this.normalizeProtocol(!1).normalizeQuery(!1).normalizeFragment(!1).build():this.normalizeProtocol(!1).normalizeHostname(!1).normalizePort(!1).normalizePath(!1).normalizeQuery(!1).normalizeFragment(!1).build()};f.normalizeProtocol=function(a){"string"===typeof this._parts.protocol&&(this._parts.protocol=this._parts.protocol.toLowerCase(),\n
this.build(!a));return this};f.normalizeHostname=function(a){this._parts.hostname&&(this.is("IDN")&&e?this._parts.hostname=e.toASCII(this._parts.hostname):this.is("IPv6")&&k&&(this._parts.hostname=k.best(this._parts.hostname)),this._parts.hostname=this._parts.hostname.toLowerCase(),this.build(!a));return this};f.normalizePort=function(a){"string"===typeof this._parts.protocol&&this._parts.port===d.defaultPorts[this._parts.protocol]&&(this._parts.port=null,this.build(!a));return this};f.normalizePath=\n
function(a){if(this._parts.urn||!this._parts.path||"/"===this._parts.path)return this;var b,c=this._parts.path,e="",f,g;"/"!==c.charAt(0)&&(b=!0,c="/"+c);c=c.replace(/(\\/(\\.\\/)+)|(\\/\\.$)/g,"/").replace(/\\/{2,}/g,"/");b&&(e=c.substring(1).match(/^(\\.\\.\\/)+/)||"")&&(e=e[0]);for(;;){f=c.indexOf("/..");if(-1===f)break;else if(0===f){c=c.substring(3);continue}g=c.substring(0,f).lastIndexOf("/");-1===g&&(g=f);c=c.substring(0,g)+c.substring(f+3)}b&&this.is("relative")&&(c=e+c.substring(1));c=d.recodePath(c);\n
this._parts.path=c;this.build(!a);return this};f.normalizePathname=f.normalizePath;f.normalizeQuery=function(a){"string"===typeof this._parts.query&&(this._parts.query.length?this.query(d.parseQuery(this._parts.query,this._parts.escapeQuerySpace)):this._parts.query=null,this.build(!a));return this};f.normalizeFragment=function(a){this._parts.fragment||(this._parts.fragment=null,this.build(!a));return this};f.normalizeSearch=f.normalizeQuery;f.normalizeHash=f.normalizeFragment;f.iso8859=function(){var a=\n
d.encode,b=d.decode;d.encode=escape;d.decode=decodeURIComponent;this.normalize();d.encode=a;d.decode=b;return this};f.unicode=function(){var a=d.encode,b=d.decode;d.encode=E;d.decode=unescape;this.normalize();d.encode=a;d.decode=b;return this};f.readable=function(){var a=this.clone();a.username("").password("").normalize();var b="";a._parts.protocol&&(b+=a._parts.protocol+"://");a._parts.hostname&&(a.is("punycode")&&e?(b+=e.toUnicode(a._parts.hostname),a._parts.port&&(b+=":"+a._parts.port)):b+=a.host());\n
a._parts.hostname&&a._parts.path&&"/"!==a._parts.path.charAt(0)&&(b+="/");b+=a.path(!0);if(a._parts.query){for(var c="",f=0,g=a._parts.query.split("&"),k=g.length;f<k;f++){var l=(g[f]||"").split("="),c=c+("&"+d.decodeQuery(l[0],this._parts.escapeQuerySpace).replace(/&/g,"%26"));void 0!==l[1]&&(c+="="+d.decodeQuery(l[1],this._parts.escapeQuerySpace).replace(/&/g,"%26"))}b+="?"+c.substring(1)}return b+=d.decodeQuery(a.hash(),!0)};f.absoluteTo=function(a){var b=this.clone(),c=["protocol","username",\n
"password","hostname","port"],e,f;if(this._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");a instanceof d||(a=new d(a));b._parts.protocol||(b._parts.protocol=a._parts.protocol);if(this._parts.hostname)return b;for(e=0;f=c[e];e++)b._parts[f]=a._parts[f];b._parts.path?".."===b._parts.path.substring(-2)&&(b._parts.path+="/"):(b._parts.path=a._parts.path,b._parts.query||(b._parts.query=a._parts.query));"/"!==b.path().charAt(0)&&(a=a.directory(),b._parts.path=(a?\n
a+"/":"")+b._parts.path,b.normalizePath());b.build();return b};f.relativeTo=function(a){var b=this.clone().normalize(),c,e,f,g;if(b._parts.urn)throw Error("URNs do not have any generally defined hierarchical components");a=(new d(a)).normalize();c=b._parts;e=a._parts;f=b.path();g=a.path();if("/"!==f.charAt(0))throw Error("URI is already relative");if("/"!==g.charAt(0))throw Error("Cannot calculate a URI relative to another relative URI");c.protocol===e.protocol&&(c.protocol=null);if(c.username===\n
e.username&&c.password===e.password&&null===c.protocol&&null===c.username&&null===c.password&&c.hostname===e.hostname&&c.port===e.port)c.hostname=null,c.port=null;else return b.build();if(f===g)return c.path="",b.build();a=d.commonPath(b.path(),a.path());if(!a)return b.build();e=e.path.substring(a.length).replace(/[^\\/]*$/,"").replace(/.*?\\//g,"../");c.path=e+c.path.substring(a.length);return b.build()};f.equals=function(a){var b=this.clone();a=new d(a);var c={},e={},f={},g;b.normalize();a.normalize();\n
if(b.toString()===a.toString())return!0;c=b.query();e=a.query();b.query("");a.query("");if(b.toString()!==a.toString()||c.length!==e.length)return!1;c=d.parseQuery(c,this._parts.escapeQuerySpace);e=d.parseQuery(e,this._parts.escapeQuerySpace);for(g in c)if(w.call(c,g)){if(!l(c[g])){if(c[g]!==e[g])return!1}else if(!z(c[g],e[g]))return!1;f[g]=!0}for(g in e)if(w.call(e,g)&&!f[g])return!1;return!0};f.duplicateQueryParameters=function(a){this._parts.duplicateQueryParameters=!!a;return this};f.escapeQuerySpace=\n
function(a){this._parts.escapeQuerySpace=!!a;return this};return d});\n
(function(e,k){"object"===typeof exports?module.exports=k(require("./URI")):"function"===typeof define&&define.amd?define(["./URI"],k):k(e.URI)})(this,function(e){var k=e.prototype,u=k.fragment;e.fragmentPrefix="?";var m=e._parts;e._parts=function(){var d=m();d.fragmentPrefix=e.fragmentPrefix;return d};k.fragmentPrefix=function(d){this._parts.fragmentPrefix=d;return this};k.fragment=function(d,g){var k=this._parts.fragmentPrefix,l=this._parts.fragment||"";return!0===d?l.substring(0,k.length)!==k?\n
{}:e.parseQuery(l.substring(k.length)):void 0!==d&&"string"!==typeof d?(this._parts.fragment=k+e.buildQuery(d),this.build(!g),this):u.call(this,d,g)};k.addFragment=function(d,g,k){var l=this._parts.fragmentPrefix,m=e.parseQuery((this._parts.fragment||"").substring(l.length));e.addQuery(m,d,g);this._parts.fragment=l+e.buildQuery(m);"string"!==typeof d&&(k=g);this.build(!k);return this};k.removeFragment=function(d,g,k){var l=this._parts.fragmentPrefix,m=e.parseQuery((this._parts.fragment||"").substring(l.length));\n
e.removeQuery(m,d,g);this._parts.fragment=l+e.buildQuery(m);"string"!==typeof d&&(k=g);this.build(!k);return this};k.addHash=k.addFragment;k.removeHash=k.removeFragment;return{}});\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>38751</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681771.44</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>dhtmlxgantt.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*\n
This software is allowed to use under GPL or you need to obtain Commercial or Enterise License \n
to use it in non-GPL project. Please contact sales@dhtmlx.com for details\n
*/\n
.gridHoverStyle{background-color:#fff3a1}.gridSelection{background-color:#fff3a1}.timelineSelection{background-color:#fff3a1}.gantt_grid_scale .gantt_grid_head_cell{color:#a6a6a6;border-top:0!important;border-right:0!important}.gantt_grid_data .gantt_cell{border-right:0;color:#454545}.gantt_task_link .gantt_link_arrow_right{border-width:6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_left{border-width:6px;margin-left:-6px;margin-top:-3px}.gantt_task_link .gantt_link_arrow_top{border-width:6px}.gantt_task_link .gantt_link_arrow_down{border-width:6px}.gantt_task_line .gantt_task_progress_drag{bottom:-4px;height:16px;margin-left:-8px;width:16px}.chartHeaderBg{background-color:#fff}.gantt_task .gantt_task_scale .gantt_scale_cell{color:#a6a6a6;border-right:1px solid #ebebeb}.gantt_row.gantt_project,.gantt_row.odd.gantt_project{background-color:#edffef}.gantt_task_row.gantt_project,.gantt_task_row.odd.gantt_project{background-color:#f5fff6}.gantt_task_line.gantt_project{background-color:#65c16f;border:1px solid #3c9445}.gantt_task_line.gantt_project .gantt_task_progress{background-color:#46ad51}.buttonBg{background:#fff}.dhx_cal_light .dhx_btn_set{margin:5px 10px}.dhx_btn_set.dhx_cancel_btn_set{background:#fff;color:#454545;border:1px solid #cecece}.dhx_btn_set.dhx_save_btn_set{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff}.dhx_btn_set.dhx_delete_btn_set{text-shadow:0 -1px 0 #6f6f6f;background:#ec8e00;text-shadow:0 -1px 0 #a60;color:#fff}.dhx_delete_btn{margin-top:2px;width:20px}.dhx_cal_light_wide{padding-left:0!important;padding-right:0!important}.dhx_cal_light_wide .dhx_cal_larea{border-left:0!important;border-right:0!important}.dhtmlx_popup_button.dhtmlx_ok_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0}.dhtmlx_popup_button.dhtmlx_cancel_button{font-weight:700;color:#454544}.dhx_qi_big_icon.icon_edit{color:#454545;background:#fff}.dhx_qi_big_icon.icon_delete{text-shadow:0 -1px 0 #a60;background:#ec8e00;color:#fff;border-width:0}.gantt_container{font-family:Arial;font-size:13px;border:1px solid #cecece;position:relative;white-space:nowrap}.gantt_grid{border-right:1px solid #cecece}.gantt_task_scroll{overflow-x:scroll}.gantt_task{position:relative}.gantt_task,.gantt_grid{overflow-x:hidden;overflow-y:hidden;display:inline-block;vertical-align:top}.gantt_grid_scale,.gantt_task_scale{color:#6b6b6b;font-size:12px;border-bottom:1px solid #cecece}.gantt_grid_scale{background-color:#fff}.gantt_task_scale{background-color:#fff}.gantt_scale_line{box-sizing:border-box;-moz-box-sizing:border-box;border-top:1px solid #cecece}.gantt_scale_line:first-child{border-top:0}.gantt_grid_head_cell{display:inline-block;vertical-align:top;border-right:1px solid #cecece;text-align:center;position:relative;cursor:default;height:100%;box-sizing:border-box;-moz-box-sizing:border-box;line-height:33px;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_scale_line{clear:both}.gantt_grid_data{width:100%;overflow:hidden}.gantt_row{position:relative;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_add,.gantt_grid_head_add{width:100%;height:100%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTQ3MjMyMENDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTQ3MjMyMERDNkI0MTFFMjk4MTI5QTg3MDhFNDVDQTkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1NDcyMzIwQUM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1NDcyMzIwQkM2QjQxMUUyOTgxMjlBODcwOEU0NUNBOSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PshZT8UAAABbSURBVHjaYrTdeZmBEsCER+4wEP+H4sPkGGCDg020ARR7gb4GIAcYDKMDdPnDyAbYkGG5DVW9cIQMvUdBBAuUY4vDz8iAcZinA2zgCHqAYQMseAywJcYFAAEGAM+UFGuohFczAAAAAElFTkSuQmCC);background-position:center center;background-repeat:no-repeat;cursor:pointer;position:relative;-moz-opacity:.3;opacity:.3}.gantt_grid_head_cell.gantt_grid_head_add{-moz-opacity:.6;opacity:.6;top:0}.gantt_grid_head_cell.gantt_grid_head_add:hover{-moz-opacity:1;opacity:1}.gantt_grid_data .gantt_row:hover,.gantt_grid_data .gantt_row.odd:hover{background-color:#fff3a1}.gantt_grid_data .gantt_row:hover .gantt_add,.gantt_grid_data .gantt_row.odd:hover .gantt_add{-moz-opacity:1;opacity:1}.gantt_task_row,.gantt_row{border-bottom:1px solid #ebebeb}.gantt_row,.gantt_task_row{background-color:#fff}.gantt_row.odd,.gantt_task_row.odd{background-color:#fff}.gantt_row,.gantt_cell,.gantt_task_row,.gantt_task_cell,.gantt_grid_head_cell,.gantt_scale_cell{box-sizing:border-box;-moz-box-sizing:border-box}.gantt_grid_head_cell,.gantt_scale_cell{line-height:inherit}.gantt_cell{display:inline-block;vertical-align:top;border-right:1px solid #ebebeb;padding-left:6px;padding-right:6px;height:100%;overflow:hidden;white-space:nowrap;font-size:13px}.gantt_grid_scale .gantt_last_cell,.gantt_grid_data .gantt_last_cell,.gantt_task_scale .gantt_last_cell,.gantt_task_bg .gantt_last_cell{border-right-width:0}.gantt_task_bg{overflow:hidden}.gantt_scale_cell{display:inline-block;white-space:nowrap;overflow:hidden;border-right:1px solid #cecece;text-align:center;height:100%}.gantt_task_cell{display:inline-block;height:100%;border-right:1px solid #ebebeb}.gantt_ver_scroll{width:0;background-color:transparent;height:1px;overflow-x:hidden;overflow-y:scroll;display:none;position:absolute;right:0}.gantt_ver_scroll>div{width:1px;height:1px}.gantt_hor_scroll{height:0;background-color:transparent;width:100%;clear:both;overflow-x:scroll;overflow-y:hidden;display:none}.gantt_hor_scroll>div{width:5000px;height:1px}.gantt_tree_indent{width:15px;height:100%;display:inline-block}.gantt_tree_content,.gantt_tree_icon{vertical-align:top}.gantt_tree_icon{width:28px;height:100%;display:inline-block;background-repeat:no-repeat;background-position:center center}.gantt_tree_content{height:100%;display:inline-block}.gantt_tree_icon.gantt_open{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39////wAAAP///wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0I5RTczQjVDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0I5RTczQjZDMDdBMTFFMTgxRjc4Mzk4M0Q3MjVFQzAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozQjlFNzNCM0MwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozQjlFNzNCNEMwN0ExMUUxODFGNzgzOTgzRDcyNUVDMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARJMMlJq704661B+SAIXAVhnKhBFKSZnmuLImhslXPN3ibi+6pdBXc4IIpB2YkGE1IKAoL0ICUInJNCYMDtDgJYiScUGnHO6LQkAgA7);width:18px;cursor:pointer}.gantt_tree_icon.gantt_close{background-image:url(data:image/gif;base64,R0lGODlhEgASALMJAMrKyt3d3ejp6d7f3+/v75aWlvf39wAAAP///////wAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MzY0QzNGM0VDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MzY0QzNGM0ZDMDdBMTFFMUE3MDlCNUM2QjU1NDA5RjgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozNjRDM0YzQ0MwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozNjRDM0YzREMwN0ExMUUxQTcwOUI1QzZCNTU0MDlGOCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAkALAAAAAASABIAAARDMMlJq704661B+SAIXAVhnKhBFKSZnmv7wqxVzmpd3Uff5zKEUAi0uV4xm4DAbBIEOkohMKhaB4HoxBMKjTjgsFgSAQA7);width:18px;cursor:pointer}.gantt_tree_icon.gantt_blank{width:18px}.gantt_tree_icon.gantt_folder_open{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTdDRDM3QzVDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTdDRDM3QzZDMDZEMTFFMUJGMzhFMDhCN0RGRjBGQ0YiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1N0NEMzdDM0MwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1N0NEMzdDNEMwNkQxMUUxQkYzOEUwOEI3REZGMEZDRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIzlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCBlXd+2XjjLKg5GqoeZXqvsOQXK/ijUZTKVUFADs=)}.gantt_tree_icon.gantt_folder_closed{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTAyMTU1RTNDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTAyMTU1RTRDMDZEMTFFMUJGNzZCRThBRkFCRjg4MTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MDIxNTVFMUMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MDIxNTVFMkMwNkQxMUUxQkY3NkJFOEFGQUJGODgxMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIwlI+pywcPm3mhWgkCsjBOvVkimElG9ZlCuYIY6TYs+6bmHDO4igfdD3GNhheV0VQAADs=)}.gantt_tree_icon.gantt_file{background-image:url(data:image/gif;base64,R0lGODlhEgASAJECAJeXl7Gvrf///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzkxQzI4RjZDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzkxQzI4RjdDMDZEMTFFMTgwRjhBQURDQzI3NDU3QUEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3OTFDMjhGNEMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3OTFDMjhGNUMwNkQxMUUxODBGOEFBRENDMjc0NTdBQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAEAAAIALAAAAAASABIAAAIylI+pwN16QJiUQiFThRlJm3RRFYSlR5qXMKmXaMDuuMoyOi8n/e6xn8NMHETgh5RaKQsAOw==)}.gantt_grid_head_cell .gantt_sort{position:absolute;right:5px;top:8px;width:7px;height:13px;background-repeat:no-repeat;background-position:center center}.gantt_grid_head_cell .gantt_sort.gantt_asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR4nGNgQAKGxib/GbABkIS7b8B/DAUwCRiGK0CXwFBAb1DfP/U/LszwHwi2X7qFgUEArBtdAVwCBmAKMCSQFSDzAWXXaOHsXeqkAAAAAElFTkSuQmCC)}.gantt_grid_head_cell .gantt_sort.gantt_desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAANCAYAAABlyXS1AAAARUlEQVR42mNgQAL1/VP/M2ADIIntF2/9x1AAlrh0C47hCmA60DFYwX88gIFGwNDY5D8uDFbg7hvwHx2jmIBTAlkB0e4BAEjlaNtBWJPnAAAAAElFTkSuQmCC)}.gantt_inserted,.gantt_updated{font-weight:700}.gantt_deleted{text-decoration:line-through}.gantt_invalid{background-color:FFE0E0}.gantt_error{color:red}.dhtmlx_message_area{position:fixed;right:5px;width:250px;z-index:1000}.dhtmlx-info{min-width:120px;padding:4px 4px 4px 20px;font-family:Arial;z-index:10000;margin:5px;margin-bottom:10px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;-o-transition:all .5s ease;transition:all .5s ease}.dhtmlx-info.hidden{height:0;padding:0;border-width:0;margin:0;overflow:hidden}.dhtmlx_modal_box{overflow:hidden;display:inline-block;min-width:250px;width:250px;text-align:center;position:fixed;z-index:20000;box-shadow:3px 3px 3px rgba(0,0,0,.07);font-family:Arial;border-radius:6px;border:1px solid #cecece;background:#fff}.dhtmlx_popup_title{border-top-left-radius:6px;border-top-right-radius:6px;border-width:0}.dhtmlx_button,.dhtmlx_popup_button{border:1px solid #cecece;height:30px;line-height:30px;display:inline-block;margin:0 5px;border-radius:4px;background:#fff}.dhtmlx-info,.dhtmlx_popup_button,.dhtmlx_button{user-select:none;-webkit-user-select:none;-moz-user-select:-moz-none;cursor:pointer}.dhtmlx_popup_text{overflow:hidden}.dhtmlx_popup_controls{border-radius:6px;padding:10px}.dhtmlx_popup_button{min-width:100px}div.dhx_modal_cover{background-color:#000;cursor:default;filter:alpha(opacity=20);opacity:.2;position:fixed;z-index:19999;left:0;top:0;width:100%;height:100%;border:0;zoom:1}.dhtmlx-info img,.dhtmlx_modal_box img{float:left;margin-right:20px}.dhtmlx-alert-error,.dhtmlx-confirm-error{border:1px solid red}.dhtmlx_button input,.dhtmlx_popup_button div{border-radius:4px;font-size:14px;-moz-box-sizing:content-box;box-sizing:content-box;padding:0;margin:0;vertical-align:top}.dhtmlx_popup_title{color:#fff;text-shadow:1px 1px #000;height:40px;line-height:40px;font-size:20px}.dhtmlx_popup_text{margin:15px 15px 5px;font-size:14px;color:#000;min-height:30px;border-radius:6px}.dhtmlx-info,.dhtmlx-error{font-size:14px;color:#000;box-shadow:3px 3px 3px rgba(0,0,0,.07);padding:0;background-color:#FFF;border-radius:3px;border:1px solid #fff}.dhtmlx-info div{padding:5px 10px;background-color:#fff;border-radius:3px;border:1px solid #cecece}.dhtmlx-error{background-color:#d81b1b;border:1px solid #ff3c3c;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.dhtmlx-error div{background-color:#d81b1b;border:1px solid #940000;color:#FFF}.gantt_grid div,.gantt_data_area div{-ms-touch-action:none;-webkit-tap-highlight-color:rgba(0,0,0,0)}.gantt_data_area{position:relative;overflow-x:hidden;overflow-y:hidden;-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_links_area{position:absolute;left:0;top:0}.gantt_task_content,.gantt_task_progress,.gantt_side_content{line-height:inherit;overflow:hidden;height:100%}.gantt_task_content{font-size:12px;color:#fff;position:absolute;white-space:nowrap;text-align:center}.gantt_task_progress{text-align:center;z-index:0;background:#299cb4}.gantt_task_line{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;position:absolute;-moz-box-sizing:border-box;box-sizing:border-box;background-color:#3db9d3;border:1px solid #2898b0;-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.gantt_task_line.gantt_drag_move div{cursor:move}.gantt_side_content{position:absolute;white-space:nowrap;color:#6e6e6e;bottom:7px;font-size:11px}.gantt_side_content.gantt_left{right:100%;padding-right:15px}.gantt_side_content.gantt_right{left:100%;padding-left:15px}.gantt_side_content.gantt_link_crossing{bottom:8.75px}.gantt_task_link .gantt_line_wrapper,.gantt_link_arrow{position:absolute;cursor:pointer}.gantt_line_wrapper div{background-color:#ffa011}.gantt_task_link:hover .gantt_line_wrapper div{box-shadow:0 0 5px 0 #ffa011}.gantt_task_link div.gantt_link_arrow{background-color:transparent;border-style:solid;width:0;height:0}.gantt_link_control{position:absolute;width:13px;top:0}.gantt_link_control div{display:none;cursor:pointer;box-sizing:border-box;position:relative;top:50%;margin-top:-7.5px;vertical-align:middle;border:1px solid #929292;-webkit-border-radius:6.5px;-moz-border-radius:6.5px;border-radius:6.5px;height:13px;width:13px;background-color:#f0f0f0}.gantt_link_control div:hover{background-color:#fff}.gantt_link_control.task_left{left:-13px}.gantt_link_control.task_right{right:-13px}.gantt_task_line.gantt_selected .gantt_link_control div,.gantt_task_line:hover .gantt_link_control div{display:block}.gantt_link_target .gantt_link_control div{display:block}.gantt_link_source,.gantt_link_target{box-shadow:0 0 3px #3db9d3}.gantt_link_target.link_start_allow,.gantt_link_target.link_finish_allow{box-shadow:0 0 3px #ffbf5e}.gantt_link_target.link_start_deny,.gantt_link_target.link_finish_deny{box-shadow:0 0 3px #e87e7b}.link_start_allow .gantt_link_control.task_left div,.link_finish_allow .gantt_link_control.task_right div{background-color:#ffbf5e;border-color:#ffa011}.link_start_deny .gantt_link_control.task_left div,.link_finish_deny .gantt_link_control.task_right div{background-color:#e87e7b;border-color:#dd3e3a}.gantt_link_arrow_right{border-width:4px 0 4px 6px;border-color:transparent transparent transparent #ffa011;margin-top:-1px}.gantt_link_arrow_left{border-width:4px 6px 4px 0;margin-top:-1px;border-color:transparent #ffa011 transparent transparent}.gantt_link_arrow_top{border-width:0 4px 6px;border-color:transparent transparent #ffa011}.gantt_link_arrow_down{border-width:4px 6px 0 4px;border-color:#ffa011 transparent transparent}.gantt_task_drag,.gantt_task_progress_drag{cursor:w-resize;height:100%;display:none;position:absolute}.gantt_task_line.gantt_selected .gantt_task_progress_drag,.gantt_task_line:hover .gantt_task_progress_drag,.gantt_task_line.gantt_selected .gantt_task_drag,.gantt_task_line:hover .gantt_task_drag{display:block}.gantt_task_drag{width:6px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAACCAYAAAB7Xa1eAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QYDDjkw3UJvAwAAABRJREFUCNdj/P//PwM2wASl/6PTAKrrBf4+lD8LAAAAAElFTkSuQmCC);z-index:1;top:0}.gantt_task_drag.task_left{left:0}.gantt_task_drag.task_right{right:0}.gantt_task_progress_drag{height:8px;width:8px;bottom:-4px;margin-left:-4px;background-position:bottom;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAALCAYAAAB24g05AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MkY3Rjk0RUVDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MkY3Rjk0RUZDMkYzMTFFMkI1OThEQTA3ODU0OTkzMEEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyRjdGOTRFQ0MyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyRjdGOTRFREMyRjMxMUUyQjU5OERBMDc4NTQ5OTMwQSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PobPBzIAAADkSURBVHjaYpk2bRoDDsAExL1QdjEQ/8OmiAWHZk4gXqymqhQM4ty6fU8OSMUA8XdiDBAB4k0a6iqWRga6EKcwMQXduHlnL5DpB8Rv0J2JDFSA+JiOtgZcMwiA2CAxkBxUDVYDLEAKgIpV9XQ0MZwFEgPJAZnHoWpRDAgC4n2W5saiQKfjClQGkBxQDciL+6B6wAbkA/EqJwdrTkUFOQZCAKQGpBbIXA3SCzJggo+XK7OEuBgDsQCkFqgHrBfsBT5eHgZSAUwP2IBfv36TbABMDygdtK1Zv6UESLORaAbIhG6AAAMAKN8wE24DXWcAAAAASUVORK5CYII=);background-repeat:no-repeat;z-index:2}.gantt_link_tooltip{box-shadow:3px 3px 3px #888;background-color:#fff;border-left:1px dotted #cecece;border-top:1px dotted #cecece;font-family:Tahoma;font-size:8pt;color:#444;padding:6px;line-height:20px}.gantt_link_direction{height:0;border:0 none #ffa011;border-bottom-style:dashed;border-bottom-width:2px;transform-origin:0 0;-ms-transform-origin:0 0;-webkit-transform-origin:0 0;z-index:2;margin-left:1px;position:absolute}.gantt_grid_data .gantt_row.gantt_selected,.gantt_grid_data .gantt_row.odd.gantt_selected{background-color:#fff3a1}.gantt_task_row.gantt_selected{background-color:#fff3a1}.gantt_task_row.gantt_selected .gantt_task_cell{border-right-color:#ffec6e}.gantt_task_line.gantt_selected{box-shadow:0 0 5px #299cb4}.gantt_task_line.gantt_project.gantt_selected{box-shadow:0 0 5px #46ad51}.dhx_unselectable,.dhx_unselectable div{-webkit-user-select:none;-moz-user-select:none;-moz-user-select:-moz-none}.dhx_cal_light{-webkit-tap-highlight-color:transparent;background:#fff;border-radius:6px;font-family:Arial;font-size:13px;border:1px solid #cecece;color:#6b6b6b;font-size:12px;position:absolute;z-index:10001;width:550px;height:250px;box-shadow:3px 3px 3px rgba(0,0,0,.07)}.dhx_cal_light_wide{width:650px}.dhx_cal_light select{font-family:Arial;border:1px solid #cecece;font-size:13px;padding:2px;margin:0}.dhx_cal_ltitle{padding:7px 10px;overflow:hidden;white-space:nowrap;-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0}.dhx_cal_ltitle span{white-space:nowrap}.dhx_cal_lsection{color:#727272;font-weight:700;padding:12px 0 5px 10px}.dhx_cal_lsection .dhx_fullday{float:right;margin-right:5px;font-size:12px;font-weight:400;line-height:20px;vertical-align:top;cursor:pointer}.dhx_cal_lsection{font-size:13px}.dhx_cal_ltext{padding:2px 10px;overflow:hidden}.dhx_cal_ltext textarea{overflow:auto;font-family:Arial;font-size:13px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cecece;height:100%;width:100%;outline:0!important;resize:none}.dhx_time{font-weight:700}.dhx_cal_light .dhx_title{padding-left:10px}.dhx_cal_larea{border:1px solid #cecece;border-left:0;border-right:0;background-color:#fff;overflow:hidden;height:1px}.dhx_btn_set{margin:10px 7px 5px 10px;padding:5px 15px 5px 10px;float:left;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border-width:0;border-color:#cecece;border-style:solid;height:32px;font-weight:700;background:#fff;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.dhx_btn_set div{float:left;font-size:13px;height:22px;line-height:22px;background-repeat:no-repeat;vertical-align:middle}.dhx_save_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MTk1OUU5RDFDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MTk1OUU5RDJDMzA0MTFFMkExMUZBQTdDNDAzOUE5RjMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxOTU5RTlDRkMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxOTU5RTlEMEMzMDQxMUUyQTExRkFBN0M0MDM5QTlGMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PjDroXYAAAEXSURBVHjaYvz//z8DJYCRUgPIAUxAbAnEHiAHMIBcQCwGaRYXF3e6evXqoffv39/dv38/CymaGSUkJBzv3LlzCsj///fv3wdAihkkIQnEvkAshU8zLy+v7a1bt06ANP/79+87kDIAy505cybq06dPr3p7ezuwGQLTfOPGjWP/ESAZLg8kPKBO+g01RBJNszWyZqC6uSgWgIg/f/4shxnS2dnZBjMEqNkSFGBImi8CKTYMA4BYCGjIczRDHC5dunQQSfN7IKWI4UUkjjdMMdCwnw8ePLjwHxV4Yw1gZA5Q47z/2EELzhhCE+ABGvIQWSeQvwcU38QaAML2wHj+C/X3MyAlijeB4ZBoBOIPQGxJKIVSnBsBAgwABddBclWfcZUAAAAASUVORK5CYII=);margin-top:2px;width:21px}.dhx_cancel_btn{margin-top:2px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDkzMDA3MzlDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDkzMDA3M0FDMzA0MTFFMjg2QTVFMzFEQzgwRkJERDYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowOTMwMDczN0MzMDQxMUUyODZBNUUzMURDODBGQkRENiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowOTMwMDczOEMzMDQxMUUyODZBNUUzMURDODBGQkRENiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmYuYOUAAAEdSURBVHjaYvz//z8DJYAFXWDlypU8QKoIiD2A2AwqfAqIdwBxX3h4+Bdk9YzILgBqtgdS84FYEYeF94E4EWjIQZgAE5LmQCB1AKoZZKMPEAtAMYh9GSp3AKjWD8UFQAEhIPshEIOc3wHENUBb/qJ57SyQMoJyPwKxElDNO1gYFEE17wMKVmIJlzNQzeegrjaA6qmBecEbSvfh0GwMxGeBhoPoemQ9MAO0kEIbl2YTqPAFKK2IbMB3AjabYIkRZmQD7kNpMyI0G0PpO8gGbIUFJj7NQDk2INWIrIcJKfBAKcwJqvkcDs0TgFgXGo19KCkRmpDWQdWDEk0NUoCBoq0FqhkE/IEWbKJKUmZEz43QzFSKIzN1481M5ACAAAMAlfl/lCwRpagAAAAASUVORK5CYII=);width:20px}.dhx_delete_btn{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=);margin-top:2px;width:20px}.dhx_cal_cover{width:100%;height:100%;position:absolute;z-index:10000;top:0;left:0;background-color:#000;opacity:.1;filter:alpha(opacity=10)}.dhx_custom_button{padding:0 3px;font-family:Arial;font-size:13px;font-weight:400;margin-right:5px;margin-top:0;cursor:pointer}.dhx_custom_button div{cursor:pointer;float:left;height:21px;line-height:21px;vertical-align:middle}.dhx_cal_light_wide{width:580px;padding:2px 4px}.dhx_cal_light_wide .dhx_cal_larea{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #cecece}.dhx_cal_light_wide .dhx_cal_lsection{border:0;float:left;text-align:right;width:80px;height:20px;padding:5px 10px 0 0}.dhx_cal_light_wide .dhx_wrap_section{position:relative;padding:10px 0;overflow:hidden;border-bottom:1px solid #ebebeb}.dhx_cal_light_wide .dhx_section_time{overflow:hidden;padding-top:2px!important;padding-right:0;height:20px!important}.dhx_cal_light_wide .dhx_cal_ltext{padding-right:0}.dhx_cal_light_wide .dhx_cal_larea{padding:0 10px;width:100%}.dhx_cal_light_wide .dhx_section_time{background:transparent}.dhx_cal_light_wide .dhx_cal_checkbox label{padding-left:0}.dhx_cal_light_wide .dhx_cal_lsection .dhx_fullday{float:none;margin-right:0;font-weight:700;cursor:pointer}.dhx_cal_light_wide .dhx_custom_button{position:absolute;top:0;right:0;margin-top:2px}.dhx_cal_light_wide .dhx_repeat_right{margin-right:55px}.dhx_cal_light_wide.dhx_cal_light_full{width:738px}.dhx_cal_wide_checkbox input{margin-top:8px;margin-left:14px}.dhx_cal_light input{font-size:13px}.dhx_custom_button{float:right;height:21px;width:90px;-webkit-border-radius:4px;-moz-border-radius:4px;-ms-border-radius:4px;-o-border-radius:4px;border-radius:4px}.dhx_section_time{background-color:#fff;white-space:nowrap;padding:2px 10px 5px;padding-top:2px!important}.dhx_section_time .dhx_time_selects{float:left;height:25px}.dhx_section_time .dhx_time_selects select{height:23px;padding:2px;border:1px solid #cecece}.dhx_gantt_duration{width:100px;height:23px;float:left;white-space:nowrap;margin-left:20px;line-height:23px}.dhx_gantt_duration .dhx_gantt_duration_value,.dhx_gantt_duration .dhx_gantt_duration_dec,.dhx_gantt_duration .dhx_gantt_duration_inc{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;vertical-align:top;height:100%;border:1px solid #cecece}.dhx_gantt_duration .dhx_gantt_duration_value{width:40px;padding:3px 4px;border-left-width:0;border-right-width:0}.dhx_gantt_duration .dhx_gantt_duration_dec,.dhx_gantt_duration .dhx_gantt_duration_inc{width:20px;padding:1px;padding-bottom:3px;background:#fff}.dhx_gantt_duration .dhx_gantt_duration_dec{-moz-border-top-left-radius:4px;-moz-border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.dhx_gantt_duration .dhx_gantt_duration_inc{margin-right:4px;-moz-border-top-right-radius:4px;-moz-border-bottom-right-radius:4px;-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.dhx_cal_quick_info{border:1px solid #cecece;border-radius:6px;position:absolute;z-index:300;box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;width:300px;transition:left .5s ease,right .5s;-moz-transition:left .5s ease,right .5s;-webkit-transition:left .5s ease,right .5s;-o-transition:left .5s ease,right .5s}.dhx_no_animate{transition:none;-moz-transition:none;-webkit-transition:none;-o-transition:none}.dhx_cal_quick_info.dhx_qi_left .dhx_qi_big_icon{float:right}.dhx_cal_qi_title{-webkit-border-top-left-radius:6px;-webkit-border-bottom-left-radius:0;-webkit-border-top-right-radius:6px;-webkit-border-bottom-right-radius:0;-moz-border-radius-topleft:6px;-moz-border-radius-bottomleft:0;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:0;border-top-left-radius:6px;border-bottom-left-radius:0;border-top-right-radius:6px;border-bottom-right-radius:0;padding:5px 0 8px 12px;color:#454545;background-color:#fff;border-bottom:1px solid #cecece}.dhx_cal_qi_tdate{font-size:14px;font-weight:700}.dhx_cal_qi_tcontent{font-size:13px}.dhx_cal_qi_content{padding:16px 8px;font-size:13px;color:#454545;overflow:hidden}.dhx_cal_qi_controls{-webkit-border-top-left-radius:0;-webkit-border-bottom-left-radius:6px;-webkit-border-top-right-radius:0;-webkit-border-bottom-right-radius:6px;-moz-border-radius-topleft:0;-moz-border-radius-bottomleft:6px;-moz-border-radius-topright:0;-moz-border-radius-bottomright:6px;border-top-left-radius:0;border-bottom-left-radius:6px;border-top-right-radius:0;border-bottom-right-radius:6px;padding-left:7px}.dhx_cal_qi_controls .dhx_menu_icon{margin-top:6px;background-repeat:no-repeat}.dhx_cal_qi_controls .dhx_menu_icon.icon_edit{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH3QYFCjI5ZQj5bAAAAFNJREFUOMvt0zEOACAIA0DkwTymH8bJTRTKZGJXyaWEKPKTCQAH4Ls37cItcDUzsxHNDLZNhCq7Gt1wh9ErV7EjyGAhyGLphlnsClWuS32rn0czAV+vNGrM/LBtAAAAAElFTkSuQmCC)}.dhx_cal_qi_controls .dhx_menu_icon.icon_delete{width:20px;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MjFENzI3NUNDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MjFENzI3NURDMzA0MTFFMjhBNjJGQTc3MUIyQzYzNEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoyMUQ3Mjc1QUMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoyMUQ3Mjc1QkMzMDQxMUUyOEE2MkZBNzcxQjJDNjM0RiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PmUD0gAAAABvSURBVHjaYvz//z8DIyMjAxYQicReji4J0ofKQNP8HwmgGQbXB8IsWGwDSSwDuioKjY9uBthVjFAXYHUGAQA2kYmBUoAUBpGk0LAwgBvwH+YX4mkwptgLowYMRgOITUyYKRFIN/wnDjQgJySAAAMApryKzL8wjfUAAAAASUVORK5CYII=)}.dhx_qi_big_icon{font-size:13px;border-radius:4px;font-weight:700;background:#fff;margin:5px 9px 8px 0;min-width:60px;line-height:32px;vertical-align:middle;padding:0 10px 0 5px;cursor:pointer;border:1px solid #cecece}.dhx_cal_qi_controls div{float:left;height:32px;text-align:center;line-height:32px}.gantt_tooltip{box-shadow:3px 3px 3px rgba(0,0,0,.07);background-color:#fff;border-left:1px solid rgba(0,0,0,.07);border-top:1px solid rgba(0,0,0,.07);font-family:Arial;font-size:8pt;color:#454545;padding:10px;position:absolute;z-index:500}.gantt_noselect{-moz-user-select:-moz-none;-webkit-user-select:none;-user-select:none}.gantt_drag_marker{position:absolute;font-family:Arial;font-size:13px}.gantt_drag_marker .gantt_tree_indent,.gantt_drag_marker .gantt_tree_icon.gantt_blank,.gantt_drag_marker .gantt_tree_icon.gantt_open,.gantt_drag_marker .gantt_tree_icon.gantt_close{display:none}.gantt_drag_marker,.gantt_drag_marker .gantt_row.odd{background-color:#fff}.gantt_drag_marker .gantt_row{border-left:1px solid #d2d2d2;border-top:1px solid #d2d2d2}.gantt_drag_marker .gantt_cell{border-color:#d2d2d2}.gantt_row.gantt_over,.gantt_task_row.gantt_over{background-color:#0070fe}.gantt_row.gantt_transparent .gantt_cell{opacity:.7}.gantt_task_row.gantt_transparent{background-color:#f8fdfd}.dhtmlx_popup_button.dhtmlx_delete_button{background:#3db9d3;text-shadow:0 -1px 0 #248a9f;color:#fff;font-weight:700;border-width:0}
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>39454</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681769.06</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>handlebars.min.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*!\n
\n
handlebars v2.0.0-alpha.4\n
\n
Copyright (C) 2011-2014 by Yehuda Katz\n
\n
Permission is hereby granted, free of charge, to any person obtaining a copy\n
of this software and associated documentation files (the "Software"), to deal\n
in the Software without restriction, including without limitation the rights\n
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n
copies of the Software, and to permit persons to whom the Software is\n
furnished to do so, subject to the following conditions:\n
\n
The above copyright notice and this permission notice shall be included in\n
all copies or substantial portions of the Software.\n
\n
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n
THE SOFTWARE.\n
\n
@license\n
*/\n
this.Handlebars=function(){var a=function(){"use strict";function a(a){this.string=a}var b;return a.prototype.toString=function(){return""+this.string},b=a}(),b=function(a){"use strict";function b(a){return i[a]||"&amp;"}function c(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function d(a){return a instanceof h?a.toString():a||0===a?(a=""+a,k.test(a)?a.replace(j,b):a):""}function e(a){return a||0===a?n(a)&&0===a.length?!0:!1:!0}function f(a,b){return(a?a+".":"")+b}var g={},h=a,i={"&":"&amp;","<":"&lt;",">":"&gt;",\'"\':"&quot;","\'":"&#x27;","`":"&#x60;"},j=/[&<>"\'`]/g,k=/[&<>"\'`]/;g.extend=c;var l=Object.prototype.toString;g.toString=l;var m=function(a){return"function"==typeof a};m(/x/)&&(m=function(a){return"function"==typeof a&&"[object Function]"===l.call(a)});var m;g.isFunction=m;var n=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===l.call(a):!1};return g.isArray=n,g.escapeExpression=d,g.isEmpty=e,g.appendContextPath=f,g}(a),c=function(){"use strict";function a(a,b){var d;b&&b.firstLine&&(d=b.firstLine,a+=" - "+d+":"+b.firstColumn);for(var e=Error.prototype.constructor.call(this,a),f=0;f<c.length;f++)this[c[f]]=e[c[f]];d&&(this.lineNumber=d,this.column=b.firstColumn)}var b,c=["description","fileName","lineNumber","message","name","number","stack"];return a.prototype=new Error,b=a}(),d=function(a,b){"use strict";function c(a,b){this.helpers=a||{},this.partials=b||{},d(this)}function d(a){a.registerHelper("helperMissing",function(){if(1===arguments.length)return void 0;throw new h("Missing helper: \'"+arguments[arguments.length-1].name+"\'")}),a.registerHelper("blockHelperMissing",function(b,c){var d=c.inverse||function(){},e=c.fn;if(m(b)&&(b=b.call(this)),b===!0)return e(this);if(b===!1||null==b)return d(this);if(l(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):d(this);if(c.data&&c.ids){var f=q(c.data);f.contextPath=g.appendContextPath(c.data.contextPath,c.name),c={data:f}}return e(b,c)}),a.registerHelper("each",function(a,b){b||(b=a,a=this);var c,d,e=b.fn,f=b.inverse,h=0,i="";if(b.data&&b.ids&&(d=g.appendContextPath(b.data.contextPath,b.ids[0])+"."),m(a)&&(a=a.call(this)),b.data&&(c=q(b.data)),a&&"object"==typeof a)if(l(a))for(var j=a.length;j>h;h++)c&&(c.index=h,c.first=0===h,c.last=h===a.length-1,d&&(c.contextPath=d+h)),i+=e(a[h],{data:c});else for(var k in a)a.hasOwnProperty(k)&&(c&&(c.key=k,c.index=h,c.first=0===h,d&&(c.contextPath=d+k)),i+=e(a[k],{data:c}),h++);return 0===h&&(i=f(this)),i}),a.registerHelper("if",function(a,b){return m(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||g.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})}),a.registerHelper("with",function(a,b){m(a)&&(a=a.call(this));var c=b.fn;if(!g.isEmpty(a)){if(b.data&&b.ids){var d=q(b.data);d.contextPath=g.appendContextPath(b.data.contextPath,b.ids[0]),b={data:d}}return c(a,b)}}),a.registerHelper("log",function(b,c){var d=c.data&&null!=c.data.level?parseInt(c.data.level,10):1;a.log(d,b)}),a.registerHelper("lookup",function(a,b){return a&&a[b]})}function e(a,b){p.log(a,b)}var f={},g=a,h=b,i="2.0.0-alpha.4";f.VERSION=i;var j=5;f.COMPILER_REVISION=j;var k={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:">= 2.0.0"};f.REVISION_CHANGES=k;var l=g.isArray,m=g.isFunction,n=g.toString,o="[object Object]";f.HandlebarsEnvironment=c,c.prototype={constructor:c,logger:p,log:e,registerHelper:function(a,b,c){if(n.call(a)===o){if(c||b)throw new h("Arg not supported with multiple helpers");g.extend(this.helpers,a)}else c&&(b.not=c),this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){n.call(a)===o?g.extend(this.partials,a):this.partials[a]=b},unregisterPartial:function(a){delete this.partials[a]}};var p={methodMap:{0:"debug",1:"info",2:"warn",3:"error"},DEBUG:0,INFO:1,WARN:2,ERROR:3,level:3,log:function(a,b){if(p.level<=a){var c=p.methodMap[a];"undefined"!=typeof console&&console[c]&&console[c].call(console,b)}}};f.logger=p,f.log=e;var q=function(a){var b=g.extend({},a);return b._parent=a,b};return f.createFrame=q,f}(b,c),e=function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=n;if(b!==c){if(c>b){var d=o[c],e=o[b];throw new m("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new m("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){if(!b)throw new m("No environment passed to template");b.VM.checkRevision(a.compiler);var c=function(a,c,d,e,f,g,h){e&&(d=l.extend({},d,e));var i=b.VM.invokePartial.call(this,a,c,d,f,g,h);if(null!=i)return i;if(b.compile){var j={helpers:f,partials:g,data:h};return g[c]=b.compile(a,{data:void 0!==h},b),g[c](d,j)}throw new m("The partial "+c+" could not be compiled when running in runtime-only mode")},d={escapeExpression:l.escapeExpression,invokePartial:c,fn:function(b){return a[b]},programs:[],program:function(a,b){var c=this.programs[a],d=this.fn(a);return b?c=g(this,a,d,b):c||(c=this.programs[a]=g(this,a,d)),c},programWithDepth:b.VM.programWithDepth,data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=l.extend({},b,a)),c},noop:b.VM.noop,compilerInfo:a.compiler},e=function(b,c){c=c||{};var f=c.data;return e._setup(c),!c.partial&&a.useData&&(f=j(b,f)),a.main.call(d,b,d.helpers,d.partials,f)};return e._setup=function(c){c.partial?(d.helpers=c.helpers,d.partials=c.partials):(d.helpers=d.merge(c.helpers,b.helpers),a.usePartial&&(d.partials=d.merge(c.partials,b.partials)))},e._child=function(a){return d.programWithDepth(a)},e}function f(a,b){var c=Array.prototype.slice.call(arguments,2),d=this,e=d.fn(a),f=function(a,f){return f=f||{},e.apply(d,[a,d.helpers,d.partials,f.data||b].concat(c))};return f.program=a,f.depth=c.length,f}function g(a,b,c,d){var e=function(b,e){return e=e||{},c.call(a,b,a.helpers,a.partials,e.data||d)};return e.program=b,e.depth=0,e}function h(a,b,c,d,e,f){var g={partial:!0,helpers:d,partials:e,data:f};if(void 0===a)throw new m("The partial "+b+" could not be found");return a instanceof Function?a(c,g):void 0}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?p(b):{},b.root=a),b}var k={},l=a,m=b,n=c.COMPILER_REVISION,o=c.REVISION_CHANGES,p=c.createFrame;return k.checkRevision=d,k.template=e,k.programWithDepth=f,k.program=g,k.invokePartial=h,k.noop=i,k}(b,c,d),f=function(a,b,c,d,e){"use strict";var f,g=a,h=b,i=c,j=d,k=e,l=function(){var a=new g.HandlebarsEnvironment;return j.extend(a,g),a.SafeString=h,a.Exception=i,a.Utils=j,a.VM=k,a.template=function(b){return k.template(b,a)},a},m=l();return m.create=l,f=m}(d,a,c,b,e),g=function(a){"use strict";function b(a){a=a||{},this.firstLine=a.first_line,this.firstColumn=a.first_column,this.lastColumn=a.last_column,this.lastLine=a.last_line}var c,d=a,e={ProgramNode:function(a,c,d,f){var g,h;3===arguments.length?(f=d,d=null):2===arguments.length&&(f=c,c=null),b.call(this,f),this.type="program",this.statements=a,this.strip={},d?(h=d[0],h?(g={first_line:h.firstLine,last_line:h.lastLine,last_column:h.lastColumn,first_column:h.firstColumn},this.inverse=new e.ProgramNode(d,c,g)):this.inverse=new e.ProgramNode(d,c),this.strip.right=c.left):c&&(this.strip.left=c.right)},MustacheNode:function(a,c,d,f,g){if(b.call(this,g),this.type="mustache",this.strip=f,null!=d&&d.charAt){var h=d.charAt(3)||d.charAt(2);this.escaped="{"!==h&&"&"!==h}else this.escaped=!!d;this.sexpr=a instanceof e.SexprNode?a:new e.SexprNode(a,c),this.sexpr.isRoot=!0,this.id=this.sexpr.id,this.params=this.sexpr.params,this.hash=this.sexpr.hash,this.eligibleHelper=this.sexpr.eligibleHelper,this.isHelper=this.sexpr.isHelper},SexprNode:function(a,c,d){b.call(this,d),this.type="sexpr",this.hash=c;var e=this.id=a[0],f=this.params=a.slice(1);this.isHelper=!(!f.length&&!c),this.eligibleHelper=this.isHelper||e.isSimple},PartialNode:function(a,c,d,e,f){b.call(this,f),this.type="partial",this.partialName=a,this.context=c,this.hash=d,this.strip=e},BlockNode:function(a,c,e,f,g){if(b.call(this,g),a.sexpr.id.original!==f.path.original)throw new d(a.sexpr.id.original+" doesn\'t match "+f.path.original,this);this.type="block",this.mustache=a,this.program=c,this.inverse=e,this.strip={left:a.strip.left,right:f.strip.right},(c||e).strip.left=a.strip.right,(e||c).strip.right=f.strip.left,e&&!c&&(this.isInverse=!0)},RawBlockNode:function(a,c,f,g){if(b.call(this,g),a.sexpr.id.original!==f)throw new d(a.sexpr.id.original+" doesn\'t match "+f,this);c=new e.ContentNode(c,g),this.type="block",this.mustache=a,this.program=new e.ProgramNode([c],g)},ContentNode:function(a,c){b.call(this,c),this.type="content",this.string=a},HashNode:function(a,c){b.call(this,c),this.type="hash",this.pairs=a},IdNode:function(a,c){b.call(this,c),this.type="ID";for(var e="",f=[],g=0,h="",i=0,j=a.length;j>i;i++){var k=a[i].part;if(e+=(a[i].separator||"")+k,".."===k||"."===k||"this"===k){if(f.length>0)throw new d("Invalid path: "+e,this);".."===k?(g++,h+="../"):this.isScoped=!0}else f.push(k)}this.original=e,this.parts=f,this.string=f.join("."),this.depth=g,this.idName=h+this.string,this.isSimple=1===a.length&&!this.isScoped&&0===g,this.stringModeValue=this.string},PartialNameNode:function(a,c){b.call(this,c),this.type="PARTIAL_NAME",this.name=a.original},DataNode:function(a,c){b.call(this,c),this.type="DATA",this.id=a,this.stringModeValue=a.stringModeValue,this.idName="@"+a.stringModeValue},StringNode:function(a,c){b.call(this,c),this.type="STRING",this.original=this.string=this.stringModeValue=a},NumberNode:function(a,c){b.call(this,c),this.type="NUMBER",this.original=this.number=a,this.stringModeValue=Number(a)},BooleanNode:function(a,c){b.call(this,c),this.type="BOOLEAN",this.bool=a,this.stringModeValue="true"===a},CommentNode:function(a,c){b.call(this,c),this.type="comment",this.comment=a}};return c=e}(c),h=function(){"use strict";var a,b=function(){function a(a,b){return{left:"~"===a.charAt(2),right:"~"===b.charAt(0)||"~"===b.charAt(1)}}function b(){this.yy={}}var c={trace:function(){},yy:{},symbols_:{error:2,root:3,statements:4,EOF:5,program:6,simpleInverse:7,statement:8,openRawBlock:9,CONTENT:10,END_RAW_BLOCK:11,openInverse:12,closeBlock:13,openBlock:14,mustache:15,partial:16,COMMENT:17,OPEN_RAW_BLOCK:18,sexpr:19,CLOSE_RAW_BLOCK:20,OPEN_BLOCK:21,CLOSE:22,OPEN_INVERSE:23,OPEN_ENDBLOCK:24,path:25,OPEN:26,OPEN_UNESCAPED:27,CLOSE_UNESCAPED:28,OPEN_PARTIAL:29,partialName:30,param:31,partial_option0:32,partial_option1:33,sexpr_repetition0:34,sexpr_option0:35,dataName:36,STRING:37,NUMBER:38,BOOLEAN:39,OPEN_SEXPR:40,CLOSE_SEXPR:41,hash:42,hash_repetition_plus0:43,hashSegment:44,ID:45,EQUALS:46,DATA:47,pathSegments:48,SEP:49,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",10:"CONTENT",11:"END_RAW_BLOCK",17:"COMMENT",18:"OPEN_RAW_BLOCK",20:"CLOSE_RAW_BLOCK",21:"OPEN_BLOCK",22:"CLOSE",23:"OPEN_INVERSE",24:"OPEN_ENDBLOCK",26:"OPEN",27:"OPEN_UNESCAPED",28:"CLOSE_UNESCAPED",29:"OPEN_PARTIAL",37:"STRING",38:"NUMBER",39:"BOOLEAN",40:"OPEN_SEXPR",41:"CLOSE_SEXPR",45:"ID",46:"EQUALS",47:"DATA",49:"SEP"},productions_:[0,[3,2],[3,1],[6,2],[6,3],[6,2],[6,1],[6,1],[6,0],[4,1],[4,2],[8,3],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[9,3],[14,3],[12,3],[13,3],[15,3],[15,3],[16,5],[16,4],[7,2],[19,3],[19,1],[31,1],[31,1],[31,1],[31,1],[31,1],[31,3],[42,1],[44,3],[30,1],[30,1],[30,1],[36,2],[25,1],[48,3],[48,1],[32,0],[32,1],[33,0],[33,1],[34,0],[34,2],[35,0],[35,1],[43,1],[43,2]],performAction:function(b,c,d,e,f,g){var h=g.length-1;switch(f){case 1:return new e.ProgramNode(g[h-1],this._$);case 2:return new e.ProgramNode([],this._$);case 3:this.$=new e.ProgramNode([],g[h-1],g[h],this._$);break;case 4:this.$=new e.ProgramNode(g[h-2],g[h-1],g[h],this._$);break;case 5:this.$=new e.ProgramNode(g[h-1],g[h],[],this._$);break;case 6:this.$=new e.ProgramNode(g[h],this._$);break;case 7:this.$=new e.ProgramNode([],this._$);break;case 8:this.$=new e.ProgramNode([],this._$);break;case 9:this.$=[g[h]];break;case 10:g[h-1].push(g[h]),this.$=g[h-1];break;case 11:this.$=new e.RawBlockNode(g[h-2],g[h-1],g[h],this._$);break;case 12:this.$=new e.BlockNode(g[h-2],g[h-1].inverse,g[h-1],g[h],this._$);break;case 13:this.$=new e.BlockNode(g[h-2],g[h-1],g[h-1].inverse,g[h],this._$);break;case 14:this.$=g[h];break;case 15:this.$=g[h];break;case 16:this.$=new e.ContentNode(g[h],this._$);break;case 17:this.$=new e.CommentNode(g[h],this._$);break;case 18:this.$=new e.MustacheNode(g[h-1],null,"","",this._$);break;case 19:this.$=new e.MustacheNode(g[h-1],null,g[h-2],a(g[h-2],g[h]),this._$);break;case 20:this.$=new e.MustacheNode(g[h-1],null,g[h-2],a(g[h-2],g[h]),this._$);break;case 21:this.$={path:g[h-1],strip:a(g[h-2],g[h])};break;case 22:this.$=new e.MustacheNode(g[h-1],null,g[h-2],a(g[h-2],g[h]),this._$);break;case 23:this.$=new e.MustacheNode(g[h-1],null,g[h-2],a(g[h-2],g[h]),this._$);break;case 24:this.$=new e.PartialNode(g[h-3],g[h-2],g[h-1],a(g[h-4],g[h]),this._$);break;case 25:this.$=new e.PartialNode(g[h-2],void 0,g[h-1],a(g[h-3],g[h]),this._$);break;case 26:this.$=a(g[h-1],g[h]);break;case 27:this.$=new e.SexprNode([g[h-2]].concat(g[h-1]),g[h],this._$);break;case 28:this.$=new e.SexprNode([g[h]],null,this._$);break;case 29:this.$=g[h];break;case 30:this.$=new e.StringNode(g[h],this._$);break;case 31:this.$=new e.NumberNode(g[h],this._$);break;case 32:this.$=new e.BooleanNode(g[h],this._$);break;case 33:this.$=g[h];break;case 34:g[h-1].isHelper=!0,this.$=g[h-1];break;case 35:this.$=new e.HashNode(g[h],this._$);break;case 36:this.$=[g[h-2],g[h]];break;case 37:this.$=new e.PartialNameNode(g[h],this._$);break;case 38:this.$=new e.PartialNameNode(new e.StringNode(g[h],this._$),this._$);break;case 39:this.$=new e.PartialNameNode(new e.NumberNode(g[h],this._$));break;case 40:this.$=new e.DataNode(g[h],this._$);break;case 41:this.$=new e.IdNode(g[h],this._$);break;case 42:g[h-2].push({part:g[h],separator:g[h-1]}),this.$=g[h-2];break;case 43:this.$=[{part:g[h]}];break;case 48:this.$=[];break;case 49:g[h-1].push(g[h]);break;case 52:this.$=[g[h]];break;case 53:g[h-1].push(g[h])}},table:[{3:1,4:2,5:[1,3],8:4,9:5,10:[1,10],12:6,14:7,15:8,16:9,17:[1,11],18:[1,12],21:[1,14],23:[1,13],26:[1,15],27:[1,16],29:[1,17]},{1:[3]},{5:[1,18],8:19,9:5,10:[1,10],12:6,14:7,15:8,16:9,17:[1,11],18:[1,12],21:[1,14],23:[1,13],26:[1,15],27:[1,16],29:[1,17]},{1:[2,2]},{5:[2,9],10:[2,9],17:[2,9],18:[2,9],21:[2,9],23:[2,9],24:[2,9],26:[2,9],27:[2,9],29:[2,9]},{10:[1,20]},{4:23,6:21,7:22,8:4,9:5,10:[1,10],12:6,14:7,15:8,16:9,17:[1,11],18:[1,12],21:[1,14],23:[1,24],24:[2,8],26:[1,15],27:[1,16],29:[1,17]},{4:23,6:25,7:22,8:4,9:5,10:[1,10],12:6,14:7,15:8,16:9,17:[1,11],18:[1,12],21:[1,14],23:[1,24],24:[2,8],26:[1,15],27:[1,16],29:[1,17]},{5:[2,14],10:[2,14],17:[2,14],18:[2,14],21:[2,14],23:[2,14],24:[2,14],26:[2,14],27:[2,14],29:[2,14]},{5:[2,15],10:[2,15],17:[2,15],18:[2,15],21:[2,15],23:[2,15],24:[2,15],26:[2,15],27:[2,15],29:[2,15]},{5:[2,16],10:[2,16],17:[2,16],18:[2,16],21:[2,16],23:[2,16],24:[2,16],26:[2,16],27:[2,16],29:[2,16]},{5:[2,17],10:[2,17],17:[2,17],18:[2,17],21:[2,17],23:[2,17],24:[2,17],26:[2,17],27:[2,17],29:[2,17]},{19:26,25:27,36:28,45:[1,31],47:[1,30],48:29},{19:32,25:27,36:28,45:[1,31],47:[1,30],48:29},{19:33,25:27,36:28,45:[1,31],47:[1,30],48:29},{19:34,25:27,36:28,45:[1,31],47:[1,30],48:29},{19:35,25:27,36:28,45:[1,31],47:[1,30],48:29},{25:37,30:36,37:[1,38],38:[1,39],45:[1,31],48:29},{1:[2,1]},{5:[2,10],10:[2,10],17:[2,10],18:[2,10],21:[2,10],23:[2,10],24:[2,10],26:[2,10],27:[2,10],29:[2,10]},{11:[1,40]},{13:41,24:[1,42]},{4:43,8:4,9:5,10:[1,10],12:6,14:7,15:8,16:9,17:[1,11],18:[1,12],21:[1,14],23:[1,13],24:[2,7],26:[1,15],27:[1,16],29:[1,17]},{7:44,8:19,9:5,10:[1,10],12:6,14:7,15:8,16:9,17:[1,11],18:[1,12],21:[1,14],23:[1,24],24:[2,6],26:[1,15],27:[1,16],29:[1,17]},{19:32,22:[1,45],25:27,36:28,45:[1,31],47:[1,30],48:29},{13:46,24:[1,42]},{20:[1,47]},{20:[2,48],22:[2,48],28:[2,48],34:48,37:[2,48],38:[2,48],39:[2,48],40:[2,48],41:[2,48],45:[2,48],47:[2,48]},{20:[2,28],22:[2,28],28:[2,28],41:[2,28]},{20:[2,41],22:[2,41],28:[2,41],37:[2,41],38:[2,41],39:[2,41],40:[2,41],41:[2,41],45:[2,41],47:[2,41],49:[1,49]},{25:50,45:[1,31],48:29},{20:[2,43],22:[2,43],28:[2,43],37:[2,43],38:[2,43],39:[2,43],40:[2,43],41:[2,43],45:[2,43],47:[2,43],49:[2,43]},{22:[1,51]},{22:[1,52]},{22:[1,53]},{28:[1,54]},{22:[2,46],25:57,31:55,33:56,36:61,37:[1,58],38:[1,59],39:[1,60],40:[1,62],42:63,43:64,44:66,45:[1,65],47:[1,30],48:29},{22:[2,37],37:[2,37],38:[2,37],39:[2,37],40:[2,37],45:[2,37],47:[2,37]},{22:[2,38],37:[2,38],38:[2,38],39:[2,38],40:[2,38],45:[2,38],47:[2,38]},{22:[2,39],37:[2,39],38:[2,39],39:[2,39],40:[2,39],45:[2,39],47:[2,39]},{5:[2,11],10:[2,11],17:[2,11],18:[2,11],21:[2,11],23:[2,11],24:[2,11],26:[2,11],27:[2,11],29:[2,11]},{5:[2,12],10:[2,12],17:[2,12],18:[2,12],21:[2,12],23:[2,12],24:[2,12],26:[2,12],27:[2,12],29:[2,12]},{25:67,45:[1,31],48:29},{8:19,9:5,10:[1,10],12:6,14:7,15:8,16:9,17:[1,11],18:[1,12],21:[1,14],23:[1,13],24:[2,3],26:[1,15],27:[1,16],29:[1,17]},{4:68,8:4,9:5,10:[1,10],12:6,14:7,15:8,16:9,17:[1,11],18:[1,12],21:[1,14],23:[1,13],24:[2,5],26:[1,15],27:[1,16],29:[1,17]},{10:[2,26],17:[2,26],18:[2,26],21:[2,26],23:[2,26],24:[2,26],26:[2,26],27:[2,26],29:[2,26]},{5:[2,13],10:[2,13],17:[2,13],18:[2,13],21:[2,13],23:[2,13],24:[2,13],26:[2,13],27:[2,13],29:[2,13]},{10:[2,18]},{20:[2,50],22:[2,50],25:57,28:[2,50],31:70,35:69,36:61,37:[1,58],38:[1,59],39:[1,60],40:[1,62],41:[2,50],42:71,43:64,44:66,45:[1,65],47:[1,30],48:29},{45:[1,72]},{20:[2,40],22:[2,40],28:[2,40],37:[2,40],38:[2,40],39:[2,40],40:[2,40],41:[2,40],45:[2,40],47:[2,40]},{10:[2,20],17:[2,20],18:[2,20],21:[2,20],23:[2,20],24:[2,20],26:[2,20],27:[2,20],29:[2,20]},{10:[2,19],17:[2,19],18:[2,19],21:[2,19],23:[2,19],24:[2,19],26:[2,19],27:[2,19],29:[2,19]},{5:[2,22],10:[2,22],17:[2,22],18:[2,22],21:[2,22],23:[2,22],24:[2,22],26:[2,22],27:[2,22],29:[2,22]},{5:[2,23],10:[2,23],17:[2,23],18:[2,23],21:[2,23],23:[2,23],24:[2,23],26:[2,23],27:[2,23],29:[2,23]},{22:[2,44],32:73,42:74,43:64,44:66,45:[1,75]},{22:[1,76]},{20:[2,29],22:[2,29],28:[2,29],37:[2,29],38:[2,29],39:[2,29],40:[2,29],41:[2,29],45:[2,29],47:[2,29]},{20:[2,30],22:[2,30],28:[2,30],37:[2,30],38:[2,30],39:[2,30],40:[2,30],41:[2,30],45:[2,30],47:[2,30]},{20:[2,31],22:[2,31],28:[2,31],37:[2,31],38:[2,31],39:[2,31],40:[2,31],41:[2,31],45:[2,31],47:[2,31]},{20:[2,32],22:[2,32],28:[2,32],37:[2,32],38:[2,32],39:[2,32],40:[2,32],41:[2,32],45:[2,32],47:[2,32]},{20:[2,33],22:[2,33],28:[2,33],37:[2,33],38:[2,33],39:[2,33],40:[2,33],41:[2,33],45:[2,33],47:[2,33]},{19:77,25:27,36:28,45:[1,31],47:[1,30],48:29},{22:[2,47]},{20:[2,35],22:[2,35],28:[2,35],41:[2,35],44:78,45:[1,75]},{20:[2,43],22:[2,43],28:[2,43],37:[2,43],38:[2,43],39:[2,43],40:[2,43],41:[2,43],45:[2,43],46:[1,79],47:[2,43],49:[2,43]},{20:[2,52],22:[2,52],28:[2,52],41:[2,52],45:[2,52]},{22:[1,80]},{8:19,9:5,10:[1,10],12:6,14:7,15:8,16:9,17:[1,11],18:[1,12],21:[1,14],23:[1,13],24:[2,4],26:[1,15],27:[1,16],29:[1,17]},{20:[2,27],22:[2,27],28:[2,27],41:[2,27]},{20:[2,49],22:[2,49],28:[2,49],37:[2,49],38:[2,49],39:[2,49],40:[2,49],41:[2,49],45:[2,49],47:[2,49]},{20:[2,51],22:[2,51],28:[2,51],41:[2,51]},{20:[2,42],22:[2,42],28:[2,42],37:[2,42],38:[2,42],39:[2,42],40:[2,42],41:[2,42],45:[2,42],47:[2,42],49:[2,42]},{22:[1,81]},{22:[2,45]},{46:[1,79]},{5:[2,25],10:[2,25],17:[2,25],18:[2,25],21:[2,25],23:[2,25],24:[2,25],26:[2,25],27:[2,25],29:[2,25]},{41:[1,82]},{20:[2,53],22:[2,53],28:[2,53],41:[2,53],45:[2,53]},{25:57,31:83,36:61,37:[1,58],38:[1,59],39:[1,60],40:[1,62],45:[1,31],47:[1,30],48:29},{5:[2,21],10:[2,21],17:[2,21],18:[2,21],21:[2,21],23:[2,21],24:[2,21],26:[2,21],27:[2,21],29:[2,21]},{5:[2,24],10:[2,24],17:[2,24],18:[2,24],21:[2,24],23:[2,24],24:[2,24],26:[2,24],27:[2,24],29:[2,24]},{20:[2,34],22:[2,34],28:[2,34],37:[2,34],38:[2,34],39:[2,34],40:[2,34],41:[2,34],45:[2,34],47:[2,34]},{20:[2,36],22:[2,36],28:[2,36],41:[2,36],45:[2,36]}],defaultActions:{3:[2,2],18:[2,1],47:[2,18],63:[2,47],74:[2,45]},parseError:function(a){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("\'"+this.terminals_[s]+"\'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\\n"+this.lexer.showPosition()+"\\nExpecting "+v.join(", ")+", got \'"+(this.terminals_[n]||n)+"\'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"\'"+(this.terminals_[n]||n)+"\'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},d=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\\r\\n?|\\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\\r\\n?|\\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\\r\\n?|\\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;g<f.length&&(c=this._input.match(this.rules[f[g]]),!c||b&&!(c[0].length>b[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\\r\\n?|\\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\\r?\\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 10;break;case 1:return 10;case 2:return this.popState(),10;case 3:return b.yytext=b.yytext.substr(5,b.yyleng-9),this.popState(),11;case 4:return 10;case 5:return e(0,4),this.popState(),17;case 6:return 40;case 7:return 41;case 8:return 18;case 9:return this.popState(),this.begin("raw"),20;case 10:return b.yytext=b.yytext.substr(4,b.yyleng-8),this.popState(),"RAW_BLOCK";case 11:return 29;case 12:return 21;case 13:return 24;case 14:return 23;case 15:return 23;case 16:return 27;case 17:return 26;case 18:this.popState(),this.begin("com");break;case 19:return e(3,5),this.popState(),17;case 20:return 26;case 21:return 46;case 22:return 45;case 23:return 45;case 24:return 49;case 25:break;case 26:return this.popState(),28;case 27:return this.popState(),22;case 28:return b.yytext=e(1,2).replace(/\\\\"/g,\'"\'),37;case 29:return b.yytext=e(1,2).replace(/\\\\\'/g,"\'"),37;case 30:return 47;case 31:return 39;case 32:return 39;case 33:return 38;case 34:return 45;case 35:return b.yytext=e(1,2),45;case 36:return"INVALID";case 37:return 5}},a.rules=[/^(?:[^\\x00]*?(?=(\\{\\{)))/,/^(?:[^\\x00]+)/,/^(?:[^\\x00]{2,}?(?=(\\{\\{|\\\\\\{\\{|\\\\\\\\\\{\\{|$)))/,/^(?:\\{\\{\\{\\{\\/[^\\s!"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=[=}\\s\\/.])\\}\\}\\}\\})/,/^(?:[^\\x00]*?(?=(\\{\\{\\{\\{\\/)))/,/^(?:[\\s\\S]*?--\\}\\})/,/^(?:\\()/,/^(?:\\))/,/^(?:\\{\\{\\{\\{)/,/^(?:\\}\\}\\}\\})/,/^(?:\\{\\{\\{\\{[^\\x00]*\\}\\}\\}\\})/,/^(?:\\{\\{(~)?>)/,/^(?:\\{\\{(~)?#)/,/^(?:\\{\\{(~)?\\/)/,/^(?:\\{\\{(~)?\\^)/,/^(?:\\{\\{(~)?\\s*else\\b)/,/^(?:\\{\\{(~)?\\{)/,/^(?:\\{\\{(~)?&)/,/^(?:\\{\\{!--)/,/^(?:\\{\\{![\\s\\S]*?\\}\\})/,/^(?:\\{\\{(~)?)/,/^(?:=)/,/^(?:\\.\\.)/,/^(?:\\.(?=([=~}\\s\\/.)])))/,/^(?:[\\/.])/,/^(?:\\s+)/,/^(?:\\}(~)?\\}\\})/,/^(?:(~)?\\}\\})/,/^(?:"(\\\\["]|[^"])*")/,/^(?:\'(\\\\[\']|[^\'])*\')/,/^(?:@)/,/^(?:true(?=([~}\\s)])))/,/^(?:false(?=([~}\\s)])))/,/^(?:-?[0-9]+(?:\\.[0-9]+)?(?=([~}\\s)])))/,/^(?:([^\\s!"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=([=~}\\s\\/.)]))))/,/^(?:\\[[^\\]]*\\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[5],inclusive:!1},raw:{rules:[3,4],inclusive:!1},INITIAL:{rules:[0,1,37],inclusive:!0}},a}();return c.lexer=d,b.prototype=c,c.Parser=b,new b}();return a=b}(),i=function(a,b){"use strict";function c(a){return a.constructor===f.ProgramNode?a:(e.yy=f,e.parse(a))}var d={},e=a,f=b;return d.parser=e,d.parse=c,d}(h,g),j=function(a){"use strict";function b(){}function c(a,b,c){if(null==a||"string"!=typeof a&&a.constructor!==c.AST.ProgramNode)throw new f("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0);var d=c.parse(a),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function d(a,b,c){function d(){var d=c.parse(a),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}if(null==a||"string"!=typeof a&&a.constructor!==c.AST.ProgramNode)throw new f("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);b=b||{},"data"in b||(b.data=!0);var e,g=function(a,b){return e||(e=d()),e.call(this,a,b)};return g._setup=function(a){return e||(e=d()),e._setup(a)},g._child=function(a){return e||(e=d()),e._child(a)},g}var e={},f=a;return e.Compiler=b,b.prototype={compiler:b,disassemble:function(){for(var a,b,c,d=this.opcodes,e=[],f=0,g=d.length;g>f;f++)if(a=d[f],"DECLARE"===a.opcode)e.push("DECLARE "+a.name+"="+a.value);else{b=[];for(var h=0;h<a.args.length;h++)c=a.args[h],"string"==typeof c&&(c=\'"\'+c.replace("\\n","\\\\n")+\'"\'),b.push(c);e.push(a.opcode+" "+b.join(" "))}return e.join("\\n")},equals:function(a){var b=this.opcodes.length;if(a.opcodes.length!==b)return!1;for(var c=0;b>c;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||d.args.length!==e.args.length)return!1;for(var f=0;f<d.args.length;f++)if(d.args[f]!==e.args[f])return!1}if(b=this.children.length,a.children.length!==b)return!1;for(c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.opcodes=[],this.children=[],this.depths={list:[]},this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds;var c=this.options.knownHelpers;if(this.options.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)this.options.knownHelpers[d]=c[d];return this.accept(a)},accept:function(a){var b,c=a.strip||{};return c.left&&this.opcode("strip"),b=this[a.type](a),c.right&&this.opcode("strip"),b},program:function(a){for(var b=a.statements,c=0,d=b.length;d>c;c++)this.accept(b[c]);return this.isSimple=1===d,this.depths.list=this.depths.list.sort(function(a,b){return a-b}),this},compileProgram:function(a){var b,c=(new this.compiler).compile(a,this.options),d=this.guid++;this.usePartial=this.usePartial||c.usePartial,this.children[d]=c;for(var e=0,f=c.depths.list.length;f>e;e++)b=c.depths.list[e],2>b||this.addDepth(b-1);return d},block:function(a){var b=a.mustache,c=a.program,d=a.inverse;c&&(c=this.compileProgram(c)),d&&(d=this.compileProgram(d));var e=b.sexpr,f=this.classifySexpr(e);"helper"===f?this.helperSexpr(e,c,d):"simple"===f?(this.simpleSexpr(e),this.opcode("pushProgram",c),this.opcode("pushProgram",d),this.opcode("emptyHash"),this.opcode("blockValue",e.id.original)):(this.ambiguousSexpr(e,c,d),this.opcode("pushProgram",c),this.opcode("pushProgram",d),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},hash:function(a){var b,c,d=a.pairs;for(this.opcode("pushHash"),b=0,c=d.length;c>b;b++)this.pushParam(d[b][1]);for(;b--;)this.opcode("assignToHash",d[b][0]);this.opcode("popHash")},partial:function(a){var b=a.partialName;this.usePartial=!0,a.hash?this.accept(a.hash):this.opcode("push","undefined"),a.context?this.accept(a.context):this.opcode("push","depth0"),this.opcode("invokePartial",b.name),this.opcode("append")\n
},content:function(a){this.opcode("appendContent",a.string)},mustache:function(a){this.sexpr(a.sexpr),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},ambiguousSexpr:function(a,b,c){var d=a.id,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.id;"DATA"===b.type?this.DATA(b):b.parts.length?this.ID(b):(this.addDepth(b.depth),this.opcode("getContext",b.depth),this.opcode("pushContext")),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.id,g=e.parts[0];if(this.options.knownHelpers[g])this.opcode("invokeKnownHelper",d.length,g);else{if(this.options.knownHelpersOnly)throw new f("You specified knownHelpersOnly, but used the unknown helper "+g,a);this.ID(e),this.opcode("invokeHelper",d.length,e.original,a.isRoot)}},sexpr:function(a){var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ID:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0];b?this.opcode("lookupOnContext",a.parts[0]):this.opcode("pushContext");for(var c=1,d=a.parts.length;d>c;c++)this.opcode("lookup",a.parts[c])},DATA:function(a){this.options.data=!0,this.opcode("lookupData",a.id.depth);for(var b=a.id.parts,c=0,d=b.length;d>c;c++)this.opcode("lookup",b[c])},STRING:function(a){this.opcode("pushString",a.string)},NUMBER:function(a){this.opcode("pushLiteral",a.number)},BOOLEAN:function(a){this.opcode("pushLiteral",a.bool)},comment:function(){},opcode:function(a){this.opcodes.push({opcode:a,args:[].slice.call(arguments,1)})},declare:function(a,b){this.opcodes.push({opcode:"DECLARE",name:a,value:b})},addDepth:function(a){0!==a&&(this.depths[a]||(this.depths[a]=!0,this.depths.list.push(a)))},classifySexpr:function(a){var b=a.isHelper,c=a.eligibleHelper,d=this.options;if(c&&!b){var e=a.id.parts[0];d.knownHelpers[e]?b=!0:d.knownHelpersOnly&&(c=!1)}return b?"helper":c?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;c>b;b++)this.pushParam(a[b])},pushParam:function(a){this.stringParams?(a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",a.stringModeValue,a.type),"sexpr"===a.type&&this.sexpr(a)):(this.trackIds&&this.opcode("pushId",a.type,a.idName||a.stringModeValue),this.accept(a))},setupFullMustacheParams:function(a,b,c){var d=a.params;return this.pushParams(d),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.hash(a.hash):this.opcode("emptyHash"),d}},e.precompile=c,e.compile=d,e}(c),k=function(a,b){"use strict";function c(a){this.value=a}function d(){}var e,f=a.COMPILER_REVISION,g=a.REVISION_CHANGES,h=a.log,i=b;d.prototype={nameLookup:function(a,b){var c,e;return 0===a.indexOf("depth")&&(c=!0),e=d.isValidJavaScriptVariableName(b)?a+"."+b:a+"[\'"+b+"\']",c?"("+a+" && "+e+")":e},compilerInfo:function(){var a=f,b=g[a];return[a,b]},appendToBuffer:function(a){return this.environment.isSimple?"return "+a+";":{appendToBuffer:!0,content:a,toString:function(){return"buffer += "+a+";"}}},initializeBuffer:function(){return this.quotedString("")},namespace:"Handlebars",compile:function(a,b,c,d){this.environment=a,this.options=b||{},this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,h("debug",this.environment.disassemble()+"\\n\\n"),this.name=this.environment.name,this.isChild=!!c,this.context=c||{programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.compileChildren(a,b);var e,f,g,j=a.opcodes;for(f=0,g=j.length;g>f;f++)e=j[f],"DECLARE"===e.opcode?this[e.name]=e.value:this[e.opcode].apply(this,e.args),e.opcode!==this.stripNext&&(this.stripNext=!1);if(this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new i("Compile completed with content left on stack");var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k},m=this.context.programs;for(f=0,g=m.length;g>f;f++)m[f]&&(l[f]=m[f]);return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),d||(l.compiler=JSON.stringify(l.compiler),l=this.objectLiteral(l)),l},preamble:function(){this.lastContext=0,this.source=[]},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));for(var d in this.aliases)this.aliases.hasOwnProperty(d)&&(b+=", "+d+"="+this.aliases[d]);for(var e=["depth0","helpers","partials","data"],f=0,g=this.environment.depths.list.length;g>f;f++)e.push("depth"+this.environment.depths.list[f]);var h=this.mergeSource(b);return a?(e.push(h),Function.apply(this,e)):"function("+e.join(",")+") {\\n "+h+"}"},mergeSource:function(a){for(var b,c,d="",e=!this.forceBuffer,f=0,g=this.source.length;g>f;f++){var h=this.source[f];h.appendToBuffer?b=b?b+"\\n + "+h.content:h.content:(b&&(d?d+="buffer += "+b+";\\n ":(c=!0,d=b+";\\n "),b=void 0),d+=h+"\\n ",this.environment.isSimple||(e=!1))}return e?(b||!d)&&(d+="return "+(b||\'""\')+";\\n"):(a+=", buffer = "+(c?"":this.initializeBuffer()),d+=b?"return buffer + "+b+";\\n":"return buffer;\\n"),a&&(d="var "+a.substring(2)+(c?"":";\\n ")+d),d},blockValue:function(a){this.aliases.blockHelperMissing="helpers.blockHelperMissing";var b=["depth0"];this.setupParams(a,0,b),this.replaceStack(function(a){return b.splice(1,0,a),"blockHelperMissing.call("+b.join(", ")+")"})},ambiguousBlockValue:function(){this.aliases.blockHelperMissing="helpers.blockHelperMissing";var a=["depth0"];this.setupParams("",0,a,!0),this.flushInline();var b=this.topStack();a.splice(1,0,b),this.pushSource("if (!"+this.lastHelper+") { "+b+" = blockHelperMissing.call("+a.join(", ")+"); }")},appendContent:function(a){this.pendingContent&&(a=this.pendingContent+a),this.stripNext&&(a=a.replace(/^\\s+/,"")),this.pendingContent=a},strip:function(){this.pendingContent&&(this.pendingContent=this.pendingContent.replace(/\\s+$/,"")),this.stripNext="strip"},append:function(){this.flushInline();var a=this.popStack();this.pushSource("if("+a+" || "+a+" === 0) { "+this.appendToBuffer(a)+" }"),this.environment.isSimple&&this.pushSource("else { "+this.appendToBuffer("\'\'")+" }")},appendEscaped:function(){this.aliases.escapeExpression="this.escapeExpression",this.pushSource(this.appendToBuffer("escapeExpression("+this.popStack()+")"))},getContext:function(a){this.lastContext!==a&&(this.lastContext=a)},lookupOnContext:function(a){this.push(this.nameLookup("depth"+this.lastContext,a,"context"))},pushContext:function(){this.pushStackLiteral("depth"+this.lastContext)},resolvePossibleLambda:function(){this.aliases.functionType=\'"function"\',this.replaceStack(function(a){return"typeof "+a+" === functionType ? "+a+".apply(depth0) : "+a})},lookup:function(a){this.replaceStack(function(b){return b+" == null || "+b+" === false ? "+b+" : "+this.nameLookup(b,a,"context")})},lookupData:function(a){a?this.pushStackLiteral("this.data(data, "+a+")"):this.pushStackLiteral("data")},pushStringParam:function(a,b){this.pushStackLiteral("depth"+this.lastContext),this.pushString(b),"sexpr"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(){this.pushStackLiteral("{}"),this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}"))},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push("{"+a.ids.join(",")+"}"),this.stringParams&&(this.push("{"+a.contexts.join(",")+"}"),this.push("{"+a.types.join(",")+"}")),this.push("{\\n "+a.values.join(",\\n ")+"\\n }")},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},push:function(a){return this.inlineStack.push(a),a},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},invokeHelper:function(a,b,c){this.aliases.helperMissing="helpers.helperMissing",this.useRegister("helper");var d=this.popStack(),e=this.setupHelper(a,b),f="helper = "+e.name+" || "+d+" || helperMissing";e.paramsInit&&(f+=","+e.paramsInit),this.push("("+f+",helper.call("+e.callParams+"))"),c||this.flushInline()},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(c.name+".call("+c.callParams+")")},invokeAmbiguous:function(a,b){this.aliases.functionType=\'"function"\',this.useRegister("helper"),this.emptyHash();var c=this.setupHelper(0,a,b),d=this.lastHelper=this.nameLookup("helpers",a,"helper"),e=this.nameLookup("depth"+this.lastContext,a,"context");this.push("((helper = "+d+" || "+e+(c.paramsInit?"),("+c.paramsInit:"")+"),(typeof helper === functionType ? helper.call("+c.callParams+") : helper))")},invokePartial:function(a){var b=[this.nameLookup("partials",a,"partial"),"\'"+a+"\'",this.popStack(),this.popStack(),"helpers","partials"];this.options.data&&b.push("data"),this.push("this.invokePartial("+b.join(", ")+")")},assignToHash:function(a){var b,c,d,e=this.popStack();this.trackIds&&(d=this.popStack()),this.stringParams&&(c=this.popStack(),b=this.popStack());var f=this.hash;b&&f.contexts.push("\'"+a+"\': "+b),c&&f.types.push("\'"+a+"\': "+c),d&&f.ids.push("\'"+a+"\': "+d),f.values.push("\'"+a+"\': ("+e+")")},pushId:function(a,b){"ID"===a||"DATA"===a?this.pushString(b):"sexpr"===a?this.pushStackLiteral("true"):this.pushStackLiteral("null")},compiler:d,compileChildren:function(a,b){for(var c,d,e=a.children,f=0,g=e.length;g>f;f++){c=e[f],d=new this.compiler;var h=this.matchExistingProgram(c);null==h?(this.context.programs.push(""),h=this.context.programs.length,c.index=h,c.name="program"+h,this.context.programs[h]=d.compile(c,b,this.context,!this.precompile),this.context.environments[h]=c):(c.index=h,c.name="program"+h)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){if(null==a)return"this.noop";for(var b,c=this.environment.children[a],d=c.depths.list,e=[c.index,"data"],f=0,g=d.length;g>f;f++)b=d[f],e.push("depth"+(b-1));return(0===d.length?"this.program(":"this.programWithDepth(")+e.join(", ")+")"},register:function(a,b){this.useRegister(a),this.pushSource(a+" = "+b+";")},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},pushStackLiteral:function(a){return this.push(new c(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.quotedString(this.pendingContent))),this.pendingContent=void 0),a&&this.source.push(a)},pushStack:function(a){this.flushInline();var b=this.incrStack();return a&&this.pushSource(b+" = "+a+";"),this.compileStack.push(b),b},replaceStack:function(a){var b,d,e,f="",g=this.isInline();if(g){var h=this.popStack(!0);if(h instanceof c)b=h.value,e=!0;else{d=!this.stackSlot;var i=d?this.incrStack():this.topStackName();f="("+this.push(i)+" = "+h+"),",b=this.topStack()}}else b=this.topStack();var j=a.call(this,b);return g?(e||this.popStack(),d&&this.stackSlot--,this.push("("+f+j+")")):(/^stack/.test(b)||(b=this.nextStack()),this.pushSource(b+" = ("+f+j+");")),b},nextStack:function(){return this.pushStack()},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;if(a.length){this.inlineStack=[];for(var b=0,d=a.length;d>b;b++){var e=a[b];e instanceof c?this.compileStack.push(e):this.pushStack(e)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),d=(b?this.inlineStack:this.compileStack).pop();if(!a&&d instanceof c)return d.value;if(!b){if(!this.stackSlot)throw new i("Invalid stack pop");this.stackSlot--}return d},topStack:function(a){var b=this.isInline()?this.inlineStack:this.compileStack,d=b[b.length-1];return!a&&d instanceof c?d.value:d},quotedString:function(a){return\'"\'+a.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,\'\\\\"\').replace(/\\n/g,"\\\\n").replace(/\\r/g,"\\\\r").replace(/\\u2028/g,"\\\\u2028").replace(/\\u2029/g,"\\\\u2029")+\'"\'},objectLiteral:function(a){var b=[];for(var c in a)a.hasOwnProperty(c)&&b.push(this.quotedString(c)+":"+a[c]);return"{"+b.join(",")+"}"},setupHelper:function(a,b,c){var d=[],e=this.setupParams(b,a,d,c),f=this.nameLookup("helpers",b,"helper");return{params:d,paramsInit:e,name:f,callParams:["depth0"].concat(d).join(", ")}},setupOptions:function(a,b,c){var d,e,f,g={},h=[],i=[],j=[];g.name=this.quotedString(a),g.hash=this.popStack(),this.trackIds&&(g.hashIds=this.popStack()),this.stringParams&&(g.hashTypes=this.popStack(),g.hashContexts=this.popStack()),e=this.popStack(),f=this.popStack(),(f||e)&&(f||(f="this.noop"),e||(e="this.noop"),g.fn=f,g.inverse=e);for(var k=b;k--;)d=this.popStack(),c[k]=d,this.trackIds&&(j[k]=this.popStack()),this.stringParams&&(i[k]=this.popStack(),h[k]=this.popStack());return this.trackIds&&(g.ids="["+j.join(",")+"]"),this.stringParams&&(g.types="["+i.join(",")+"]",g.contexts="["+h.join(",")+"]"),this.options.data&&(g.data="data"),g},setupParams:function(a,b,c,d){var e=this.objectLiteral(this.setupOptions(a,b,c));return d?(this.useRegister("options"),c.push("options"),"options="+e):(c.push(e),"")}};for(var j="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield".split(" "),k=d.RESERVED_WORDS={},l=0,m=j.length;m>l;l++)k[j[l]]=!0;return d.isValidJavaScriptVariableName=function(a){return!d.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},e=d}(d,c),l=function(a,b,c,d,e){"use strict";var f,g=a,h=b,i=c.parser,j=c.parse,k=d.Compiler,l=d.compile,m=d.precompile,n=e,o=g.create,p=function(){var a=o();return a.compile=function(b,c){return l(b,c,a)},a.precompile=function(b,c){return m(b,c,a)},a.AST=h,a.Compiler=k,a.JavaScriptCompiler=n,a.Parser=i,a.parse=j,a};return g=p(),g.create=p,f=g}(f,g,i,j,k);return l}();
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>47711</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681769.49</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>handsontable.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/**\n
* Handsontable 0.10.5\n
* Handsontable is a simple jQuery plugin for editable tables with basic copy-paste compatibility with Excel and Google Docs\n
*\n
* Copyright 2012, Marcin Warpechowski\n
* Licensed under the MIT license.\n
* http://handsontable.com/\n
*\n
* Date: Mon Mar 31 2014 14:19:47 GMT+0200 (CEST)\n
*/\n
\n
.handsontable {\n
position: relative;\n
}\n
\n
.handsontable.htAutoColumnSize {\n
visibility: hidden;\n
left: 0;\n
position: absolute;\n
top: 0;\n
}\n
\n
.handsontable table,\n
.handsontable tbody,\n
.handsontable thead,\n
.handsontable td,\n
.handsontable th,\n
.handsontable div {\n
box-sizing: content-box;\n
-webkit-box-sizing: content-box;\n
-moz-box-sizing: content-box;\n
}\n
\n
.handsontable table.htCore {\n
border-collapse: separate;\n
/*it must be separate, otherwise there are offset miscalculations in WebKit: http://stackoverflow.com/questions/2655987/border-collapse-differences-in-ff-and-webkit*/\n
position: relative;\n
/*this actually only changes appearance of user selection - does not make text unselectable\n
-webkit-user-select: none;\n
-khtml-user-select: none;\n
-moz-user-select: none;\n
-o-user-select: none;\n
-ms-user-select: none;\n
/*user-select: none; /*no browser supports unprefixed version*/\n
border-spacing: 0;\n
margin: 0;\n
border-width: 0;\n
table-layout: fixed;\n
width: 0;\n
outline-width: 0;\n
/* reset bootstrap table style. for more info see: https://github.com/warpech/jquery-handsontable/issues/224 */\n
max-width: none;\n
max-height: none;\n
}\n
\n
.handsontable col {\n
width: 50px;\n
}\n
\n
.handsontable col.rowHeader {\n
width: 50px;\n
}\n
\n
.handsontable th,\n
.handsontable td {\n
border-right: 1px solid #CCC;\n
border-bottom: 1px solid #CCC;\n
height: 22px;\n
empty-cells: show;\n
line-height: 21px;\n
padding: 0 4px 0 4px;\n
/* top, bottom padding different than 0 is handled poorly by FF with HTML5 doctype */\n
background-color: #FFF;\n
vertical-align: top;\n
overflow: hidden;\n
outline-width: 0;\n
white-space: pre-line;\n
/* preserve new line character in cell */\n
}\n
\n
.handsontable td.htInvalid {\n
-webkit-transition: background 0.75s ease;\n
transition: background 0.75s ease;\n
background-color: #ff4c42;\n
}\n
\n
.handsontable th:last-child {\n
/*Foundation framework fix*/\n
border-right: 1px solid #CCC;\n
border-bottom: 1px solid #CCC;\n
}\n
\n
.handsontable tr:first-child th.htNoFrame,\n
.handsontable th:first-child.htNoFrame,\n
.handsontable th.htNoFrame {\n
border-left-width: 0;\n
background-color: white;\n
border-color: #FFF;\n
}\n
\n
.handsontable th:first-child,\n
.handsontable td:first-child,\n
.handsontable .htNoFrame + th,\n
.handsontable .htNoFrame + td {\n
border-left: 1px solid #CCC;\n
}\n
\n
.handsontable tr:first-child th,\n
.handsontable tr:first-child td {\n
border-top: 1px solid #CCC;\n
}\n
\n
.handsontable thead tr:last-child th {\n
border-bottom-width: 0;\n
}\n
\n
.handsontable thead tr.lastChild th {\n
border-bottom-width: 0;\n
}\n
\n
.handsontable th {\n
background-color: #EEE;\n
color: #222;\n
text-align: center;\n
font-weight: normal;\n
white-space: nowrap;\n
}\n
\n
.handsontable thead th {\n
padding: 0;\n
}\n
\n
.handsontable th.active {\n
background-color: #CCC;\n
}\n
\n
.handsontable thead th .relative {\n
position: relative;\n
padding: 2px 4px;\n
}\n
\n
/* plugins */\n
\n
.handsontable .manualColumnMover {\n
position: absolute;\n
left: 0;\n
top: 0;\n
background-color: transparent;\n
width: 5px;\n
height: 25px;\n
z-index: 999;\n
cursor: move;\n
}\n
\n
.handsontable th .manualColumnMover:hover,\n
.handsontable th .manualColumnMover.active {\n
background-color: #88F;\n
}\n
\n
.handsontable .manualColumnResizer {\n
position: absolute;\n
top: 0;\n
cursor: col-resize;\n
}\n
\n
.handsontable .manualColumnResizerHandle {\n
background-color: transparent;\n
width: 5px;\n
height: 25px;\n
}\n
\n
.handsontable .manualColumnResizer:hover .manualColumnResizerHandle,\n
.handsontable .manualColumnResizer.active .manualColumnResizerHandle {\n
background-color: #AAB;\n
}\n
\n
.handsontable .manualColumnResizerLine {\n
position: absolute;\n
right: 0;\n
top: 0;\n
background-color: #AAB;\n
display: none;\n
width: 0;\n
border-right: 1px dashed #777;\n
}\n
\n
.handsontable .manualColumnResizer.active .manualColumnResizerLine {\n
display: block;\n
}\n
\n
.handsontable .columnSorting:hover {\n
text-decoration: underline;\n
cursor: pointer;\n
}\n
\n
/* border line */\n
\n
.handsontable .wtBorder {\n
position: absolute;\n
font-size: 0;\n
}\n
\n
.handsontable td.area {\n
background-color: #EEF4FF;\n
}\n
\n
/* fill handle */\n
\n
.handsontable .wtBorder.corner {\n
font-size: 0;\n
cursor: crosshair;\n
}\n
\n
.handsontable .htBorder.htFillBorder {\n
background: red;\n
width: 1px;\n
height: 1px;\n
}\n
\n
.handsontableInput {\n
border: 2px solid #5292F7;\n
outline-width: 0;\n
margin: 0;\n
padding: 1px 4px 0 2px;\n
font-family: Arial, Helvetica, sans-serif;\n
/*repeat from .handsontable (inherit doesn\'t work with IE<8) */\n
line-height: 1.3em;\n
/*repeat from .handsontable (inherit doesn\'t work with IE<8) */\n
font-size: inherit;\n
-webkit-box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.4);\n
box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.4);\n
resize: none;\n
/*below are needed to overwrite stuff added by jQuery UI Bootstrap theme*/\n
display: inline-block;\n
color: #000;\n
border-radius: 0;\n
background-color: #FFF;\n
/*overwrite styles potentionally made by a framework*/\n
}\n
\n
.handsontableInputHolder {\n
position: absolute;\n
top: 0;\n
left: 0;\n
z-index: 100;\n
}\n
\n
.htSelectEditor {\n
-webkit-appearance: menulist-button !important;\n
position: absolute;\n
}\n
\n
/*\n
TextRenderer readOnly cell\n
*/\n
\n
.handsontable .htDimmed {\n
color: #777;\n
}\n
\n
/*\n
TextRenderer placeholder value\n
*/\n
\n
.handsontable .htPlaceholder {\n
color: #999;\n
}\n
\n
/*\n
AutocompleteRenderer down arrow\n
*/\n
\n
.handsontable .htAutocompleteArrow {\n
float: right;\n
font-size: 10px;\n
color: #EEE;\n
cursor: default;\n
width: 16px;\n
text-align: center;\n
}\n
\n
.handsontable td .htAutocompleteArrow:hover {\n
color: #777;\n
}\n
\n
/*\n
CheckboxRenderer\n
*/\n
\n
.handsontable .htCheckboxRendererInput.noValue {\n
opacity: 0.5;\n
}\n
\n
/*\n
NumericRenderer\n
*/\n
\n
.handsontable .htNumeric {\n
text-align: right;\n
}\n
\n
/*context menu rules*/\n
\n
ul.context-menu-list {\n
color: black;\n
}\n
\n
ul.context-menu-list li {\n
margin-bottom: 0;\n
/*Foundation framework fix*/\n
}\n
\n
/**\n
* dragdealer\n
*/\n
\n
.handsontable .dragdealer {\n
position: relative;\n
width: 9px;\n
height: 9px;\n
background: #F8F8F8;\n
border: 1px solid #DDD;\n
}\n
\n
.handsontable .dragdealer .handle {\n
position: absolute;\n
width: 9px;\n
height: 9px;\n
background: #C5C5C5;\n
}\n
\n
.handsontable .dragdealer .disabled {\n
background: #898989;\n
}\n
\n
/**\n
* Handsontable in Handsontable\n
*/\n
\n
.handsontable .handsontable .wtHider {\n
padding: 0 0 5px 0;\n
}\n
\n
.handsontable .handsontable table {\n
-webkit-box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.4);\n
box-shadow: 1px 2px 5px rgba(0, 0, 0, 0.4);\n
}\n
\n
/**\n
* Handsontable listbox theme\n
*/\n
\n
.handsontable.listbox {\n
margin: 0;\n
}\n
\n
.handsontable.listbox table {\n
border: 1px solid #ccc;\n
border-collapse: separate;\n
background: white;\n
}\n
\n
.handsontable.listbox th,\n
.handsontable.listbox tr:first-child th,\n
.handsontable.listbox tr:last-child th,\n
.handsontable.listbox tr:first-child td,\n
.handsontable.listbox td {\n
border-width: 0;\n
}\n
\n
.handsontable.listbox th,\n
.handsontable.listbox td {\n
white-space: nowrap;\n
text-overflow: ellipsis;\n
}\n
\n
.handsontable.listbox td.htDimmed {\n
cursor: default;\n
color: inherit;\n
font-style: inherit;\n
}\n
\n
.handsontable.listbox .wtBorder {\n
visibility: hidden;\n
}\n
\n
.handsontable.listbox tr td.current,\n
.handsontable.listbox tr:hover td {\n
background: #eee;\n
}\n
\n
.htContextMenu {\n
display: none;\n
position: absolute;\n
}\n
\n
.htContextMenu table.htCore {\n
outline: 1px solid #bbb;\n
}\n
\n
.htContextMenu .wtBorder {\n
visibility: hidden;\n
}\n
\n
.htContextMenu table tbody tr td {\n
background: white;\n
border-width: 0;\n
padding: 4px 6px 0px 6px;\n
cursor: pointer;\n
overflow: hidden;\n
white-space: nowrap;\n
text-overflow: ellipsis;\n
}\n
\n
.htContextMenu table tbody tr td:first-child {\n
border: 0;\n
}\n
\n
.htContextMenu table tbody tr td.htDimmed{\n
font-style: normal;\n
color: #323232;\n
}\n
\n
.htContextMenu table tbody tr td.current{\n
background: rgb(233, 233, 233);\n
}\n
\n
.htContextMenu table tbody tr td.htSeparator {\n
border-top: 1px solid #bbb;\n
height: 0;\n
padding: 0;\n
}\n
\n
.htContextMenu table tbody tr td.htDisabled {\n
color: #999;\n
}\n
\n
.htContextMenu table tbody tr td.htDisabled:hover {\n
background: white;\n
color: #999;\n
cursor: default;\n
}\n
\n
.handsontable td.htSearchResult {\n
background: #fcedd9;\n
color: #583707;\n
}\n
\n
/*WalkontableDebugOverlay*/\n
\n
.wtDebugHidden {\n
display: none;\n
}\n
\n
.wtDebugVisible {\n
display: block;\n
-webkit-animation-duration: 0.5s;\n
-webkit-animation-name: wtFadeInFromNone;\n
animation-duration: 0.5s;\n
animation-name: wtFadeInFromNone;\n
}\n
\n
@keyframes wtFadeInFromNone {\n
0% {\n
display: none;\n
opacity: 0;\n
}\n
\n
1% {\n
display: block;\n
opacity: 0;\n
}\n
\n
100% {\n
display: block;\n
opacity: 1;\n
}\n
}\n
\n
@-webkit-keyframes wtFadeInFromNone {\n
0% {\n
display: none;\n
opacity: 0;\n
}\n
\n
1% {\n
display: block;\n
opacity: 0;\n
}\n
\n
100% {\n
display: block;\n
opacity: 1;\n
}\n
}
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>8975</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>images</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681767.01</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ajax-loader.gif</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/gif</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">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
cp529CLVyZCqPo7WiAAAOw==</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>7825</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681767.14</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>animated-overlay.gif</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/gif</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">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
JvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1738</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681767.26</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-bg_flat_0_aaaaaa_40x100.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAe0lEQVRoge3OMQHAIBAAMcC/kjdZ
JHTI0A4XBdkz86wfO18H3hRUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFV
UBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUBVVBVVAVVAVVQVVQFVQFVUFVUBVUF8O8A8WdY6opAAAA
AElFTkSuQmCC</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>180</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681767.47</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-bg_flat_75_ffffff_40x100.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAACgAAABkCAYAAAD0ZHJ6AAAAeUlEQVRoge3OMQHAIBAAsVL/nh8J
DDfAkCjImpn5HvbfDpwIVoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJ
VoKVYCVYCVaClWAlWAlWgpVgJVgJVoKVYCVYCVaClWAlWAlWgpVgJVgJVhtqiwTEKTLXTgAAAABJ
RU5ErkJggg==</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>178</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681767.6</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-bg_glass_55_fbf9ee_1x400.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAP0lEQVQ4je3PMQrAMABC0a/3v2zX
0mCXNkOgc6C4PARd5DqPGKCU8luS8SbAQhiCQRgJE56kZTfbbP9RSvnkBsWcEAZRWcgqAAAAAElF
TkSuQmCC</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>120</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681767.69</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-bg_glass_65_ffffff_1x400.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAMElEQVQ4je3LIQ4AIBTD0O3f/8wr
FgmKhMy8pKJKwkhSKeVbbGuAPU9f4PIopTxgAeS0DRtI4yK0AAAAAElFTkSuQmCC</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>105</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681767.8</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-bg_glass_75_dadada_1x400.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANklEQVQ4jWN48uTJfyYGBgaGUWKU
GCWGLfHt2zcoi5GREYNgYmJCZiG42IiB98woMUqMEtgIAMdjCdyg+eEBAAAAAElFTkSuQmCC</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>111</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681767.94</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-bg_glass_75_e6e6e6_1x400.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAANUlEQVQ4je3LMQoAIBADwb38/6t5
wFXaWAiCtUiaYZvF9hBACOFbuntVVe11B0CSjjeE8BwThQIJ8dhEl0YAAAAASUVORK5CYII=</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>110</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681768.09</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-bg_glass_95_fef1ec_1x400.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQCAYAAABvWArbAAAAPklEQVQ4je3PMQqAMABD0Z/c/7aC
IAXjJIhD10LJ8vgZw30eMUApZV/GhZNgSTjoLYElY/hNMJ/S6gullCkPiCIPCr4NiEwAAAAASUVO
RK5CYII=</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>119</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681768.2</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-bg_highlight-soft_75_cccccc_1x100.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAAEAAABkCAYAAABHLFpgAAAALElEQVQYlWN49OjRfyYGBgaGIUT8
//8fSqBx0Yh///4RL8vAwAAVQ2MNOwIAl6g6KkOJwk8AAAAASUVORK5CYII=</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>101</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681768.3</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-icons_222222_256x240.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEUiIiIiIiIiIiIiIiIiIiIi
IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi
IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi
IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi
IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiJdmhHzAAAA
TnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWN
qa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp
7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxa
hZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7P
oCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhys
IPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8P
EANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ
2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSP
GvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqw
HaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/k
NR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTz
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</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4369</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681768.41</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-icons_2e83ff_256x240.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEUug/8ug/8ug/8ug/8ug/8u
g/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8u
g/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8u
g/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8u
g/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8ug/8lgcyYAAAA
TnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWN
qa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp
7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxa
hZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7P
oCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhys
IPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8P
EANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ
2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSP
GvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqw
HaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/k
NR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTz
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</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4369</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681768.5</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-icons_454545_256x240.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEVFRUVFRUVFRUVFRUVFRUVF
RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVF
RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVF
RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVF
RUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUVFRUWG2rLCAAAA
TnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWN
qa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp
7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxa
hZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7P
oCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhys
IPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8P
EANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ
2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSP
GvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqw
HaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/k
NR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTz
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</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4369</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681768.62</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-icons_888888_256x240.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEWIiIiIiIiIiIiIiIiIiIiI
iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI
iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI
iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiI
iIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIighcp7AAAA
TnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWN
qa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp
7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxa
hZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7P
oCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhys
IPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8P
EANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ
2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSP
GvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqw
HaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/k
NR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTz
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</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4369</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681768.71</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>ui-icons_cd0a0a_256x240.png</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/png</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAAA7VBMVEXNCgrNCgrNCgrNCgrNCgrN
CgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrN
CgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrN
CgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrN
CgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrNCgrqN5j8AAAA
TnRSTlMAGBAyBAhQv4OZLiJUcEBmYBoSzQwgPBZCSEoeWiYwUiyFNIeBw2rJz8c4RBy9uXyrtaWN
qa2zKP2fJO8KBgKPo2KVoa9s351GPm5+kWho0kj9AAAPhUlEQVR4nO1djWLbthEGyUiq5YSSLXtp
7FpLOmfzkmxr126tmi2p03RJ1/Xe/3EGgARxPyAgRbIk2/hkSz4CJO4+HsE7AJSVysjI2AMUUOxa
hZ2iANhzBtZWr4BoIRSYAVN5u4QwDwQDRbcwfUi5KS3wFuDmFnQLa4Dtb//cqktwD5QEFFwfUs7P
oCCA7y4bEJVFizcIob8KmhAplwwqVjt+9FBl3uINQniwEiryEyw9JHqGpQdEFNi+B4QQ7QOiHhys
IPoAxUqxvdvvA9K42bsAv4S2fxfYOe57IJSRkZGRkZGxx7jxSHDHcRBXQMTyIjInBgHwBJ/bEx8P
EANC+uhbpSSggCBAVODVabpI1S/k4WLZpTn6NpMhoX9Y40hxYERFpMcqUs4AloCtDQdID1YhnyXZ
2hLjAYWiO9Dy1PDB7tPhIqLx+uMB8grZaR+Qxl2/C2RkZGRkZGRk7A7rBf7J0DR5/LUTjzUPIPSP
GvQJiVJiB7kcQCiUOJrcFNtDZIf2xarQ3aGvLNxAVIFAabz90BFiBIlycTBhgWwOWCH0FLYHlPqw
HaCvcIn2ZbosCevfPTRiFFcgvHukCjWwrc3GrGh1fsAof8EaUReKXkCB4/MzFNo97qLpFiKFYv/k
NR5YQxQbQEofkZ2OuEOHqqT6gFTpru8CN7x/+jaZkZGRkZGRcV+x/rLUNcMMqUAscgnFocmpqkTz
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</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4369</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681769.75</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>jquery-ui.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*! jQuery UI - v1.11.0-beta.1 - 2014-04-24\n
* http://jqueryui.com\n
* Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css\n
* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */\n
\n
/* Layout helpers\n
----------------------------------*/\n
.ui-helper-hidden {\n
\tdisplay: none;\n
}\n
.ui-helper-hidden-accessible {\n
\tborder: 0;\n
\tclip: rect(0 0 0 0);\n
\theight: 1px;\n
\tmargin: -1px;\n
\toverflow: hidden;\n
\tpadding: 0;\n
\tposition: absolute;\n
\twidth: 1px;\n
}\n
.ui-helper-reset {\n
\tmargin: 0;\n
\tpadding: 0;\n
\tborder: 0;\n
\toutline: 0;\n
\tline-height: 1.3;\n
\ttext-decoration: none;\n
\tfont-size: 100%;\n
\tlist-style: none;\n
}\n
.ui-helper-clearfix:before,\n
.ui-helper-clearfix:after {\n
\tcontent: "";\n
\tdisplay: table;\n
\tborder-collapse: collapse;\n
}\n
.ui-helper-clearfix:after {\n
\tclear: both;\n
}\n
.ui-helper-clearfix {\n
\tmin-height: 0; /* support: IE7 */\n
}\n
.ui-helper-zfix {\n
\twidth: 100%;\n
\theight: 100%;\n
\ttop: 0;\n
\tleft: 0;\n
\tposition: absolute;\n
\topacity: 0;\n
\tfilter:Alpha(Opacity=0);\n
}\n
\n
.ui-front {\n
\tz-index: 100;\n
}\n
\n
\n
/* Interaction Cues\n
----------------------------------*/\n
.ui-state-disabled {\n
\tcursor: default !important;\n
}\n
\n
\n
/* Icons\n
----------------------------------*/\n
\n
/* states and images */\n
.ui-icon {\n
\tdisplay: block;\n
\ttext-indent: -99999px;\n
\toverflow: hidden;\n
\tbackground-repeat: no-repeat;\n
}\n
\n
\n
/* Misc visuals\n
----------------------------------*/\n
\n
/* Overlays */\n
.ui-widget-overlay {\n
\tposition: fixed;\n
\ttop: 0;\n
\tleft: 0;\n
\twidth: 100%;\n
\theight: 100%;\n
}\n
.ui-accordion .ui-accordion-header {\n
\tdisplay: block;\n
\tcursor: pointer;\n
\tposition: relative;\n
\tmargin: 2px 0 0 0;\n
\tpadding: .5em .5em .5em .7em;\n
\tmin-height: 0; /* support: IE7 */\n
\tfont-size: 100%;\n
}\n
.ui-accordion .ui-accordion-icons {\n
\tpadding-left: 2.2em;\n
}\n
.ui-accordion .ui-accordion-icons .ui-accordion-icons {\n
\tpadding-left: 2.2em;\n
}\n
.ui-accordion .ui-accordion-header .ui-accordion-header-icon {\n
\tposition: absolute;\n
\tleft: .5em;\n
\ttop: 50%;\n
\tmargin-top: -8px;\n
}\n
.ui-accordion .ui-accordion-content {\n
\tpadding: 1em 2.2em;\n
\tborder-top: 0;\n
\toverflow: auto;\n
}\n
.ui-autocomplete {\n
\tposition: absolute;\n
\ttop: 0;\n
\tleft: 0;\n
\tcursor: default;\n
}\n
.ui-button {\n
\tdisplay: inline-block;\n
\tposition: relative;\n
\tpadding: 0;\n
\tline-height: normal;\n
\tmargin-right: .1em;\n
\tcursor: pointer;\n
\tvertical-align: middle;\n
\ttext-align: center;\n
\toverflow: visible; /* removes extra width in IE */\n
}\n
.ui-button,\n
.ui-button:link,\n
.ui-button:visited,\n
.ui-button:hover,\n
.ui-button:active {\n
\ttext-decoration: none;\n
}\n
/* to make room for the icon, a width needs to be set here */\n
.ui-button-icon-only {\n
\twidth: 2.2em;\n
}\n
/* button elements seem to need a little more width */\n
button.ui-button-icon-only {\n
\twidth: 2.4em;\n
}\n
.ui-button-icons-only {\n
\twidth: 3.4em;\n
}\n
button.ui-button-icons-only {\n
\twidth: 3.7em;\n
}\n
\n
/* button text element */\n
.ui-button .ui-button-text {\n
\tdisplay: block;\n
\tline-height: normal;\n
}\n
.ui-button-text-only .ui-button-text {\n
\tpadding: .4em 1em;\n
}\n
.ui-button-icon-only .ui-button-text,\n
.ui-button-icons-only .ui-button-text {\n
\tpadding: .4em;\n
\ttext-indent: -9999999px;\n
}\n
.ui-button-text-icon-primary .ui-button-text,\n
.ui-button-text-icons .ui-button-text {\n
\tpadding: .4em 1em .4em 2.1em;\n
}\n
.ui-button-text-icon-secondary .ui-button-text,\n
.ui-button-text-icons .ui-button-text {\n
\tpadding: .4em 2.1em .4em 1em;\n
}\n
.ui-button-text-icons .ui-button-text {\n
\tpadding-left: 2.1em;\n
\tpadding-right: 2.1em;\n
}\n
/* no icon support for input elements, provide padding by default */\n
input.ui-button {\n
\tpadding: .4em 1em;\n
}\n
\n
/* button icon element(s) */\n
.ui-button-icon-only .ui-icon,\n
.ui-button-text-icon-primary .ui-icon,\n
.ui-button-text-icon-secondary .ui-icon,\n
.ui-button-text-icons .ui-icon,\n
.ui-button-icons-only .ui-icon {\n
\tposition: absolute;\n
\ttop: 50%;\n
\tmargin-top: -8px;\n
}\n
.ui-button-icon-only .ui-icon {\n
\tleft: 50%;\n
\tmargin-left: -8px;\n
}\n
.ui-button-text-icon-primary .ui-button-icon-primary,\n
.ui-button-text-icons .ui-button-icon-primary,\n
.ui-button-icons-only .ui-button-icon-primary {\n
\tleft: .5em;\n
}\n
.ui-button-text-icon-secondary .ui-button-icon-secondary,\n
.ui-button-text-icons .ui-button-icon-secondary,\n
.ui-button-icons-only .ui-button-icon-secondary {\n
\tright: .5em;\n
}\n
\n
/* button sets */\n
.ui-buttonset {\n
\tmargin-right: 7px;\n
}\n
.ui-buttonset .ui-button {\n
\tmargin-left: 0;\n
\tmargin-right: -.3em;\n
}\n
\n
/* workarounds */\n
/* reset extra padding in Firefox, see h5bp.com/l */\n
input.ui-button::-moz-focus-inner,\n
button.ui-button::-moz-focus-inner {\n
\tborder: 0;\n
\tpadding: 0;\n
}\n
.ui-datepicker {\n
\twidth: 17em;\n
\tpadding: .2em .2em 0;\n
\tdisplay: none;\n
}\n
.ui-datepicker .ui-datepicker-header {\n
\tposition: relative;\n
\tpadding: .2em 0;\n
}\n
.ui-datepicker .ui-datepicker-prev,\n
.ui-datepicker .ui-datepicker-next {\n
\tposition: absolute;\n
\ttop: 2px;\n
\twidth: 1.8em;\n
\theight: 1.8em;\n
}\n
.ui-datepicker .ui-datepicker-prev-hover,\n
.ui-datepicker .ui-datepicker-next-hover {\n
\ttop: 1px;\n
}\n
.ui-datepicker .ui-datepicker-prev {\n
\tleft: 2px;\n
}\n
.ui-datepicker .ui-datepicker-next {\n
\tright: 2px;\n
}\n
.ui-datepicker .ui-datepicker-prev-hover {\n
\tleft: 1px;\n
}\n
.ui-datepicker .ui-datepicker-next-hover {\n
\tright: 1px;\n
}\n
.ui-datepicker .ui-datepicker-prev span,\n
.ui-datepicker .ui-datepicker-next span {\n
\tdisplay: block;\n
\tposition: absolute;\n
\tleft: 50%;\n
\tmargin-left: -8px;\n
\ttop: 50%;\n
\tmargin-top: -8px;\n
}\n
.ui-datepicker .ui-datepicker-title {\n
\tmargin: 0 2.3em;\n
\tline-height: 1.8em;\n
\ttext-align: center;\n
}\n
.ui-datepicker .ui-datepicker-title select {\n
\tfont-size: 1em;\n
\tmargin: 1px 0;\n
}\n
.ui-datepicker select.ui-datepicker-month,\n
.ui-datepicker select.ui-datepicker-year {\n
\twidth: 49%;\n
}\n
.ui-datepicker table {\n
\twidth: 100%;\n
\tfont-size: .9em;\n
\tborder-collapse: collapse;\n
\tmargin: 0 0 .4em;\n
}\n
.ui-datepicker th {\n
\tpadding: .7em .3em;\n
\ttext-align: center;\n
\tfont-weight: bold;\n
\tborder: 0;\n
}\n
.ui-datepicker td {\n
\tborder: 0;\n
\tpadding: 1px;\n
}\n
.ui-datepicker td span,\n
.ui-datepicker td a {\n
\tdisplay: block;\n
\tpadding: .2em;\n
\ttext-align: right;\n
\ttext-decoration: none;\n
}\n
.ui-datepicker .ui-datepicker-buttonpane {\n
\tbackground-image: none;\n
\tmargin: .7em 0 0 0;\n
\tpadding: 0 .2em;\n
\tborder-left: 0;\n
\tborder-right: 0;\n
\tborder-bottom: 0;\n
}\n
.ui-datepicker .ui-datepicker-buttonpane button {\n
\tfloat: right;\n
\tmargin: .5em .2em .4em;\n
\tcursor: pointer;\n
\tpadding: .2em .6em .3em .6em;\n
\twidth: auto;\n
\toverflow: visible;\n
}\n
.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {\n
\tfloat: left;\n
}\n
\n
/* with multiple calendars */\n
.ui-datepicker.ui-datepicker-multi {\n
\twidth: auto;\n
}\n
.ui-datepicker-multi .ui-datepicker-group {\n
\tfloat: left;\n
}\n
.ui-datepicker-multi .ui-datepicker-group table {\n
\twidth: 95%;\n
\tmargin: 0 auto .4em;\n
}\n
.ui-datepicker-multi-2 .ui-datepicker-group {\n
\twidth: 50%;\n
}\n
.ui-datepicker-multi-3 .ui-datepicker-group {\n
\twidth: 33.3%;\n
}\n
.ui-datepicker-multi-4 .ui-datepicker-group {\n
\twidth: 25%;\n
}\n
.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,\n
.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {\n
\tborder-left-width: 0;\n
}\n
.ui-datepicker-multi .ui-datepicker-buttonpane {\n
\tclear: left;\n
}\n
.ui-datepicker-row-break {\n
\tclear: both;\n
\twidth: 100%;\n
\tfont-size: 0;\n
}\n
\n
/* RTL support */\n
.ui-datepicker-rtl {\n
\tdirection: rtl;\n
}\n
.ui-datepicker-rtl .ui-datepicker-prev {\n
\tright: 2px;\n
\tleft: auto;\n
}\n
.ui-datepicker-rtl .ui-datepicker-next {\n
\tleft: 2px;\n
\tright: auto;\n
}\n
.ui-datepicker-rtl .ui-datepicker-prev:hover {\n
\tright: 1px;\n
\tleft: auto;\n
}\n
.ui-datepicker-rtl .ui-datepicker-next:hover {\n
\tleft: 1px;\n
\tright: auto;\n
}\n
.ui-datepicker-rtl .ui-datepicker-buttonpane {\n
\tclear: right;\n
}\n
.ui-datepicker-rtl .ui-datepicker-buttonpane button {\n
\tfloat: left;\n
}\n
.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,\n
.ui-datepicker-rtl .ui-datepicker-group {\n
\tfloat: right;\n
}\n
.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,\n
.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {\n
\tborder-right-width: 0;\n
\tborder-left-width: 1px;\n
}\n
.ui-dialog {\n
\toverflow: hidden;\n
\tposition: absolute;\n
\ttop: 0;\n
\tleft: 0;\n
\tpadding: .2em;\n
\toutline: 0;\n
}\n
.ui-dialog .ui-dialog-titlebar {\n
\tpadding: .4em 1em;\n
\tposition: relative;\n
}\n
.ui-dialog .ui-dialog-title {\n
\tfloat: left;\n
\tmargin: .1em 0;\n
\twhite-space: nowrap;\n
\twidth: 90%;\n
\toverflow: hidden;\n
\ttext-overflow: ellipsis;\n
}\n
.ui-dialog .ui-dialog-titlebar-close {\n
\tposition: absolute;\n
\tright: .3em;\n
\ttop: 50%;\n
\twidth: 20px;\n
\tmargin: -10px 0 0 0;\n
\tpadding: 1px;\n
\theight: 20px;\n
}\n
.ui-dialog .ui-dialog-content {\n
\tposition: relative;\n
\tborder: 0;\n
\tpadding: .5em 1em;\n
\tbackground: none;\n
\toverflow: auto;\n
}\n
.ui-dialog .ui-dialog-buttonpane {\n
\ttext-align: left;\n
\tborder-width: 1px 0 0 0;\n
\tbackground-image: none;\n
\tmargin-top: .5em;\n
\tpadding: .3em 1em .5em .4em;\n
}\n
.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {\n
\tfloat: right;\n
}\n
.ui-dialog .ui-dialog-buttonpane button {\n
\tmargin: .5em .4em .5em 0;\n
\tcursor: pointer;\n
}\n
.ui-dialog .ui-resizable-se {\n
\twidth: 12px;\n
\theight: 12px;\n
\tright: -5px;\n
\tbottom: -5px;\n
\tbackground-position: 16px 16px;\n
}\n
.ui-draggable .ui-dialog-titlebar {\n
\tcursor: move;\n
}\n
.ui-draggable-handle {\n
\t-ms-touch-action: none;\n
\ttouch-action: none;\n
}\n
.ui-menu {\n
\tlist-style: none;\n
\tpadding: 0;\n
\tmargin: 0;\n
\tdisplay: block;\n
\toutline: none;\n
}\n
.ui-menu .ui-menu {\n
\tposition: absolute;\n
}\n
.ui-menu .ui-menu-item {\n
\tmargin: 0;\n
\tdisplay: block;\n
\tpadding: 3px .4em;\n
\tcursor: pointer;\n
\tmin-height: 0; /* support: IE7 */\n
\t/* support: IE10, see #8844 */\n
\tlist-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");\n
}\n
.ui-menu .ui-menu-divider {\n
\tmargin: 5px 0;\n
\theight: 0;\n
\tfont-size: 0;\n
\tline-height: 0;\n
\tborder-width: 1px 0 0 0;\n
}\n
.ui-menu .ui-state-focus,\n
.ui-menu .ui-state-active {\n
\tmargin: -1px;\n
}\n
\n
/* icon support */\n
.ui-menu-icons {\n
\tposition: relative;\n
}\n
.ui-menu-icons .ui-menu-item {\n
\tposition: relative;\n
\tpadding-left: 2em;\n
}\n
\n
/* left-aligned */\n
.ui-menu .ui-icon {\n
\tposition: absolute;\n
\ttop: .2em;\n
\tleft: .2em;\n
}\n
\n
/* right-aligned */\n
.ui-menu .ui-menu-icon {\n
\tposition: relative;\n
\ttop: -.2em;\n
\tfloat: right;\n
}\n
.ui-progressbar {\n
\theight: 2em;\n
\ttext-align: left;\n
\toverflow: hidden;\n
}\n
.ui-progressbar .ui-progressbar-value {\n
\tmargin: -1px;\n
\theight: 100%;\n
}\n
.ui-progressbar .ui-progressbar-overlay {\n
\tbackground: url("images/animated-overlay.gif");\n
\theight: 100%;\n
\tfilter: alpha(opacity=25);\n
\topacity: 0.25;\n
}\n
.ui-progressbar-indeterminate .ui-progressbar-value {\n
\tbackground-image: none;\n
}\n
.ui-resizable {\n
\tposition: relative;\n
}\n
.ui-resizable-handle {\n
\tposition: absolute;\n
\tfont-size: 0.1px;\n
\tdisplay: block;\n
\t-ms-touch-action: none;\n
\ttouch-action: none;\n
}\n
.ui-resizable-disabled .ui-resizable-handle,\n
.ui-resizable-autohide .ui-resizable-handle {\n
\tdisplay: none;\n
}\n
.ui-resizable-n {\n
\tcursor: n-resize;\n
\theight: 7px;\n
\twidth: 100%;\n
\ttop: -5px;\n
\tleft: 0;\n
}\n
.ui-resizable-s {\n
\tcursor: s-resize;\n
\theight: 7px;\n
\twidth: 100%;\n
\tbottom: -5px;\n
\tleft: 0;\n
}\n
.ui-resizable-e {\n
\tcursor: e-resize;\n
\twidth: 7px;\n
\tright: -5px;\n
\ttop: 0;\n
\theight: 100%;\n
}\n
.ui-resizable-w {\n
\tcursor: w-resize;\n
\twidth: 7px;\n
\tleft: -5px;\n
\ttop: 0;\n
\theight: 100%;\n
}\n
.ui-resizable-se {\n
\tcursor: se-resize;\n
\twidth: 12px;\n
\theight: 12px;\n
\tright: 1px;\n
\tbottom: 1px;\n
}\n
.ui-resizable-sw {\n
\tcursor: sw-resize;\n
\twidth: 9px;\n
\theight: 9px;\n
\tleft: -5px;\n
\tbottom: -5px;\n
}\n
.ui-resizable-nw {\n
\tcursor: nw-resize;\n
\twidth: 9px;\n
\theight: 9px;\n
\tleft: -5px;\n
\ttop: -5px;\n
}\n
.ui-resizable-ne {\n
\tcursor: ne-resize;\n
\twidth: 9px;\n
\theight: 9px;\n
\tright: -5px;\n
\ttop: -5px;\n
}\n
.ui-selectable {\n
\t-ms-touch-action: none;\n
\ttouch-action: none;\n
}\n
.ui-selectable-helper {\n
\tposition: absolute;\n
\tz-index: 100;\n
\tborder: 1px dotted black;\n
}\n
.ui-slider {\n
\tposition: relative;\n
\ttext-align: left;\n
}\n
.ui-slider .ui-slider-handle {\n
\tposition: absolute;\n
\tz-index: 2;\n
\twidth: 1.2em;\n
\theight: 1.2em;\n
\tcursor: default;\n
\t-ms-touch-action: none;\n
\ttouch-action: none;\n
}\n
.ui-slider .ui-slider-range {\n
\tposition: absolute;\n
\tz-index: 1;\n
\tfont-size: .7em;\n
\tdisplay: block;\n
\tborder: 0;\n
\tbackground-position: 0 0;\n
}\n
\n
/* For IE8 - See #6727 */\n
.ui-slider.ui-state-disabled .ui-slider-handle,\n
.ui-slider.ui-state-disabled .ui-slider-range {\n
\tfilter: inherit;\n
}\n
\n
.ui-slider-horizontal {\n
\theight: .8em;\n
}\n
.ui-slider-horizontal .ui-slider-handle {\n
\ttop: -.3em;\n
\tmargin-left: -.6em;\n
}\n
.ui-slider-horizontal .ui-slider-range {\n
\ttop: 0;\n
\theight: 100%;\n
}\n
.ui-slider-horizontal .ui-slider-range-min {\n
\tleft: 0;\n
}\n
.ui-slider-horizontal .ui-slider-range-max {\n
\tright: 0;\n
}\n
\n
.ui-slider-vertical {\n
\twidth: .8em;\n
\theight: 100px;\n
}\n
.ui-slider-vertical .ui-slider-handle {\n
\tleft: -.3em;\n
\tmargin-left: 0;\n
\tmargin-bottom: -.6em;\n
}\n
.ui-slider-vertical .ui-slider-range {\n
\tleft: 0;\n
\twidth: 100%;\n
}\n
.ui-slider-vertical .ui-slider-range-min {\n
\tbottom: 0;\n
}\n
.ui-slider-vertical .ui-slider-range-max {\n
\ttop: 0;\n
}\n
.ui-sortable-handle {\n
\t-ms-touch-action: none;\n
\ttouch-action: none;\n
}\n
.ui-spinner {\n
\tposition: relative;\n
\tdisplay: inline-block;\n
\toverflow: hidden;\n
\tpadding: 0;\n
\tvertical-align: middle;\n
}\n
.ui-spinner-input {\n
\tborder: none;\n
\tbackground: none;\n
\tcolor: inherit;\n
\tpadding: 0;\n
\tmargin: .2em 0;\n
\tvertical-align: middle;\n
\tmargin-left: .4em;\n
\tmargin-right: 22px;\n
}\n
.ui-spinner-button {\n
\twidth: 16px;\n
\theight: 50%;\n
\tfont-size: .5em;\n
\tpadding: 0;\n
\tmargin: 0;\n
\ttext-align: center;\n
\tposition: absolute;\n
\tcursor: default;\n
\tdisplay: block;\n
\toverflow: hidden;\n
\tright: 0;\n
}\n
/* more specificity required here to override default borders */\n
.ui-spinner a.ui-spinner-button {\n
\tborder-top: none;\n
\tborder-bottom: none;\n
\tborder-right: none;\n
}\n
/* vertically center icon */\n
.ui-spinner .ui-icon {\n
\tposition: absolute;\n
\tmargin-top: -8px;\n
\ttop: 50%;\n
\tleft: 0;\n
}\n
.ui-spinner-up {\n
\ttop: 0;\n
}\n
.ui-spinner-down {\n
\tbottom: 0;\n
}\n
\n
/* TR overrides */\n
.ui-spinner .ui-icon-triangle-1-s {\n
\t/* need to fix icons sprite */\n
\tbackground-position: -65px -16px;\n
}\n
.ui-tabs {\n
\tposition: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */\n
\tpadding: .2em;\n
}\n
.ui-tabs .ui-tabs-nav {\n
\tmargin: 0;\n
\tpadding: .2em .2em 0;\n
}\n
.ui-tabs .ui-tabs-nav li {\n
\tlist-style: none;\n
\tfloat: left;\n
\tposition: relative;\n
\ttop: 0;\n
\tmargin: 1px .2em 0 0;\n
\tborder-bottom-width: 0;\n
\tpadding: 0;\n
\twhite-space: nowrap;\n
}\n
.ui-tabs .ui-tabs-nav .ui-tabs-anchor {\n
\tfloat: left;\n
\tpadding: .5em 1em;\n
\ttext-decoration: none;\n
}\n
.ui-tabs .ui-tabs-nav li.ui-tabs-active {\n
\tmargin-bottom: -1px;\n
\tpadding-bottom: 1px;\n
}\n
.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,\n
.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,\n
.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {\n
\tcursor: text;\n
}\n
.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {\n
\tcursor: pointer;\n
}\n
.ui-tabs .ui-tabs-panel {\n
\tdisplay: block;\n
\tborder-width: 0;\n
\tpadding: 1em 1.4em;\n
\tbackground: none;\n
}\n
.ui-tooltip {\n
\tpadding: 8px;\n
\tposition: absolute;\n
\tz-index: 9999;\n
\tmax-width: 300px;\n
\t-webkit-box-shadow: 0 0 5px #aaa;\n
\tbox-shadow: 0 0 5px #aaa;\n
}\n
body .ui-tooltip {\n
\tborder-width: 2px;\n
}\n
\n
/* Component containers\n
----------------------------------*/\n
.ui-widget {\n
\tfont-family: Verdana,Arial,sans-serif/*{ffDefault}*/;\n
\tfont-size: 1.1em/*{fsDefault}*/;\n
}\n
.ui-widget .ui-widget {\n
\tfont-size: 1em;\n
}\n
.ui-widget input,\n
.ui-widget select,\n
.ui-widget textarea,\n
.ui-widget button {\n
\tfont-family: Verdana,Arial,sans-serif/*{ffDefault}*/;\n
\tfont-size: 1em;\n
}\n
.ui-widget-content {\n
\tborder: 1px solid #aaaaaa/*{borderColorContent}*/;\n
\tbackground: #ffffff/*{bgColorContent}*/ url("images/ui-bg_flat_75_ffffff_40x100.png")/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/;\n
\tcolor: #222222/*{fcContent}*/;\n
}\n
.ui-widget-content a {\n
\tcolor: #222222/*{fcContent}*/;\n
}\n
.ui-widget-header {\n
\tborder: 1px solid #aaaaaa/*{borderColorHeader}*/;\n
\tbackground: #cccccc/*{bgColorHeader}*/ url("images/ui-bg_highlight-soft_75_cccccc_1x100.png")/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/;\n
\tcolor: #222222/*{fcHeader}*/;\n
\tfont-weight: bold;\n
}\n
.ui-widget-header a {\n
\tcolor: #222222/*{fcHeader}*/;\n
}\n
\n
/* Interaction states\n
----------------------------------*/\n
.ui-state-default,\n
.ui-widget-content .ui-state-default,\n
.ui-widget-header .ui-state-default {\n
\tborder: 1px solid #d3d3d3/*{borderColorDefault}*/;\n
\tbackground: #e6e6e6/*{bgColorDefault}*/ url("images/ui-bg_glass_75_e6e6e6_1x400.png")/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/;\n
\tfont-weight: normal/*{fwDefault}*/;\n
\tcolor: #555555/*{fcDefault}*/;\n
}\n
.ui-state-default a,\n
.ui-state-default a:link,\n
.ui-state-default a:visited {\n
\tcolor: #555555/*{fcDefault}*/;\n
\ttext-decoration: none;\n
}\n
.ui-state-hover,\n
.ui-widget-content .ui-state-hover,\n
.ui-widget-header .ui-state-hover,\n
.ui-state-focus,\n
.ui-widget-content .ui-state-focus,\n
.ui-widget-header .ui-state-focus {\n
\tborder: 1px solid #999999/*{borderColorHover}*/;\n
\tbackground: #dadada/*{bgColorHover}*/ url("images/ui-bg_glass_75_dadada_1x400.png")/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/;\n
\tfont-weight: normal/*{fwDefault}*/;\n
\tcolor: #212121/*{fcHover}*/;\n
}\n
.ui-state-hover a,\n
.ui-state-hover a:hover,\n
.ui-state-hover a:link,\n
.ui-state-hover a:visited,\n
.ui-state-focus a,\n
.ui-state-focus a:hover,\n
.ui-state-focus a:link,\n
.ui-state-focus a:visited {\n
\tcolor: #212121/*{fcHover}*/;\n
\ttext-decoration: none;\n
}\n
.ui-state-active,\n
.ui-widget-content .ui-state-active,\n
.ui-widget-header .ui-state-active {\n
\tborder: 1px solid #aaaaaa/*{borderColorActive}*/;\n
\tbackground: #ffffff/*{bgColorActive}*/ url("images/ui-bg_glass_65_ffffff_1x400.png")/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/;\n
\tfont-weight: normal/*{fwDefault}*/;\n
\tcolor: #212121/*{fcActive}*/;\n
}\n
.ui-state-active a,\n
.ui-state-active a:link,\n
.ui-state-active a:visited {\n
\tcolor: #212121/*{fcActive}*/;\n
\ttext-decoration: none;\n
}\n
\n
/* Interaction Cues\n
----------------------------------*/\n
.ui-state-highlight,\n
.ui-widget-content .ui-state-highlight,\n
.ui-widget-header .ui-state-highlight {\n
\tborder: 1px solid #fcefa1/*{borderColorHighlight}*/;\n
\tbackground: #fbf9ee/*{bgColorHighlight}*/ url("images/ui-bg_glass_55_fbf9ee_1x400.png")/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/;\n
\tcolor: #363636/*{fcHighlight}*/;\n
}\n
.ui-state-highlight a,\n
.ui-widget-content .ui-state-highlight a,\n
.ui-widget-header .ui-state-highlight a {\n
\tcolor: #363636/*{fcHighlight}*/;\n
}\n
.ui-state-error,\n
.ui-widget-content .ui-state-error,\n
.ui-widget-header .ui-state-error {\n
\tborder: 1px solid #cd0a0a/*{borderColorError}*/;\n
\tbackground: #fef1ec/*{bgColorError}*/ url("images/ui-bg_glass_95_fef1ec_1x400.png")/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/;\n
\tcolor: #cd0a0a/*{fcError}*/;\n
}\n
.ui-state-error a,\n
.ui-widget-content .ui-state-error a,\n
.ui-widget-header .ui-state-error a {\n
\tcolor: #cd0a0a/*{fcError}*/;\n
}\n
.ui-state-error-text,\n
.ui-widget-content .ui-state-error-text,\n
.ui-widget-header .ui-state-error-text {\n
\tcolor: #cd0a0a/*{fcError}*/;\n
}\n
.ui-priority-primary,\n
.ui-widget-content .ui-priority-primary,\n
.ui-widget-header .ui-priority-primary {\n
\tfont-weight: bold;\n
}\n
.ui-priority-secondary,\n
.ui-widget-content .ui-priority-secondary,\n
.ui-widget-header .ui-priority-secondary {\n
\topacity: .7;\n
\tfilter:Alpha(Opacity=70);\n
\tfont-weight: normal;\n
}\n
.ui-state-disabled,\n
.ui-widget-content .ui-state-disabled,\n
.ui-widget-header .ui-state-disabled {\n
\topacity: .35;\n
\tfilter:Alpha(Opacity=35);\n
\tbackground-image: none;\n
}\n
.ui-state-disabled .ui-icon {\n
\tfilter:Alpha(Opacity=35); /* For IE8 - See #6059 */\n
}\n
\n
/* Icons\n
----------------------------------*/\n
\n
/* states and images */\n
.ui-icon {\n
\twidth: 16px;\n
\theight: 16px;\n
}\n
.ui-icon,\n
.ui-widget-content .ui-icon {\n
\tbackground-image: url("images/ui-icons_222222_256x240.png")/*{iconsContent}*/;\n
}\n
.ui-widget-header .ui-icon {\n
\tbackground-image: url("images/ui-icons_222222_256x240.png")/*{iconsHeader}*/;\n
}\n
.ui-state-default .ui-icon {\n
\tbackground-image: url("images/ui-icons_888888_256x240.png")/*{iconsDefault}*/;\n
}\n
.ui-state-hover .ui-icon,\n
.ui-state-focus .ui-icon {\n
\tbackground-image: url("images/ui-icons_454545_256x240.png")/*{iconsHover}*/;\n
}\n
.ui-state-active .ui-icon {\n
\tbackground-image: url("images/ui-icons_454545_256x240.png")/*{iconsActive}*/;\n
}\n
.ui-state-highlight .ui-icon {\n
\tbackground-image: url("images/ui-icons_2e83ff_256x240.png")/*{iconsHighlight}*/;\n
}\n
.ui-state-error .ui-icon,\n
.ui-state-error-text .ui-icon {\n
\tbackground-image: url("images/ui-icons_cd0a0a_256x240.png")/*{iconsError}*/;\n
}\n
\n
/* positioning */\n
.ui-icon-blank { background-position: 16px 16px; }\n
.ui-icon-carat-1-n { background-position: 0 0; }\n
.ui-icon-carat-1-ne { background-position: -16px 0; }\n
.ui-icon-carat-1-e { background-position: -32px 0; }\n
.ui-icon-carat-1-se { background-position: -48px 0; }\n
.ui-icon-carat-1-s { background-position: -64px 0; }\n
.ui-icon-carat-1-sw { background-position: -80px 0; }\n
.ui-icon-carat-1-w { background-position: -96px 0; }\n
.ui-icon-carat-1-nw { background-position: -112px 0; }\n
.ui-icon-carat-2-n-s { background-position: -128px 0; }\n
.ui-icon-carat-2-e-w { background-position: -144px 0; }\n
.ui-icon-triangle-1-n { background-position: 0 -16px; }\n
.ui-icon-triangle-1-ne { background-position: -16px -16px; }\n
.ui-icon-triangle-1-e { background-position: -32px -16px; }\n
.ui-icon-triangle-1-se { background-position: -48px -16px; }\n
.ui-icon-triangle-1-s { background-position: -64px -16px; }\n
.ui-icon-triangle-1-sw { background-position: -80px -16px; }\n
.ui-icon-triangle-1-w { background-position: -96px -16px; }\n
.ui-icon-triangle-1-nw { background-position: -112px -16px; }\n
.ui-icon-triangle-2-n-s { background-position: -128px -16px; }\n
.ui-icon-triangle-2-e-w { background-position: -144px -16px; }\n
.ui-icon-arrow-1-n { background-position: 0 -32px; }\n
.ui-icon-arrow-1-ne { background-position: -16px -32px; }\n
.ui-icon-arrow-1-e { background-position: -32px -32px; }\n
.ui-icon-arrow-1-se { background-position: -48px -32px; }\n
.ui-icon-arrow-1-s { background-position: -64px -32px; }\n
.ui-icon-arrow-1-sw { background-position: -80px -32px; }\n
.ui-icon-arrow-1-w { background-position: -96px -32px; }\n
.ui-icon-arrow-1-nw { background-position: -112px -32px; }\n
.ui-icon-arrow-2-n-s { background-position: -128px -32px; }\n
.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }\n
.ui-icon-arrow-2-e-w { background-position: -160px -32px; }\n
.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }\n
.ui-icon-arrowstop-1-n { background-position: -192px -32px; }\n
.ui-icon-arrowstop-1-e { background-position: -208px -32px; }\n
.ui-icon-arrowstop-1-s { background-position: -224px -32px; }\n
.ui-icon-arrowstop-1-w { background-position: -240px -32px; }\n
.ui-icon-arrowthick-1-n { background-position: 0 -48px; }\n
.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }\n
.ui-icon-arrowthick-1-e { background-position: -32px -48px; }\n
.ui-icon-arrowthick-1-se { background-position: -48px -48px; }\n
.ui-icon-arrowthick-1-s { background-position: -64px -48px; }\n
.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }\n
.ui-icon-arrowthick-1-w { background-position: -96px -48px; }\n
.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }\n
.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }\n
.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }\n
.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }\n
.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }\n
.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }\n
.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }\n
.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }\n
.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }\n
.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }\n
.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }\n
.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }\n
.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }\n
.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }\n
.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }\n
.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }\n
.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }\n
.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }\n
.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }\n
.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }\n
.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }\n
.ui-icon-arrow-4 { background-position: 0 -80px; }\n
.ui-icon-arrow-4-diag { background-position: -16px -80px; }\n
.ui-icon-extlink { background-position: -32px -80px; }\n
.ui-icon-newwin { background-position: -48px -80px; }\n
.ui-icon-refresh { background-position: -64px -80px; }\n
.ui-icon-shuffle { background-position: -80px -80px; }\n
.ui-icon-transfer-e-w { background-position: -96px -80px; }\n
.ui-icon-transferthick-e-w { background-position: -112px -80px; }\n
.ui-icon-folder-collapsed { background-position: 0 -96px; }\n
.ui-icon-folder-open { background-position: -16px -96px; }\n
.ui-icon-document { background-position: -32px -96px; }\n
.ui-icon-document-b { background-position: -48px -96px; }\n
.ui-icon-note { background-position: -64px -96px; }\n
.ui-icon-mail-closed { background-position: -80px -96px; }\n
.ui-icon-mail-open { background-position: -96px -96px; }\n
.ui-icon-suitcase { background-position: -112px -96px; }\n
.ui-icon-comment { background-position: -128px -96px; }\n
.ui-icon-person { background-position: -144px -96px; }\n
.ui-icon-print { background-position: -160px -96px; }\n
.ui-icon-trash { background-position: -176px -96px; }\n
.ui-icon-locked { background-position: -192px -96px; }\n
.ui-icon-unlocked { background-position: -208px -96px; }\n
.ui-icon-bookmark { background-position: -224px -96px; }\n
.ui-icon-tag { background-position: -240px -96px; }\n
.ui-icon-home { background-position: 0 -112px; }\n
.ui-icon-flag { background-position: -16px -112px; }\n
.ui-icon-calendar { background-position: -32px -112px; }\n
.ui-icon-cart { background-position: -48px -112px; }\n
.ui-icon-pencil { background-position: -64px -112px; }\n
.ui-icon-clock { background-position: -80px -112px; }\n
.ui-icon-disk { background-position: -96px -112px; }\n
.ui-icon-calculator { background-position: -112px -112px; }\n
.ui-icon-zoomin { background-position: -128px -112px; }\n
.ui-icon-zoomout { background-position: -144px -112px; }\n
.ui-icon-search { background-position: -160px -112px; }\n
.ui-icon-wrench { background-position: -176px -112px; }\n
.ui-icon-gear { background-position: -192px -112px; }\n
.ui-icon-heart { background-position: -208px -112px; }\n
.ui-icon-star { background-position: -224px -112px; }\n
.ui-icon-link { background-position: -240px -112px; }\n
.ui-icon-cancel { background-position: 0 -128px; }\n
.ui-icon-plus { background-position: -16px -128px; }\n
.ui-icon-plusthick { background-position: -32px -128px; }\n
.ui-icon-minus { background-position: -48px -128px; }\n
.ui-icon-minusthick { background-position: -64px -128px; }\n
.ui-icon-close { background-position: -80px -128px; }\n
.ui-icon-closethick { background-position: -96px -128px; }\n
.ui-icon-key { background-position: -112px -128px; }\n
.ui-icon-lightbulb { background-position: -128px -128px; }\n
.ui-icon-scissors { background-position: -144px -128px; }\n
.ui-icon-clipboard { background-position: -160px -128px; }\n
.ui-icon-copy { background-position: -176px -128px; }\n
.ui-icon-contact { background-position: -192px -128px; }\n
.ui-icon-image { background-position: -208px -128px; }\n
.ui-icon-video { background-position: -224px -128px; }\n
.ui-icon-script { background-position: -240px -128px; }\n
.ui-icon-alert { background-position: 0 -144px; }\n
.ui-icon-info { background-position: -16px -144px; }\n
.ui-icon-notice { background-position: -32px -144px; }\n
.ui-icon-help { background-position: -48px -144px; }\n
.ui-icon-check { background-position: -64px -144px; }\n
.ui-icon-bullet { background-position: -80px -144px; }\n
.ui-icon-radio-on { background-position: -96px -144px; }\n
.ui-icon-radio-off { background-position: -112px -144px; }\n
.ui-icon-pin-w { background-position: -128px -144px; }\n
.ui-icon-pin-s { background-position: -144px -144px; }\n
.ui-icon-play { background-position: 0 -160px; }\n
.ui-icon-pause { background-position: -16px -160px; }\n
.ui-icon-seek-next { background-position: -32px -160px; }\n
.ui-icon-seek-prev { background-position: -48px -160px; }\n
.ui-icon-seek-end { background-position: -64px -160px; }\n
.ui-icon-seek-start { background-position: -80px -160px; }\n
/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */\n
.ui-icon-seek-first { background-position: -80px -160px; }\n
.ui-icon-stop { background-position: -96px -160px; }\n
.ui-icon-eject { background-position: -112px -160px; }\n
.ui-icon-volume-off { background-position: -128px -160px; }\n
.ui-icon-volume-on { background-position: -144px -160px; }\n
.ui-icon-power { background-position: 0 -176px; }\n
.ui-icon-signal-diag { background-position: -16px -176px; }\n
.ui-icon-signal { background-position: -32px -176px; }\n
.ui-icon-battery-0 { background-position: -48px -176px; }\n
.ui-icon-battery-1 { background-position: -64px -176px; }\n
.ui-icon-battery-2 { background-position: -80px -176px; }\n
.ui-icon-battery-3 { background-position: -96px -176px; }\n
.ui-icon-circle-plus { background-position: 0 -192px; }\n
.ui-icon-circle-minus { background-position: -16px -192px; }\n
.ui-icon-circle-close { background-position: -32px -192px; }\n
.ui-icon-circle-triangle-e { background-position: -48px -192px; }\n
.ui-icon-circle-triangle-s { background-position: -64px -192px; }\n
.ui-icon-circle-triangle-w { background-position: -80px -192px; }\n
.ui-icon-circle-triangle-n { background-position: -96px -192px; }\n
.ui-icon-circle-arrow-e { background-position: -112px -192px; }\n
.ui-icon-circle-arrow-s { background-position: -128px -192px; }\n
.ui-icon-circle-arrow-w { background-position: -144px -192px; }\n
.ui-icon-circle-arrow-n { background-position: -160px -192px; }\n
.ui-icon-circle-zoomin { background-position: -176px -192px; }\n
.ui-icon-circle-zoomout { background-position: -192px -192px; }\n
.ui-icon-circle-check { background-position: -208px -192px; }\n
.ui-icon-circlesmall-plus { background-position: 0 -208px; }\n
.ui-icon-circlesmall-minus { background-position: -16px -208px; }\n
.ui-icon-circlesmall-close { background-position: -32px -208px; }\n
.ui-icon-squaresmall-plus { background-position: -48px -208px; }\n
.ui-icon-squaresmall-minus { background-position: -64px -208px; }\n
.ui-icon-squaresmall-close { background-position: -80px -208px; }\n
.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }\n
.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }\n
.ui-icon-grip-solid-vertical { background-position: -32px -224px; }\n
.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }\n
.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }\n
.ui-icon-grip-diagonal-se { background-position: -80px -224px; }\n
\n
\n
/* Misc visuals\n
----------------------------------*/\n
\n
/* Corner radius */\n
.ui-corner-all,\n
.ui-corner-top,\n
.ui-corner-left,\n
.ui-corner-tl {\n
\tborder-top-left-radius: 4px/*{cornerRadius}*/;\n
}\n
.ui-corner-all,\n
.ui-corner-top,\n
.ui-corner-right,\n
.ui-corner-tr {\n
\tborder-top-right-radius: 4px/*{cornerRadius}*/;\n
}\n
.ui-corner-all,\n
.ui-corner-bottom,\n
.ui-corner-left,\n
.ui-corner-bl {\n
\tborder-bottom-left-radius: 4px/*{cornerRadius}*/;\n
}\n
.ui-corner-all,\n
.ui-corner-bottom,\n
.ui-corner-right,\n
.ui-corner-br {\n
\tborder-bottom-right-radius: 4px/*{cornerRadius}*/;\n
}\n
\n
/* Overlays */\n
.ui-widget-overlay {\n
\tbackground: #aaaaaa/*{bgColorOverlay}*/ url("images/ui-bg_flat_0_aaaaaa_40x100.png")/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/;\n
\topacity: .3/*{opacityOverlay}*/;\n
\tfilter: Alpha(Opacity=30)/*{opacityFilterOverlay}*/;\n
}\n
.ui-widget-shadow {\n
\tmargin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/;\n
\tpadding: 8px/*{thicknessShadow}*/;\n
\tbackground: #aaaaaa/*{bgColorShadow}*/ url("images/ui-bg_flat_0_aaaaaa_40x100.png")/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/;\n
\topacity: .3/*{opacityShadow}*/;\n
\tfilter: Alpha(Opacity=30)/*{opacityFilterShadow}*/;\n
\tborder-radius: 8px/*{cornerRadiusShadow}*/;\n
}\n
</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>32251</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681770.08</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>jquery.flot.stack.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/* Flot plugin for stacking data sets rather than overlyaing them.\n
\n
Copyright (c) 2007-2014 IOLA and Ole Laursen.\n
Licensed under the MIT license.\n
\n
The plugin assumes the data is sorted on x (or y if stacking horizontally).\n
For line charts, it is assumed that if a line has an undefined gap (from a\n
null point), then the line above it should have the same gap - insert zeros\n
instead of "null" if you want another behaviour. This also holds for the start\n
and end of the chart. Note that stacking a mix of positive and negative values\n
in most instances doesn\'t make sense (so it looks weird).\n
\n
Two or more series are stacked when their "stack" attribute is set to the same\n
key (which can be any number or string or just "true"). To specify the default\n
stack, you can set the stack option like this:\n
\n
\tseries: {\n
\t\tstack: null/false, true, or a key (number/string)\n
\t}\n
\n
You can also specify it for a single series, like this:\n
\n
\t$.plot( $("#placeholder"), [{\n
\t\tdata: [ ... ],\n
\t\tstack: true\n
\t}])\n
\n
The stacking order is determined by the order of the data series in the array\n
(later series end up on top of the previous).\n
\n
Internally, the plugin modifies the datapoints in each series, adding an\n
offset to the y value. For line series, extra data points are inserted through\n
interpolation. If there\'s a second y value, it\'s also adjusted (e.g for bar\n
charts or filled areas).\n
\n
*/\n
\n
(function ($) {\n
var options = {\n
series: { stack: null } // or number/string\n
};\n
\n
function init(plot) {\n
function findMatchingSeries(s, allseries) {\n
var res = null;\n
for (var i = 0; i < allseries.length; ++i) {\n
if (s == allseries[i])\n
break;\n
\n
if (allseries[i].stack == s.stack)\n
res = allseries[i];\n
}\n
\n
return res;\n
}\n
\n
function stackData(plot, s, datapoints) {\n
if (s.stack == null || s.stack === false)\n
return;\n
\n
var other = findMatchingSeries(s, plot.getData());\n
if (!other)\n
return;\n
\n
var ps = datapoints.pointsize,\n
points = datapoints.points,\n
otherps = other.datapoints.pointsize,\n
otherpoints = other.datapoints.points,\n
newpoints = [],\n
px, py, intery, qx, qy, bottom,\n
withlines = s.lines.show,\n
horizontal = s.bars.horizontal,\n
withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y),\n
withsteps = withlines && s.lines.steps,\n
fromgap = true,\n
keyOffset = horizontal ? 1 : 0,\n
accumulateOffset = horizontal ? 0 : 1,\n
i = 0, j = 0, l, m;\n
\n
while (true) {\n
if (i >= points.length)\n
break;\n
\n
l = newpoints.length;\n
\n
if (points[i] == null) {\n
// copy gaps\n
for (m = 0; m < ps; ++m)\n
newpoints.push(points[i + m]);\n
i += ps;\n
}\n
else if (j >= otherpoints.length) {\n
// for lines, we can\'t use the rest of the points\n
if (!withlines) {\n
for (m = 0; m < ps; ++m)\n
newpoints.push(points[i + m]);\n
}\n
i += ps;\n
}\n
else if (otherpoints[j] == null) {\n
// oops, got a gap\n
for (m = 0; m < ps; ++m)\n
newpoints.push(null);\n
fromgap = true;\n
j += otherps;\n
}\n
else {\n
// cases where we actually got two points\n
px = points[i + keyOffset];\n
py = points[i + accumulateOffset];\n
qx = otherpoints[j + keyOffset];\n
qy = otherpoints[j + accumulateOffset];\n
bottom = 0;\n
\n
if (px == qx) {\n
for (m = 0; m < ps; ++m)\n
newpoints.push(points[i + m]);\n
\n
newpoints[l + accumulateOffset] += qy;\n
bottom = qy;\n
\n
i += ps;\n
j += otherps;\n
}\n
else if (px > qx) {\n
// we got past point below, might need to\n
// insert interpolated extra point\n
if (withlines && i > 0 && points[i - ps] != null) {\n
intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px);\n
newpoints.push(qx);\n
newpoints.push(intery + qy);\n
for (m = 2; m < ps; ++m)\n
newpoints.push(points[i + m]);\n
bottom = qy; \n
}\n
\n
j += otherps;\n
}\n
else { // px < qx\n
if (fromgap && withlines) {\n
// if we come from a gap, we just skip this point\n
i += ps;\n
continue;\n
}\n
\n
for (m = 0; m < ps; ++m)\n
newpoints.push(points[i + m]);\n
\n
// we might be able to interpolate a point below,\n
// this can give us a better y\n
if (withlines && j > 0 && otherpoints[j - otherps] != null)\n
bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx);\n
\n
newpoints[l + accumulateOffset] += bottom;\n
\n
i += ps;\n
}\n
\n
fromgap = false;\n
\n
if (l != newpoints.length && withbottom)\n
newpoints[l + 2] += bottom;\n
}\n
\n
// maintain the line steps invariant\n
if (withsteps && l != newpoints.length && l > 0\n
&& newpoints[l] != null\n
&& newpoints[l] != newpoints[l - ps]\n
&& newpoints[l + 1] != newpoints[l - ps + 1]) {\n
for (m = 0; m < ps; ++m)\n
newpoints[l + ps + m] = newpoints[l + m];\n
newpoints[l + 1] = newpoints[l - ps + 1];\n
}\n
}\n
\n
datapoints.points = newpoints;\n
}\n
\n
plot.hooks.processDatapoints.push(stackData);\n
}\n
\n
$.plot.plugins.push({\n
init: init,\n
options: options,\n
name: \'stack\',\n
version: \'1.2\'\n
});\n
})(jQuery);\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>7090</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681770.53</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>jquery.simulate.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*\n
* jquery.simulate - simulate browser mouse and keyboard events\n
*\n
* Copyright (c) 2009 Eduardo Lundgren (eduardolundgren@gmail.com)\n
* and Richard D. Worth (rdworth@gmail.com)\n
*\n
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) \n
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.\n
*\n
*/\n
\n
;(function($) {\n
\n
$.fn.extend({\n
\tsimulate: function(type, options) {\n
\t\treturn this.each(function() {\n
\t\t\tvar opt = $.extend({}, $.simulate.defaults, options || {});\n
\t\t\tnew $.simulate(this, type, opt);\n
\t\t});\n
\t}\n
});\n
\n
$.simulate = function(el, type, options) {\n
\tthis.target = el;\n
\tthis.options = options;\n
\n
\tif (/^drag$/.test(type)) {\n
\t\tthis[type].apply(this, [this.target, options]);\n
\t} else {\n
\t\tthis.simulateEvent(el, type, options);\n
\t}\n
};\n
\n
$.extend($.simulate.prototype, {\n
\tsimulateEvent: function(el, type, options) {\n
\t\tvar evt = this.createEvent(type, options);\n
\t\tthis.dispatchEvent(el, type, evt, options);\n
\t\treturn evt;\n
\t},\n
\tcreateEvent: function(type, options) {\n
\t\tif (/^mouse(over|out|down|up|move)|(dbl)?click$/.test(type)) {\n
\t\t\treturn this.mouseEvent(type, options);\n
\t\t} else if (/^key(up|down|press)$/.test(type)) {\n
\t\t\treturn this.keyboardEvent(type, options);\n
\t\t}\n
\t},\n
\tmouseEvent: function(type, options) {\n
\t\tvar evt;\n
\t\tvar e = $.extend({\n
\t\t\tbubbles: true, cancelable: (type != "mousemove"), view: window, detail: 0,\n
\t\t\tscreenX: 0, screenY: 0, clientX: 0, clientY: 0,\n
\t\t\tctrlKey: false, altKey: false, shiftKey: false, metaKey: false,\n
\t\t\tbutton: 0, relatedTarget: undefined\n
\t\t}, options);\n
\n
\t\tvar relatedTarget = $(e.relatedTarget)[0];\n
\n
\t\tif ($.isFunction(document.createEvent)) {\n
\t\t\tevt = document.createEvent("MouseEvents");\n
\t\t\tevt.initMouseEvent(type, e.bubbles, e.cancelable, e.view, e.detail,\n
\t\t\t\te.screenX, e.screenY, e.clientX, e.clientY,\n
\t\t\t\te.ctrlKey, e.altKey, e.shiftKey, e.metaKey,\n
\t\t\t\te.button, e.relatedTarget || document.body.parentNode);\n
\t\t} else if (document.createEventObject) {\n
\t\t\tevt = document.createEventObject();\n
\t\t\t$.extend(evt, e);\n
\t\t\tevt.button = { 0:1, 1:4, 2:2 }[evt.button] || evt.button;\n
\t\t}\n
\t\treturn evt;\n
\t},\n
\tkeyboardEvent: function(type, options) {\n
\t\tvar evt;\n
\n
\t\tvar e = $.extend({ bubbles: true, cancelable: true, view: window,\n
\t\t\tctrlKey: false, altKey: false, shiftKey: false, metaKey: false,\n
\t\t\tkeyCode: 0, charCode: 0\n
\t\t}, options);\n
\n
\t\tif ($.isFunction(document.createEvent)) {\n
\t\t\ttry {\n
\t\t\t\tevt = document.createEvent("KeyEvents");\n
\t\t\t\tevt.initKeyEvent(type, e.bubbles, e.cancelable, e.view,\n
\t\t\t\t\te.ctrlKey, e.altKey, e.shiftKey, e.metaKey,\n
\t\t\t\t\te.keyCode, e.charCode);\n
\t\t\t} catch(err) {\n
\t\t\t\tevt = document.createEvent("Events");\n
\t\t\t\tevt.initEvent(type, e.bubbles, e.cancelable);\n
\t\t\t\t$.extend(evt, { view: e.view,\n
\t\t\t\t\tctrlKey: e.ctrlKey, altKey: e.altKey, shiftKey: e.shiftKey, metaKey: e.metaKey,\n
\t\t\t\t\tkeyCode: e.keyCode, charCode: e.charCode\n
\t\t\t\t});\n
\t\t\t}\n
\t\t} else if (document.createEventObject) {\n
\t\t\tevt = document.createEventObject();\n
\t\t\t$.extend(evt, e);\n
\t\t}\n
\t\tif (($.browser !== undefined) && ($.browser.msie || $.browser.opera)) {\n
\t\t\tevt.keyCode = (e.charCode > 0) ? e.charCode : e.keyCode;\n
\t\t\tevt.charCode = undefined;\n
\t\t}\n
\t\treturn evt;\n
\t},\n
\n
\tdispatchEvent: function(el, type, evt) {\n
\t\tif (el.dispatchEvent) {\n
\t\t\tel.dispatchEvent(evt);\n
\t\t} else if (el.fireEvent) {\n
\t\t\tel.fireEvent(\'on\' + type, evt);\n
\t\t}\n
\t\treturn evt;\n
\t},\n
\n
\tdrag: function(el) {\n
\t\tvar self = this, center = this.findCenter(this.target), \n
\t\t\toptions = this.options,\tx = Math.floor(center.x), y = Math.floor(center.y), \n
\t\t\tdx = options.dx || 0, dy = options.dy || 0, target = this.target;\n
\t\tvar coord = { clientX: x, clientY: y };\n
\t\tthis.simulateEvent(target, "mousedown", coord);\n
\t\tcoord = { clientX: x + 1, clientY: y + 1 };\n
\t\tthis.simulateEvent(document, "mousemove", coord);\n
\t\tcoord = { clientX: x + dx, clientY: y + dy };\n
\t\tthis.simulateEvent(document, "mousemove", coord);\n
\t\tthis.simulateEvent(document, "mousemove", coord);\n
\t\tthis.simulateEvent(target, "mouseup", coord);\n
\t},\n
\tfindCenter: function(el) {\n
\t\tvar el = $(this.target), o = el.offset();\n
\t\treturn {\n
\t\t\tx: o.left + el.outerWidth() / 2,\n
\t\t\ty: o.top + el.outerHeight() / 2\n
\t\t};\n
\t}\n
});\n
\n
$.extend($.simulate, {\n
\tdefaults: {\n
\t\tspeed: \'sync\'\n
\t},\n
\tVK_TAB: 9,\n
\tVK_ENTER: 13,\n
\tVK_ESC: 27,\n
\tVK_PGUP: 33,\n
\tVK_PGDN: 34,\n
\tVK_END: 35,\n
\tVK_HOME: 36,\n
\tVK_LEFT: 37,\n
\tVK_UP: 38,\n
\tVK_RIGHT: 39,\n
\tVK_DOWN: 40\n
});\n
\n
})(jQuery);\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4340</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681771.66</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>pubsub.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global jQuery */\n
/* jQuery Tiny Pub/Sub - v0.7 - 10/27/2011\n
* http://benalman.com/\n
* Copyright (c) 2011 "Cowboy" Ben Alman; Licensed MIT, GPL */\n
(function($) {\n
"use strict";\n
var o = $({});\n
$.subscribe = function() {\n
o.on.apply(o, arguments);\n
};\n
$.unsubscribe = function() {\n
o.off.apply(o, arguments);\n
};\n
$.publish = function() {\n
o.trigger.apply(o, arguments);\n
};\n
})(jQuery);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>434</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681769.16</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>qunit.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*!\n
* QUnit 1.14.0\n
* http://qunitjs.com/\n
*\n
* Copyright 2013 jQuery Foundation and other contributors\n
* Released under the MIT license\n
* http://jquery.org/license\n
*\n
* Date: 2014-01-31T16:40Z\n
*/\n
\n
/** Font Family and Sizes */\n
\n
#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {\n
\tfont-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;\n
}\n
\n
#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }\n
#qunit-tests { font-size: smaller; }\n
\n
\n
/** Resets */\n
\n
#qunit-tests, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {\n
\tmargin: 0;\n
\tpadding: 0;\n
}\n
\n
\n
/** Header */\n
\n
#qunit-header {\n
\tpadding: 0.5em 0 0.5em 1em;\n
\n
\tcolor: #8699A4;\n
\tbackground-color: #0D3349;\n
\n
\tfont-size: 1.5em;\n
\tline-height: 1em;\n
\tfont-weight: 400;\n
\n
\tborder-radius: 5px 5px 0 0;\n
}\n
\n
#qunit-header a {\n
\ttext-decoration: none;\n
\tcolor: #C2CCD1;\n
}\n
\n
#qunit-header a:hover,\n
#qunit-header a:focus {\n
\tcolor: #FFF;\n
}\n
\n
#qunit-testrunner-toolbar label {\n
\tdisplay: inline-block;\n
\tpadding: 0 0.5em 0 0.1em;\n
}\n
\n
#qunit-banner {\n
\theight: 5px;\n
}\n
\n
#qunit-testrunner-toolbar {\n
\tpadding: 0.5em 0 0.5em 2em;\n
\tcolor: #5E740B;\n
\tbackground-color: #EEE;\n
\toverflow: hidden;\n
}\n
\n
#qunit-userAgent {\n
\tpadding: 0.5em 0 0.5em 2.5em;\n
\tbackground-color: #2B81AF;\n
\tcolor: #FFF;\n
\ttext-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;\n
}\n
\n
#qunit-modulefilter-container {\n
\tfloat: right;\n
}\n
\n
/** Tests: Pass/Fail */\n
\n
#qunit-tests {\n
\tlist-style-position: inside;\n
}\n
\n
#qunit-tests li {\n
\tpadding: 0.4em 0.5em 0.4em 2.5em;\n
\tborder-bottom: 1px solid #FFF;\n
\tlist-style-position: inside;\n
}\n
\n
#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running {\n
\tdisplay: none;\n
}\n
\n
#qunit-tests li strong {\n
\tcursor: pointer;\n
}\n
\n
#qunit-tests li a {\n
\tpadding: 0.5em;\n
\tcolor: #C2CCD1;\n
\ttext-decoration: none;\n
}\n
#qunit-tests li a:hover,\n
#qunit-tests li a:focus {\n
\tcolor: #000;\n
}\n
\n
#qunit-tests li .runtime {\n
\tfloat: right;\n
\tfont-size: smaller;\n
}\n
\n
.qunit-assert-list {\n
\tmargin-top: 0.5em;\n
\tpadding: 0.5em;\n
\n
\tbackground-color: #FFF;\n
\n
\tborder-radius: 5px;\n
}\n
\n
.qunit-collapsed {\n
\tdisplay: none;\n
}\n
\n
#qunit-tests table {\n
\tborder-collapse: collapse;\n
\tmargin-top: 0.2em;\n
}\n
\n
#qunit-tests th {\n
\ttext-align: right;\n
\tvertical-align: top;\n
\tpadding: 0 0.5em 0 0;\n
}\n
\n
#qunit-tests td {\n
\tvertical-align: top;\n
}\n
\n
#qunit-tests pre {\n
\tmargin: 0;\n
\twhite-space: pre-wrap;\n
\tword-wrap: break-word;\n
}\n
\n
#qunit-tests del {\n
\tbackground-color: #E0F2BE;\n
\tcolor: #374E0C;\n
\ttext-decoration: none;\n
}\n
\n
#qunit-tests ins {\n
\tbackground-color: #FFCACA;\n
\tcolor: #500;\n
\ttext-decoration: none;\n
}\n
\n
/*** Test Counts */\n
\n
#qunit-tests b.counts { color: #000; }\n
#qunit-tests b.passed { color: #5E740B; }\n
#qunit-tests b.failed { color: #710909; }\n
\n
#qunit-tests li li {\n
\tpadding: 5px;\n
\tbackground-color: #FFF;\n
\tborder-bottom: none;\n
\tlist-style-position: inside;\n
}\n
\n
/*** Passing Styles */\n
\n
#qunit-tests li li.pass {\n
\tcolor: #3C510C;\n
\tbackground-color: #FFF;\n
\tborder-left: 10px solid #C6E746;\n
}\n
\n
#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }\n
#qunit-tests .pass .test-name { color: #366097; }\n
\n
#qunit-tests .pass .test-actual,\n
#qunit-tests .pass .test-expected { color: #999; }\n
\n
#qunit-banner.qunit-pass { background-color: #C6E746; }\n
\n
/*** Failing Styles */\n
\n
#qunit-tests li li.fail {\n
\tcolor: #710909;\n
\tbackground-color: #FFF;\n
\tborder-left: 10px solid #EE5757;\n
\twhite-space: pre;\n
}\n
\n
#qunit-tests > li:last-child {\n
\tborder-radius: 0 0 5px 5px;\n
}\n
\n
#qunit-tests .fail { color: #000; background-color: #EE5757; }\n
#qunit-tests .fail .test-name,\n
#qunit-tests .fail .module-name { color: #000; }\n
\n
#qunit-tests .fail .test-actual { color: #EE5757; }\n
#qunit-tests .fail .test-expected { color: #008000; }\n
\n
#qunit-banner.qunit-fail { background-color: #EE5757; }\n
\n
\n
/** Result */\n
\n
#qunit-testresult {\n
\tpadding: 0.5em 0.5em 0.5em 2.5em;\n
\n
\tcolor: #2B81AF;\n
\tbackground-color: #D2E0E6;\n
\n
\tborder-bottom: 1px solid #FFF;\n
}\n
#qunit-testresult .module-name {\n
\tfont-weight: 700;\n
}\n
\n
/** Fixture */\n
\n
#qunit-fixture {\n
\tposition: absolute;\n
\ttop: -10000px;\n
\tleft: -10000px;\n
\twidth: 1000px;\n
\theight: 1000px;\n
}\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>4362</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681769.3</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>qunit.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*!\n
* QUnit 1.14.0\n
* http://qunitjs.com/\n
*\n
* Copyright 2013 jQuery Foundation and other contributors\n
* Released under the MIT license\n
* http://jquery.org/license\n
*\n
* Date: 2014-01-31T16:40Z\n
*/\n
\n
(function( window ) {\n
\n
var QUnit,\n
\tassert,\n
\tconfig,\n
\tonErrorFnPrev,\n
\ttestId = 0,\n
\tfileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\\d+)+\\)?/, "").replace(/.+\\//, ""),\n
\ttoString = Object.prototype.toString,\n
\thasOwn = Object.prototype.hasOwnProperty,\n
\t// Keep a local reference to Date (GH-283)\n
\tDate = window.Date,\n
\tsetTimeout = window.setTimeout,\n
\tclearTimeout = window.clearTimeout,\n
\tdefined = {\n
\t\tdocument: typeof window.document !== "undefined",\n
\t\tsetTimeout: typeof window.setTimeout !== "undefined",\n
\t\tsessionStorage: (function() {\n
\t\t\tvar x = "qunit-test-string";\n
\t\t\ttry {\n
\t\t\t\tsessionStorage.setItem( x, x );\n
\t\t\t\tsessionStorage.removeItem( x );\n
\t\t\t\treturn true;\n
\t\t\t} catch( e ) {\n
\t\t\t\treturn false;\n
\t\t\t}\n
\t\t}())\n
\t},\n
\t/**\n
\t * Provides a normalized error string, correcting an issue\n
\t * with IE 7 (and prior) where Error.prototype.toString is\n
\t * not properly implemented\n
\t *\n
\t * Based on http://es5.github.com/#x15.11.4.4\n
\t *\n
\t * @param {String|Error} error\n
\t * @return {String} error message\n
\t */\n
\terrorString = function( error ) {\n
\t\tvar name, message,\n
\t\t\terrorString = error.toString();\n
\t\tif ( errorString.substring( 0, 7 ) === "[object" ) {\n
\t\t\tname = error.name ? error.name.toString() : "Error";\n
\t\t\tmessage = error.message ? error.message.toString() : "";\n
\t\t\tif ( name && message ) {\n
\t\t\t\treturn name + ": " + message;\n
\t\t\t} else if ( name ) {\n
\t\t\t\treturn name;\n
\t\t\t} else if ( message ) {\n
\t\t\t\treturn message;\n
\t\t\t} else {\n
\t\t\t\treturn "Error";\n
\t\t\t}\n
\t\t} else {\n
\t\t\treturn errorString;\n
\t\t}\n
\t},\n
\t/**\n
\t * Makes a clone of an object using only Array or Object as base,\n
\t * and copies over the own enumerable properties.\n
\t *\n
\t * @param {Object} obj\n
\t * @return {Object} New object with only the own properties (recursively).\n
\t */\n
\tobjectValues = function( obj ) {\n
\t\t// Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392.\n
\t\t/*jshint newcap: false */\n
\t\tvar key, val,\n
\t\t\tvals = QUnit.is( "array", obj ) ? [] : {};\n
\t\tfor ( key in obj ) {\n
\t\t\tif ( hasOwn.call( obj, key ) ) {\n
\t\t\t\tval = obj[key];\n
\t\t\t\tvals[key] = val === Object(val) ? objectValues(val) : val;\n
\t\t\t}\n
\t\t}\n
\t\treturn vals;\n
\t};\n
\n
\n
// Root QUnit object.\n
// `QUnit` initialized at top of scope\n
QUnit = {\n
\n
\t// call on start of module test to prepend name to all tests\n
\tmodule: function( name, testEnvironment ) {\n
\t\tconfig.currentModule = name;\n
\t\tconfig.currentModuleTestEnvironment = testEnvironment;\n
\t\tconfig.modules[name] = true;\n
\t},\n
\n
\tasyncTest: function( testName, expected, callback ) {\n
\t\tif ( arguments.length === 2 ) {\n
\t\t\tcallback = expected;\n
\t\t\texpected = null;\n
\t\t}\n
\n
\t\tQUnit.test( testName, expected, callback, true );\n
\t},\n
\n
\ttest: function( testName, expected, callback, async ) {\n
\t\tvar test,\n
\t\t\tnameHtml = "<span class=\'test-name\'>" + escapeText( testName ) + "</span>";\n
\n
\t\tif ( arguments.length === 2 ) {\n
\t\t\tcallback = expected;\n
\t\t\texpected = null;\n
\t\t}\n
\n
\t\tif ( config.currentModule ) {\n
\t\t\tnameHtml = "<span class=\'module-name\'>" + escapeText( config.currentModule ) + "</span>: " + nameHtml;\n
\t\t}\n
\n
\t\ttest = new Test({\n
\t\t\tnameHtml: nameHtml,\n
\t\t\ttestName: testName,\n
\t\t\texpected: expected,\n
\t\t\tasync: async,\n
\t\t\tcallback: callback,\n
\t\t\tmodule: config.currentModule,\n
\t\t\tmoduleTestEnvironment: config.currentModuleTestEnvironment,\n
\t\t\tstack: sourceFromStacktrace( 2 )\n
\t\t});\n
\n
\t\tif ( !validTest( test ) ) {\n
\t\t\treturn;\n
\t\t}\n
\n
\t\ttest.queue();\n
\t},\n
\n
\t// Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don\'t slip through.\n
\texpect: function( asserts ) {\n
\t\tif (arguments.length === 1) {\n
\t\t\tconfig.current.expected = asserts;\n
\t\t} else {\n
\t\t\treturn config.current.expected;\n
\t\t}\n
\t},\n
\n
\tstart: function( count ) {\n
\t\t// QUnit hasn\'t been initialized yet.\n
\t\t// Note: RequireJS (et al) may delay onLoad\n
\t\tif ( config.semaphore === undefined ) {\n
\t\t\tQUnit.begin(function() {\n
\t\t\t\t// This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first\n
\t\t\t\tsetTimeout(function() {\n
\t\t\t\t\tQUnit.start( count );\n
\t\t\t\t});\n
\t\t\t});\n
\t\t\treturn;\n
\t\t}\n
\n
\t\tconfig.semaphore -= count || 1;\n
\t\t// don\'t start until equal number of stop-calls\n
\t\tif ( config.semaphore > 0 ) {\n
\t\t\treturn;\n
\t\t}\n
\t\t// ignore if start is called more often then stop\n
\t\tif ( config.semaphore < 0 ) {\n
\t\t\tconfig.semaphore = 0;\n
\t\t\tQUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) );\n
\t\t\treturn;\n
\t\t}\n
\t\t// A slight delay, to avoid any current callbacks\n
\t\tif ( defined.setTimeout ) {\n
\t\t\tsetTimeout(function() {\n
\t\t\t\tif ( config.semaphore > 0 ) {\n
\t\t\t\t\treturn;\n
\t\t\t\t}\n
\t\t\t\tif ( config.timeout ) {\n
\t\t\t\t\tclearTimeout( config.timeout );\n
\t\t\t\t}\n
\n
\t\t\t\tconfig.blocking = false;\n
\t\t\t\tprocess( true );\n
\t\t\t}, 13);\n
\t\t} else {\n
\t\t\tconfig.blocking = false;\n
\t\t\tprocess( true );\n
\t\t}\n
\t},\n
\n
\tstop: function( count ) {\n
\t\tconfig.semaphore += count || 1;\n
\t\tconfig.blocking = true;\n
\n
\t\tif ( config.testTimeout && defined.setTimeout ) {\n
\t\t\tclearTimeout( config.timeout );\n
\t\t\tconfig.timeout = setTimeout(function() {\n
\t\t\t\tQUnit.ok( false, "Test timed out" );\n
\t\t\t\tconfig.semaphore = 1;\n
\t\t\t\tQUnit.start();\n
\t\t\t}, config.testTimeout );\n
\t\t}\n
\t}\n
};\n
\n
// We use the prototype to distinguish between properties that should\n
// be exposed as globals (and in exports) and those that shouldn\'t\n
(function() {\n
\tfunction F() {}\n
\tF.prototype = QUnit;\n
\tQUnit = new F();\n
\t// Make F QUnit\'s constructor so that we can add to the prototype later\n
\tQUnit.constructor = F;\n
}());\n
\n
/**\n
* Config object: Maintain internal state\n
* Later exposed as QUnit.config\n
* `config` initialized at top of scope\n
*/\n
config = {\n
\t// The queue of tests to run\n
\tqueue: [],\n
\n
\t// block until document ready\n
\tblocking: true,\n
\n
\t// when enabled, show only failing tests\n
\t// gets persisted through sessionStorage and can be changed in UI via checkbox\n
\thidepassed: false,\n
\n
\t// by default, run previously failed tests first\n
\t// very useful in combination with "Hide passed tests" checked\n
\treorder: true,\n
\n
\t// by default, modify document.title when suite is done\n
\taltertitle: true,\n
\n
\t// by default, scroll to top of the page when suite is done\n
\tscrolltop: true,\n
\n
\t// when enabled, all tests must call expect()\n
\trequireExpects: false,\n
\n
\t// add checkboxes that are persisted in the query-string\n
\t// when enabled, the id is set to `true` as a `QUnit.config` property\n
\turlConfig: [\n
\t\t{\n
\t\t\tid: "noglobals",\n
\t\t\tlabel: "Check for Globals",\n
\t\t\ttooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings."\n
\t\t},\n
\t\t{\n
\t\t\tid: "notrycatch",\n
\t\t\tlabel: "No try-catch",\n
\t\t\ttooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings."\n
\t\t}\n
\t],\n
\n
\t// Set of all modules.\n
\tmodules: {},\n
\n
\t// logging callback queues\n
\tbegin: [],\n
\tdone: [],\n
\tlog: [],\n
\ttestStart: [],\n
\ttestDone: [],\n
\tmoduleStart: [],\n
\tmoduleDone: []\n
};\n
\n
// Initialize more QUnit.config and QUnit.urlParams\n
(function() {\n
\tvar i, current,\n
\t\tlocation = window.location || { search: "", protocol: "file:" },\n
\t\tparams = location.search.slice( 1 ).split( "&" ),\n
\t\tlength = params.length,\n
\t\turlParams = {};\n
\n
\tif ( params[ 0 ] ) {\n
\t\tfor ( i = 0; i < length; i++ ) {\n
\t\t\tcurrent = params[ i ].split( "=" );\n
\t\t\tcurrent[ 0 ] = decodeURIComponent( current[ 0 ] );\n
\n
\t\t\t// allow just a key to turn on a flag, e.g., test.html?noglobals\n
\t\t\tcurrent[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;\n
\t\t\tif ( urlParams[ current[ 0 ] ] ) {\n
\t\t\t\turlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] );\n
\t\t\t} else {\n
\t\t\t\turlParams[ current[ 0 ] ] = current[ 1 ];\n
\t\t\t}\n
\t\t}\n
\t}\n
\n
\tQUnit.urlParams = urlParams;\n
\n
\t// String search anywhere in moduleName+testName\n
\tconfig.filter = urlParams.filter;\n
\n
\t// Exact match of the module name\n
\tconfig.module = urlParams.module;\n
\n
\tconfig.testNumber = [];\n
\tif ( urlParams.testNumber ) {\n
\n
\t\t// Ensure that urlParams.testNumber is an array\n
\t\turlParams.testNumber = [].concat( urlParams.testNumber );\n
\t\tfor ( i = 0; i < urlParams.testNumber.length; i++ ) {\n
\t\t\tcurrent = urlParams.testNumber[ i ];\n
\t\t\tconfig.testNumber.push( parseInt( current, 10 ) );\n
\t\t}\n
\t}\n
\n
\t// Figure out if we\'re running the tests from a server or not\n
\tQUnit.isLocal = location.protocol === "file:";\n
}());\n
\n
extend( QUnit, {\n
\n
\tconfig: config,\n
\n
\t// Initialize the configuration options\n
\tinit: function() {\n
\t\textend( config, {\n
\t\t\tstats: { all: 0, bad: 0 },\n
\t\t\tmoduleStats: { all: 0, bad: 0 },\n
\t\t\tstarted: +new Date(),\n
\t\t\tupdateRate: 1000,\n
\t\t\tblocking: false,\n
\t\t\tautostart: true,\n
\t\t\tautorun: false,\n
\t\t\tfilter: "",\n
\t\t\tqueue: [],\n
\t\t\tsemaphore: 1\n
\t\t});\n
\n
\t\tvar tests, banner, result,\n
\t\t\tqunit = id( "qunit" );\n
\n
\t\tif ( qunit ) {\n
\t\t\tqunit.innerHTML =\n
\t\t\t\t"<h1 id=\'qunit-header\'>" + escapeText( document.title ) + "</h1>" +\n
\t\t\t\t"<h2 id=\'qunit-banner\'></h2>" +\n
\t\t\t\t"<div id=\'qunit-testrunner-toolbar\'></div>" +\n
\t\t\t\t"<h2 id=\'qunit-userAgent\'></h2>" +\n
\t\t\t\t"<ol id=\'qunit-tests\'></ol>";\n
\t\t}\n
\n
\t\ttests = id( "qunit-tests" );\n
\t\tbanner = id( "qunit-banner" );\n
\t\tresult = id( "qunit-testresult" );\n
\n
\t\tif ( tests ) {\n
\t\t\ttests.innerHTML = "";\n
\t\t}\n
\n
\t\tif ( banner ) {\n
\t\t\tbanner.className = "";\n
\t\t}\n
\n
\t\tif ( result ) {\n
\t\t\tresult.parentNode.removeChild( result );\n
\t\t}\n
\n
\t\tif ( tests ) {\n
\t\t\tresult = document.createElement( "p" );\n
\t\t\tresult.id = "qunit-testresult";\n
\t\t\tresult.className = "result";\n
\t\t\ttests.parentNode.insertBefore( result, tests );\n
\t\t\tresult.innerHTML = "Running...<br/>&nbsp;";\n
\t\t}\n
\t},\n
\n
\t// Resets the test setup. Useful for tests that modify the DOM.\n
\t/*\n
\tDEPRECATED: Use multiple tests instead of resetting inside a test.\n
\tUse testStart or testDone for custom cleanup.\n
\tThis method will throw an error in 2.0, and will be removed in 2.1\n
\t*/\n
\treset: function() {\n
\t\tvar fixture = id( "qunit-fixture" );\n
\t\tif ( fixture ) {\n
\t\t\tfixture.innerHTML = config.fixture;\n
\t\t}\n
\t},\n
\n
\t// Safe object type checking\n
\tis: function( type, obj ) {\n
\t\treturn QUnit.objectType( obj ) === type;\n
\t},\n
\n
\tobjectType: function( obj ) {\n
\t\tif ( typeof obj === "undefined" ) {\n
\t\t\treturn "undefined";\n
\t\t}\n
\n
\t\t// Consider: typeof null === object\n
\t\tif ( obj === null ) {\n
\t\t\treturn "null";\n
\t\t}\n
\n
\t\tvar match = toString.call( obj ).match(/^\\[object\\s(.*)\\]$/),\n
\t\t\ttype = match && match[1] || "";\n
\n
\t\tswitch ( type ) {\n
\t\t\tcase "Number":\n
\t\t\t\tif ( isNaN(obj) ) {\n
\t\t\t\t\treturn "nan";\n
\t\t\t\t}\n
\t\t\t\treturn "number";\n
\t\t\tcase "String":\n
\t\t\tcase "Boolean":\n
\t\t\tcase "Array":\n
\t\t\tcase "Date":\n
\t\t\tcase "RegExp":\n
\t\t\tcase "Function":\n
\t\t\t\treturn type.toLowerCase();\n
\t\t}\n
\t\tif ( typeof obj === "object" ) {\n
\t\t\treturn "object";\n
\t\t}\n
\t\treturn undefined;\n
\t},\n
\n
\tpush: function( result, actual, expected, message ) {\n
\t\tif ( !config.current ) {\n
\t\t\tthrow new Error( "assertion outside test context, was " + sourceFromStacktrace() );\n
\t\t}\n
\n
\t\tvar output, source,\n
\t\t\tdetails = {\n
\t\t\t\tmodule: config.current.module,\n
\t\t\t\tname: config.current.testName,\n
\t\t\t\tresult: result,\n
\t\t\t\tmessage: message,\n
\t\t\t\tactual: actual,\n
\t\t\t\texpected: expected\n
\t\t\t};\n
\n
\t\tmessage = escapeText( message ) || ( result ? "okay" : "failed" );\n
\t\tmessage = "<span class=\'test-message\'>" + message + "</span>";\n
\t\toutput = message;\n
\n
\t\tif ( !result ) {\n
\t\t\texpected = escapeText( QUnit.jsDump.parse(expected) );\n
\t\t\tactual = escapeText( QUnit.jsDump.parse(actual) );\n
\t\t\toutput += "<table><tr class=\'test-expected\'><th>Expected: </th><td><pre>" + expected + "</pre></td></tr>";\n
\n
\t\t\tif ( actual !== expected ) {\n
\t\t\t\toutput += "<tr class=\'test-actual\'><th>Result: </th><td><pre>" + actual + "</pre></td></tr>";\n
\t\t\t\toutput += "<tr class=\'test-diff\'><th>Diff: </th><td><pre>" + QUnit.diff( expected, actual ) + "</pre></td></tr>";\n
\t\t\t}\n
\n
\t\t\tsource = sourceFromStacktrace();\n
\n
\t\t\tif ( source ) {\n
\t\t\t\tdetails.source = source;\n
\t\t\t\toutput += "<tr class=\'test-source\'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";\n
\t\t\t}\n
\n
\t\t\toutput += "</table>";\n
\t\t}\n
\n
\t\trunLoggingCallbacks( "log", QUnit, details );\n
\n
\t\tconfig.current.assertions.push({\n
\t\t\tresult: !!result,\n
\t\t\tmessage: output\n
\t\t});\n
\t},\n
\n
\tpushFailure: function( message, source, actual ) {\n
\t\tif ( !config.current ) {\n
\t\t\tthrow new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) );\n
\t\t}\n
\n
\t\tvar output,\n
\t\t\tdetails = {\n
\t\t\t\tmodule: config.current.module,\n
\t\t\t\tname: config.current.testName,\n
\t\t\t\tresult: false,\n
\t\t\t\tmessage: message\n
\t\t\t};\n
\n
\t\tmessage = escapeText( message ) || "error";\n
\t\tmessage = "<span class=\'test-message\'>" + message + "</span>";\n
\t\toutput = message;\n
\n
\t\toutput += "<table>";\n
\n
\t\tif ( actual ) {\n
\t\t\toutput += "<tr class=\'test-actual\'><th>Result: </th><td><pre>" + escapeText( actual ) + "</pre></td></tr>";\n
\t\t}\n
\n
\t\tif ( source ) {\n
\t\t\tdetails.source = source;\n
\t\t\toutput += "<tr class=\'test-source\'><th>Source: </th><td><pre>" + escapeText( source ) + "</pre></td></tr>";\n
\t\t}\n
\n
\t\toutput += "</table>";\n
\n
\t\trunLoggingCallbacks( "log", QUnit, details );\n
\n
\t\tconfig.current.assertions.push({\n
\t\t\tresult: false,\n
\t\t\tmessage: output\n
\t\t});\n
\t},\n
\n
\turl: function( params ) {\n
\t\tparams = extend( extend( {}, QUnit.urlParams ), params );\n
\t\tvar key,\n
\t\t\tquerystring = "?";\n
\n
\t\tfor ( key in params ) {\n
\t\t\tif ( hasOwn.call( params, key ) ) {\n
\t\t\t\tquerystring += encodeURIComponent( key ) + "=" +\n
\t\t\t\t\tencodeURIComponent( params[ key ] ) + "&";\n
\t\t\t}\n
\t\t}\n
\t\treturn window.location.protocol + "//" + window.location.host +\n
\t\t\twindow.location.pathname + querystring.slice( 0, -1 );\n
\t},\n
\n
\textend: extend,\n
\tid: id,\n
\taddEvent: addEvent,\n
\taddClass: addClass,\n
\thasClass: hasClass,\n
\tremoveClass: removeClass\n
\t// load, equiv, jsDump, diff: Attached later\n
});\n
\n
/**\n
* @deprecated: Created for backwards compatibility with test runner that set the hook function\n
* into QUnit.{hook}, instead of invoking it and passing the hook function.\n
* QUnit.constructor is set to the empty F() above so that we can add to it\'s prototype here.\n
* Doing this allows us to tell if the following methods have been overwritten on the actual\n
* QUnit object.\n
*/\n
extend( QUnit.constructor.prototype, {\n
\n
\t// Logging callbacks; all receive a single argument with the listed properties\n
\t// run test/logs.html for any related changes\n
\tbegin: registerLoggingCallback( "begin" ),\n
\n
\t// done: { failed, passed, total, runtime }\n
\tdone: registerLoggingCallback( "done" ),\n
\n
\t// log: { result, actual, expected, message }\n
\tlog: registerLoggingCallback( "log" ),\n
\n
\t// testStart: { name }\n
\ttestStart: registerLoggingCallback( "testStart" ),\n
\n
\t// testDone: { name, failed, passed, total, runtime }\n
\ttestDone: registerLoggingCallback( "testDone" ),\n
\n
\t// moduleStart: { name }\n
\tmoduleStart: registerLoggingCallback( "moduleStart" ),\n
\n
\t// moduleDone: { name, failed, passed, total }\n
\tmoduleDone: registerLoggingCallback( "moduleDone" )\n
});\n
\n
if ( !defined.document || document.readyState === "complete" ) {\n
\tconfig.autorun = true;\n
}\n
\n
QUnit.load = function() {\n
\trunLoggingCallbacks( "begin", QUnit, {} );\n
\n
\t// Initialize the config, saving the execution queue\n
\tvar banner, filter, i, j, label, len, main, ol, toolbar, val, selection,\n
\t\turlConfigContainer, moduleFilter, userAgent,\n
\t\tnumModules = 0,\n
\t\tmoduleNames = [],\n
\t\tmoduleFilterHtml = "",\n
\t\turlConfigHtml = "",\n
\t\toldconfig = extend( {}, config );\n
\n
\tQUnit.init();\n
\textend(config, oldconfig);\n
\n
\tconfig.blocking = false;\n
\n
\tlen = config.urlConfig.length;\n
\n
\tfor ( i = 0; i < len; i++ ) {\n
\t\tval = config.urlConfig[i];\n
\t\tif ( typeof val === "string" ) {\n
\t\t\tval = {\n
\t\t\t\tid: val,\n
\t\t\t\tlabel: val\n
\t\t\t};\n
\t\t}\n
\t\tconfig[ val.id ] = QUnit.urlParams[ val.id ];\n
\t\tif ( !val.value || typeof val.value === "string" ) {\n
\t\t\turlConfigHtml += "<input id=\'qunit-urlconfig-" + escapeText( val.id ) +\n
\t\t\t\t"\' name=\'" + escapeText( val.id ) +\n
\t\t\t\t"\' type=\'checkbox\'" +\n
\t\t\t\t( val.value ? " value=\'" + escapeText( val.value ) + "\'" : "" ) +\n
\t\t\t\t( config[ val.id ] ? " checked=\'checked\'" : "" ) +\n
\t\t\t\t" title=\'" + escapeText( val.tooltip ) +\n
\t\t\t\t"\'><label for=\'qunit-urlconfig-" + escapeText( val.id ) +\n
\t\t\t\t"\' title=\'" + escapeText( val.tooltip ) + "\'>" + val.label + "</label>";\n
\t\t} else {\n
\t\t\turlConfigHtml += "<label for=\'qunit-urlconfig-" + escapeText( val.id ) +\n
\t\t\t\t"\' title=\'" + escapeText( val.tooltip ) +\n
\t\t\t\t"\'>" + val.label +\n
\t\t\t\t": </label><select id=\'qunit-urlconfig-" + escapeText( val.id ) +\n
\t\t\t\t"\' name=\'" + escapeText( val.id ) +\n
\t\t\t\t"\' title=\'" + escapeText( val.tooltip ) +\n
\t\t\t\t"\'><option></option>";\n
\t\t\tselection = false;\n
\t\t\tif ( QUnit.is( "array", val.value ) ) {\n
\t\t\t\tfor ( j = 0; j < val.value.length; j++ ) {\n
\t\t\t\t\turlConfigHtml += "<option value=\'" + escapeText( val.value[j] ) + "\'" +\n
\t\t\t\t\t\t( config[ val.id ] === val.value[j] ?\n
\t\t\t\t\t\t\t(selection = true) && " selected=\'selected\'" :\n
\t\t\t\t\t\t\t"" ) +\n
\t\t\t\t\t\t">" + escapeText( val.value[j] ) + "</option>";\n
\t\t\t\t}\n
\t\t\t} else {\n
\t\t\t\tfor ( j in val.value ) {\n
\t\t\t\t\tif ( hasOwn.call( val.value, j ) ) {\n
\t\t\t\t\t\turlConfigHtml += "<option value=\'" + escapeText( j ) + "\'" +\n
\t\t\t\t\t\t\t( config[ val.id ] === j ?\n
\t\t\t\t\t\t\t\t(selection = true) && " selected=\'selected\'" :\n
\t\t\t\t\t\t\t\t"" ) +\n
\t\t\t\t\t\t\t">" + escapeText( val.value[j] ) + "</option>";\n
\t\t\t\t\t}\n
\t\t\t\t}\n
\t\t\t}\n
\t\t\tif ( config[ val.id ] && !selection ) {\n
\t\t\t\turlConfigHtml += "<option value=\'" + escapeText( config[ val.id ] ) +\n
\t\t\t\t\t"\' selected=\'selected\' disabled=\'disabled\'>" +\n
\t\t\t\t\tescapeText( config[ val.id ] ) +\n
\t\t\t\t\t"</option>";\n
\t\t\t}\n
\t\t\turlConfigHtml += "</select>";\n
\t\t}\n
\t}\n
\tfor ( i in config.modules ) {\n
\t\tif ( config.modules.hasOwnProperty( i ) ) {\n
\t\t\tmoduleNames.push(i);\n
\t\t}\n
\t}\n
\tnumModules = moduleNames.length;\n
\tmoduleNames.sort( function( a, b ) {\n
\t\treturn a.localeCompare( b );\n
\t});\n
\tmoduleFilterHtml += "<label for=\'qunit-modulefilter\'>Module: </label><select id=\'qunit-modulefilter\' name=\'modulefilter\'><option value=\'\' " +\n
\t\t( config.module === undefined ? "selected=\'selected\'" : "" ) +\n
\t\t">< All Modules ></option>";\n
\n
\n
\tfor ( i = 0; i < numModules; i++) {\n
\t\t\tmoduleFilterHtml += "<option value=\'" + escapeText( encodeURIComponent(moduleNames[i]) ) + "\' " +\n
\t\t\t\t( config.module === moduleNames[i] ? "selected=\'selected\'" : "" ) +\n
\t\t\t\t">" + escapeText(moduleNames[i]) + "</option>";\n
\t}\n
\tmoduleFilterHtml += "</select>";\n
\n
\t// `userAgent` initialized at top of scope\n
\tuserAgent = id( "qunit-userAgent" );\n
\tif ( userAgent ) {\n
\t\tuserAgent.innerHTML = navigator.userAgent;\n
\t}\n
\n
\t// `banner` initialized at top of scope\n
\tbanner = id( "qunit-header" );\n
\tif ( banner ) {\n
\t\tbanner.innerHTML = "<a href=\'" + QUnit.url({ filter: undefined, module: undefined, testNumber: undefined }) + "\'>" + banner.innerHTML + "</a> ";\n
\t}\n
\n
\t// `toolbar` initialized at top of scope\n
\ttoolbar = id( "qunit-testrunner-toolbar" );\n
\tif ( toolbar ) {\n
\t\t// `filter` initialized at top of scope\n
\t\tfilter = document.createElement( "input" );\n
\t\tfilter.type = "checkbox";\n
\t\tfilter.id = "qunit-filter-pass";\n
\n
\t\taddEvent( filter, "click", function() {\n
\t\t\tvar tmp,\n
\t\t\t\tol = id( "qunit-tests" );\n
\n
\t\t\tif ( filter.checked ) {\n
\t\t\t\tol.className = ol.className + " hidepass";\n
\t\t\t} else {\n
\t\t\t\ttmp = " " + ol.className.replace( /[\\n\\t\\r]/g, " " ) + " ";\n
\t\t\t\tol.className = tmp.replace( / hidepass /, " " );\n
\t\t\t}\n
\t\t\tif ( defined.sessionStorage ) {\n
\t\t\t\tif (filter.checked) {\n
\t\t\t\t\tsessionStorage.setItem( "qunit-filter-passed-tests", "true" );\n
\t\t\t\t} else {\n
\t\t\t\t\tsessionStorage.removeItem( "qunit-filter-passed-tests" );\n
\t\t\t\t}\n
\t\t\t}\n
\t\t});\n
\n
\t\tif ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) {\n
\t\t\tfilter.checked = true;\n
\t\t\t// `ol` initialized at top of scope\n
\t\t\tol = id( "qunit-tests" );\n
\t\t\tol.className = ol.className + " hidepass";\n
\t\t}\n
\t\ttoolbar.appendChild( filter );\n
\n
\t\t// `label` initialized at top of scope\n
\t\tlabel = document.createElement( "label" );\n
\t\tlabel.setAttribute( "for", "qunit-filter-pass" );\n
\t\tlabel.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." );\n
\t\tlabel.innerHTML = "Hide passed tests";\n
\t\ttoolbar.appendChild( label );\n
\n
\t\turlConfigContainer = document.createElement("span");\n
\t\turlConfigContainer.innerHTML = urlConfigHtml;\n
\t\t// For oldIE support:\n
\t\t// * Add handlers to the individual elements instead of the container\n
\t\t// * Use "click" instead of "change" for checkboxes\n
\t\t// * Fallback from event.target to event.srcElement\n
\t\taddEvents( urlConfigContainer.getElementsByTagName("input"), "click", function( event ) {\n
\t\t\tvar params = {},\n
\t\t\t\ttarget = event.target || event.srcElement;\n
\t\t\tparams[ target.name ] = target.checked ?\n
\t\t\t\ttarget.defaultValue || true :\n
\t\t\t\tundefined;\n
\t\t\twindow.location = QUnit.url( params );\n
\t\t});\n
\t\taddEvents( urlConfigContainer.getElementsByTagName("select"), "change", function( event ) {\n
\t\t\tvar params = {},\n
\t\t\t\ttarget = event.target || event.srcElement;\n
\t\t\tparams[ target.name ] = target.options[ target.selectedIndex ].value || undefined;\n
\t\t\twindow.location = QUnit.url( params );\n
\t\t});\n
\t\ttoolbar.appendChild( urlConfigContainer );\n
\n
\t\tif (numModules > 1) {\n
\t\t\tmoduleFilter = document.createElement( "span" );\n
\t\t\tmoduleFilter.setAttribute( "id", "qunit-modulefilter-container" );\n
\t\t\tmoduleFilter.innerHTML = moduleFilterHtml;\n
\t\t\taddEvent( moduleFilter.lastChild, "change", function() {\n
\t\t\t\tvar selectBox = moduleFilter.getElementsByTagName("select")[0],\n
\t\t\t\t\tselectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value);\n
\n
\t\t\t\twindow.location = QUnit.url({\n
\t\t\t\t\tmodule: ( selectedModule === "" ) ? undefined : selectedModule,\n
\t\t\t\t\t// Remove any existing filters\n
\t\t\t\t\tfilter: undefined,\n
\t\t\t\t\ttestNumber: undefined\n
\t\t\t\t});\n
\t\t\t});\n
\t\t\ttoolbar.appendChild(moduleFilter);\n
\t\t}\n
\t}\n
\n
\t// `main` initialized at top of scope\n
\tmain = id( "qunit-fixture" );\n
\tif ( main ) {\n
\t\tconfig.fixture = main.innerHTML;\n
\t}\n
\n
\tif ( config.autostart ) {\n
\t\tQUnit.start();\n
\t}\n
};\n
\n
if ( defined.document ) {\n
\taddEvent( window, "load", QUnit.load );\n
}\n
\n
// `onErrorFnPrev` initialized at top of scope\n
// Preserve other handlers\n
onErrorFnPrev = window.onerror;\n
\n
// Cover uncaught exceptions\n
// Returning true will suppress the default browser handler,\n
// returning false will let it run.\n
window.onerror = function ( error, filePath, linerNr ) {\n
\tvar ret = false;\n
\tif ( onErrorFnPrev ) {\n
\t\tret = onErrorFnPrev( error, filePath, linerNr );\n
\t}\n
\n
\t// Treat return value as window.onerror itself does,\n
\t// Only do our handling if not suppressed.\n
\tif ( ret !== true ) {\n
\t\tif ( QUnit.config.current ) {\n
\t\t\tif ( QUnit.config.current.ignoreGlobalErrors ) {\n
\t\t\t\treturn true;\n
\t\t\t}\n
\t\t\tQUnit.pushFailure( error, filePath + ":" + linerNr );\n
\t\t} else {\n
\t\t\tQUnit.test( "global failure", extend( function() {\n
\t\t\t\tQUnit.pushFailure( error, filePath + ":" + linerNr );\n
\t\t\t}, { validTest: validTest } ) );\n
\t\t}\n
\t\treturn false;\n
\t}\n
\n
\treturn ret;\n
};\n
\n
function done() {\n
\tconfig.autorun = true;\n
\n
\t// Log the last module results\n
\tif ( config.previousModule ) {\n
\t\trunLoggingCallbacks( "moduleDone", QUnit, {\n
\t\t\tname: config.previousModule,\n
\t\t\tfailed: config.moduleStats.bad,\n
\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n
\t\t\ttotal: config.moduleStats.all\n
\t\t});\n
\t}\n
\tdelete config.previousModule;\n
\n
\tvar i, key,\n
\t\tbanner = id( "qunit-banner" ),\n
\t\ttests = id( "qunit-tests" ),\n
\t\truntime = +new Date() - config.started,\n
\t\tpassed = config.stats.all - config.stats.bad,\n
\t\thtml = [\n
\t\t\t"Tests completed in ",\n
\t\t\truntime,\n
\t\t\t" milliseconds.<br/>",\n
\t\t\t"<span class=\'passed\'>",\n
\t\t\tpassed,\n
\t\t\t"</span> assertions of <span class=\'total\'>",\n
\t\t\tconfig.stats.all,\n
\t\t\t"</span> passed, <span class=\'failed\'>",\n
\t\t\tconfig.stats.bad,\n
\t\t\t"</span> failed."\n
\t\t].join( "" );\n
\n
\tif ( banner ) {\n
\t\tbanner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" );\n
\t}\n
\n
\tif ( tests ) {\n
\t\tid( "qunit-testresult" ).innerHTML = html;\n
\t}\n
\n
\tif ( config.altertitle && defined.document && document.title ) {\n
\t\t// show ✖ for good, ✔ for bad suite result in title\n
\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n
\t\tdocument.title = [\n
\t\t\t( config.stats.bad ? "\\u2716" : "\\u2714" ),\n
\t\t\tdocument.title.replace( /^[\\u2714\\u2716] /i, "" )\n
\t\t].join( " " );\n
\t}\n
\n
\t// clear own sessionStorage items if all tests passed\n
\tif ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) {\n
\t\t// `key` & `i` initialized at top of scope\n
\t\tfor ( i = 0; i < sessionStorage.length; i++ ) {\n
\t\t\tkey = sessionStorage.key( i++ );\n
\t\t\tif ( key.indexOf( "qunit-test-" ) === 0 ) {\n
\t\t\t\tsessionStorage.removeItem( key );\n
\t\t\t}\n
\t\t}\n
\t}\n
\n
\t// scroll back to top to show results\n
\tif ( config.scrolltop && window.scrollTo ) {\n
\t\twindow.scrollTo(0, 0);\n
\t}\n
\n
\trunLoggingCallbacks( "done", QUnit, {\n
\t\tfailed: config.stats.bad,\n
\t\tpassed: passed,\n
\t\ttotal: config.stats.all,\n
\t\truntime: runtime\n
\t});\n
}\n
\n
/** @return Boolean: true if this test should be ran */\n
function validTest( test ) {\n
\tvar include,\n
\t\tfilter = config.filter && config.filter.toLowerCase(),\n
\t\tmodule = config.module && config.module.toLowerCase(),\n
\t\tfullName = ( test.module + ": " + test.testName ).toLowerCase();\n
\n
\t// Internally-generated tests are always valid\n
\tif ( test.callback && test.callback.validTest === validTest ) {\n
\t\tdelete test.callback.validTest;\n
\t\treturn true;\n
\t}\n
\n
\tif ( config.testNumber.length > 0 ) {\n
\t\tif ( inArray( test.testNumber, config.testNumber ) < 0 ) {\n
\t\t\treturn false;\n
\t\t}\n
\t}\n
\n
\tif ( module && ( !test.module || test.module.toLowerCase() !== module ) ) {\n
\t\treturn false;\n
\t}\n
\n
\tif ( !filter ) {\n
\t\treturn true;\n
\t}\n
\n
\tinclude = filter.charAt( 0 ) !== "!";\n
\tif ( !include ) {\n
\t\tfilter = filter.slice( 1 );\n
\t}\n
\n
\t// If the filter matches, we need to honour include\n
\tif ( fullName.indexOf( filter ) !== -1 ) {\n
\t\treturn include;\n
\t}\n
\n
\t// Otherwise, do the opposite\n
\treturn !include;\n
}\n
\n
// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions)\n
// Later Safari and IE10 are supposed to support error.stack as well\n
// See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\n
function extractStacktrace( e, offset ) {\n
\toffset = offset === undefined ? 3 : offset;\n
\n
\tvar stack, include, i;\n
\n
\tif ( e.stacktrace ) {\n
\t\t// Opera\n
\t\treturn e.stacktrace.split( "\\n" )[ offset + 3 ];\n
\t} else if ( e.stack ) {\n
\t\t// Firefox, Chrome\n
\t\tstack = e.stack.split( "\\n" );\n
\t\tif (/^error$/i.test( stack[0] ) ) {\n
\t\t\tstack.shift();\n
\t\t}\n
\t\tif ( fileName ) {\n
\t\t\tinclude = [];\n
\t\t\tfor ( i = offset; i < stack.length; i++ ) {\n
\t\t\t\tif ( stack[ i ].indexOf( fileName ) !== -1 ) {\n
\t\t\t\t\tbreak;\n
\t\t\t\t}\n
\t\t\t\tinclude.push( stack[ i ] );\n
\t\t\t}\n
\t\t\tif ( include.length ) {\n
\t\t\t\treturn include.join( "\\n" );\n
\t\t\t}\n
\t\t}\n
\t\treturn stack[ offset ];\n
\t} else if ( e.sourceURL ) {\n
\t\t// Safari, PhantomJS\n
\t\t// hopefully one day Safari provides actual stacktraces\n
\t\t// exclude useless self-reference for generated Error objects\n
\t\tif ( /qunit.js$/.test( e.sourceURL ) ) {\n
\t\t\treturn;\n
\t\t}\n
\t\t// for actual exceptions, this is useful\n
\t\treturn e.sourceURL + ":" + e.line;\n
\t}\n
}\n
function sourceFromStacktrace( offset ) {\n
\ttry {\n
\t\tthrow new Error();\n
\t} catch ( e ) {\n
\t\treturn extractStacktrace( e, offset );\n
\t}\n
}\n
\n
/**\n
* Escape text for attribute or text content.\n
*/\n
function escapeText( s ) {\n
\tif ( !s ) {\n
\t\treturn "";\n
\t}\n
\ts = s + "";\n
\t// Both single quotes and double quotes (for attributes)\n
\treturn s.replace( /[\'"<>&]/g, function( s ) {\n
\t\tswitch( s ) {\n
\t\t\tcase "\'":\n
\t\t\t\treturn "&#039;";\n
\t\t\tcase "\\"":\n
\t\t\t\treturn "&quot;";\n
\t\t\tcase "<":\n
\t\t\t\treturn "&lt;";\n
\t\t\tcase ">":\n
\t\t\t\treturn "&gt;";\n
\t\t\tcase "&":\n
\t\t\t\treturn "&amp;";\n
\t\t}\n
\t});\n
}\n
\n
function synchronize( callback, last ) {\n
\tconfig.queue.push( callback );\n
\n
\tif ( config.autorun && !config.blocking ) {\n
\t\tprocess( last );\n
\t}\n
}\n
\n
function process( last ) {\n
\tfunction next() {\n
\t\tprocess( last );\n
\t}\n
\tvar start = new Date().getTime();\n
\tconfig.depth = config.depth ? config.depth + 1 : 1;\n
\n
\twhile ( config.queue.length && !config.blocking ) {\n
\t\tif ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) {\n
\t\t\tconfig.queue.shift()();\n
\t\t} else {\n
\t\t\tsetTimeout( next, 13 );\n
\t\t\tbreak;\n
\t\t}\n
\t}\n
\tconfig.depth--;\n
\tif ( last && !config.blocking && !config.queue.length && config.depth === 0 ) {\n
\t\tdone();\n
\t}\n
}\n
\n
function saveGlobal() {\n
\tconfig.pollution = [];\n
\n
\tif ( config.noglobals ) {\n
\t\tfor ( var key in window ) {\n
\t\t\tif ( hasOwn.call( window, key ) ) {\n
\t\t\t\t// in Opera sometimes DOM element ids show up here, ignore them\n
\t\t\t\tif ( /^qunit-test-output/.test( key ) ) {\n
\t\t\t\t\tcontinue;\n
\t\t\t\t}\n
\t\t\t\tconfig.pollution.push( key );\n
\t\t\t}\n
\t\t}\n
\t}\n
}\n
\n
function checkPollution() {\n
\tvar newGlobals,\n
\t\tdeletedGlobals,\n
\t\told = config.pollution;\n
\n
\tsaveGlobal();\n
\n
\tnewGlobals = diff( config.pollution, old );\n
\tif ( newGlobals.length > 0 ) {\n
\t\tQUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") );\n
\t}\n
\n
\tdeletedGlobals = diff( old, config.pollution );\n
\tif ( deletedGlobals.length > 0 ) {\n
\t\tQUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") );\n
\t}\n
}\n
\n
// returns a new Array with the elements that are in a but not in b\n
function diff( a, b ) {\n
\tvar i, j,\n
\t\tresult = a.slice();\n
\n
\tfor ( i = 0; i < result.length; i++ ) {\n
\t\tfor ( j = 0; j < b.length; j++ ) {\n
\t\t\tif ( result[i] === b[j] ) {\n
\t\t\t\tresult.splice( i, 1 );\n
\t\t\t\ti--;\n
\t\t\t\tbreak;\n
\t\t\t}\n
\t\t}\n
\t}\n
\treturn result;\n
}\n
\n
function extend( a, b ) {\n
\tfor ( var prop in b ) {\n
\t\tif ( hasOwn.call( b, prop ) ) {\n
\t\t\t// Avoid "Member not found" error in IE8 caused by messing with window.constructor\n
\t\t\tif ( !( prop === "constructor" && a === window ) ) {\n
\t\t\t\tif ( b[ prop ] === undefined ) {\n
\t\t\t\t\tdelete a[ prop ];\n
\t\t\t\t} else {\n
\t\t\t\t\ta[ prop ] = b[ prop ];\n
\t\t\t\t}\n
\t\t\t}\n
\t\t}\n
\t}\n
\n
\treturn a;\n
}\n
\n
/**\n
* @param {HTMLElement} elem\n
* @param {string} type\n
* @param {Function} fn\n
*/\n
function addEvent( elem, type, fn ) {\n
\tif ( elem.addEventListener ) {\n
\n
\t\t// Standards-based browsers\n
\t\telem.addEventListener( type, fn, false );\n
\t} else if ( elem.attachEvent ) {\n
\n
\t\t// support: IE <9\n
\t\telem.attachEvent( "on" + type, fn );\n
\t} else {\n
\n
\t\t// Caller must ensure support for event listeners is present\n
\t\tthrow new Error( "addEvent() was called in a context without event listener support" );\n
\t}\n
}\n
\n
/**\n
* @param {Array|NodeList} elems\n
* @param {string} type\n
* @param {Function} fn\n
*/\n
function addEvents( elems, type, fn ) {\n
\tvar i = elems.length;\n
\twhile ( i-- ) {\n
\t\taddEvent( elems[i], type, fn );\n
\t}\n
}\n
\n
function hasClass( elem, name ) {\n
\treturn (" " + elem.className + " ").indexOf(" " + name + " ") > -1;\n
}\n
\n
function addClass( elem, name ) {\n
\tif ( !hasClass( elem, name ) ) {\n
\t\telem.className += (elem.className ? " " : "") + name;\n
\t}\n
}\n
\n
function removeClass( elem, name ) {\n
\tvar set = " " + elem.className + " ";\n
\t// Class name may appear multiple times\n
\twhile ( set.indexOf(" " + name + " ") > -1 ) {\n
\t\tset = set.replace(" " + name + " " , " ");\n
\t}\n
\t// If possible, trim it for prettiness, but not necessarily\n
\telem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\\s+|\\s+$/g, "");\n
}\n
\n
function id( name ) {\n
\treturn defined.document && document.getElementById && document.getElementById( name );\n
}\n
\n
function registerLoggingCallback( key ) {\n
\treturn function( callback ) {\n
\t\tconfig[key].push( callback );\n
\t};\n
}\n
\n
// Supports deprecated method of completely overwriting logging callbacks\n
function runLoggingCallbacks( key, scope, args ) {\n
\tvar i, callbacks;\n
\tif ( QUnit.hasOwnProperty( key ) ) {\n
\t\tQUnit[ key ].call(scope, args );\n
\t} else {\n
\t\tcallbacks = config[ key ];\n
\t\tfor ( i = 0; i < callbacks.length; i++ ) {\n
\t\t\tcallbacks[ i ].call( scope, args );\n
\t\t}\n
\t}\n
}\n
\n
// from jquery.js\n
function inArray( elem, array ) {\n
\tif ( array.indexOf ) {\n
\t\treturn array.indexOf( elem );\n
\t}\n
\n
\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n
\t\tif ( array[ i ] === elem ) {\n
\t\t\treturn i;\n
\t\t}\n
\t}\n
\n
\treturn -1;\n
}\n
\n
function Test( settings ) {\n
\textend( this, settings );\n
\tthis.assertions = [];\n
\tthis.testNumber = ++Test.count;\n
}\n
\n
Test.count = 0;\n
\n
Test.prototype = {\n
\tinit: function() {\n
\t\tvar a, b, li,\n
\t\t\ttests = id( "qunit-tests" );\n
\n
\t\tif ( tests ) {\n
\t\t\tb = document.createElement( "strong" );\n
\t\t\tb.innerHTML = this.nameHtml;\n
\n
\t\t\t// `a` initialized at top of scope\n
\t\t\ta = document.createElement( "a" );\n
\t\t\ta.innerHTML = "Rerun";\n
\t\t\ta.href = QUnit.url({ testNumber: this.testNumber });\n
\n
\t\t\tli = document.createElement( "li" );\n
\t\t\tli.appendChild( b );\n
\t\t\tli.appendChild( a );\n
\t\t\tli.className = "running";\n
\t\t\tli.id = this.id = "qunit-test-output" + testId++;\n
\n
\t\t\ttests.appendChild( li );\n
\t\t}\n
\t},\n
\tsetup: function() {\n
\t\tif (\n
\t\t\t// Emit moduleStart when we\'re switching from one module to another\n
\t\t\tthis.module !== config.previousModule ||\n
\t\t\t\t// They could be equal (both undefined) but if the previousModule property doesn\'t\n
\t\t\t\t// yet exist it means this is the first test in a suite that isn\'t wrapped in a\n
\t\t\t\t// module, in which case we\'ll just emit a moduleStart event for \'undefined\'.\n
\t\t\t\t// Without this, reporters can get testStart before moduleStart which is a problem.\n
\t\t\t\t!hasOwn.call( config, "previousModule" )\n
\t\t) {\n
\t\t\tif ( hasOwn.call( config, "previousModule" ) ) {\n
\t\t\t\trunLoggingCallbacks( "moduleDone", QUnit, {\n
\t\t\t\t\tname: config.previousModule,\n
\t\t\t\t\tfailed: config.moduleStats.bad,\n
\t\t\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n
\t\t\t\t\ttotal: config.moduleStats.all\n
\t\t\t\t});\n
\t\t\t}\n
\t\t\tconfig.previousModule = this.module;\n
\t\t\tconfig.moduleStats = { all: 0, bad: 0 };\n
\t\t\trunLoggingCallbacks( "moduleStart", QUnit, {\n
\t\t\t\tname: this.module\n
\t\t\t});\n
\t\t}\n
\n
\t\tconfig.current = this;\n
\n
\t\tthis.testEnvironment = extend({\n
\t\t\tsetup: function() {},\n
\t\t\tteardown: function() {}\n
\t\t}, this.moduleTestEnvironment );\n
\n
\t\tthis.started = +new Date();\n
\t\trunLoggingCallbacks( "testStart", QUnit, {\n
\t\t\tname: this.testName,\n
\t\t\tmodule: this.module\n
\t\t});\n
\n
\t\t/*jshint camelcase:false */\n
\n
\n
\t\t/**\n
\t\t * Expose the current test environment.\n
\t\t *\n
\t\t * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead.\n
\t\t */\n
\t\tQUnit.current_testEnvironment = this.testEnvironment;\n
\n
\t\t/*jshint camelcase:true */\n
\n
\t\tif ( !config.pollution ) {\n
\t\t\tsaveGlobal();\n
\t\t}\n
\t\tif ( config.notrycatch ) {\n
\t\t\tthis.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );\n
\t\t\treturn;\n
\t\t}\n
\t\ttry {\n
\t\t\tthis.testEnvironment.setup.call( this.testEnvironment, QUnit.assert );\n
\t\t} catch( e ) {\n
\t\t\tQUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );\n
\t\t}\n
\t},\n
\trun: function() {\n
\t\tconfig.current = this;\n
\n
\t\tvar running = id( "qunit-testresult" );\n
\n
\t\tif ( running ) {\n
\t\t\trunning.innerHTML = "Running: <br/>" + this.nameHtml;\n
\t\t}\n
\n
\t\tif ( this.async ) {\n
\t\t\tQUnit.stop();\n
\t\t}\n
\n
\t\tthis.callbackStarted = +new Date();\n
\n
\t\tif ( config.notrycatch ) {\n
\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n
\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n
\t\t\treturn;\n
\t\t}\n
\n
\t\ttry {\n
\t\t\tthis.callback.call( this.testEnvironment, QUnit.assert );\n
\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n
\t\t} catch( e ) {\n
\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n
\n
\t\t\tQUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );\n
\t\t\t// else next test will carry the responsibility\n
\t\t\tsaveGlobal();\n
\n
\t\t\t// Restart the tests if they\'re blocking\n
\t\t\tif ( config.blocking ) {\n
\t\t\t\tQUnit.start();\n
\t\t\t}\n
\t\t}\n
\t},\n
\tteardown: function() {\n
\t\tconfig.current = this;\n
\t\tif ( config.notrycatch ) {\n
\t\t\tif ( typeof this.callbackRuntime === "undefined" ) {\n
\t\t\t\tthis.callbackRuntime = +new Date() - this.callbackStarted;\n
\t\t\t}\n
\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );\n
\t\t\treturn;\n
\t\t} else {\n
\t\t\ttry {\n
\t\t\t\tthis.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert );\n
\t\t\t} catch( e ) {\n
\t\t\t\tQUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) );\n
\t\t\t}\n
\t\t}\n
\t\tcheckPollution();\n
\t},\n
\tfinish: function() {\n
\t\tconfig.current = this;\n
\t\tif ( config.requireExpects && this.expected === null ) {\n
\t\t\tQUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack );\n
\t\t} else if ( this.expected !== null && this.expected !== this.assertions.length ) {\n
\t\t\tQUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack );\n
\t\t} else if ( this.expected === null && !this.assertions.length ) {\n
\t\t\tQUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack );\n
\t\t}\n
\n
\t\tvar i, assertion, a, b, time, li, ol,\n
\t\t\ttest = this,\n
\t\t\tgood = 0,\n
\t\t\tbad = 0,\n
\t\t\ttests = id( "qunit-tests" );\n
\n
\t\tthis.runtime = +new Date() - this.started;\n
\t\tconfig.stats.all += this.assertions.length;\n
\t\tconfig.moduleStats.all += this.assertions.length;\n
\n
\t\tif ( tests ) {\n
\t\t\tol = document.createElement( "ol" );\n
\t\t\tol.className = "qunit-assert-list";\n
\n
\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n
\t\t\t\tassertion = this.assertions[i];\n
\n
\t\t\t\tli = document.createElement( "li" );\n
\t\t\t\tli.className = assertion.result ? "pass" : "fail";\n
\t\t\t\tli.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" );\n
\t\t\t\tol.appendChild( li );\n
\n
\t\t\t\tif ( assertion.result ) {\n
\t\t\t\t\tgood++;\n
\t\t\t\t} else {\n
\t\t\t\t\tbad++;\n
\t\t\t\t\tconfig.stats.bad++;\n
\t\t\t\t\tconfig.moduleStats.bad++;\n
\t\t\t\t}\n
\t\t\t}\n
\n
\t\t\t// store result when possible\n
\t\t\tif ( QUnit.config.reorder && defined.sessionStorage ) {\n
\t\t\t\tif ( bad ) {\n
\t\t\t\t\tsessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad );\n
\t\t\t\t} else {\n
\t\t\t\t\tsessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName );\n
\t\t\t\t}\n
\t\t\t}\n
\n
\t\t\tif ( bad === 0 ) {\n
\t\t\t\taddClass( ol, "qunit-collapsed" );\n
\t\t\t}\n
\n
\t\t\t// `b` initialized at top of scope\n
\t\t\tb = document.createElement( "strong" );\n
\t\t\tb.innerHTML = this.nameHtml + " <b class=\'counts\'>(<b class=\'failed\'>" + bad + "</b>, <b class=\'passed\'>" + good + "</b>, " + this.assertions.length + ")</b>";\n
\n
\t\t\taddEvent(b, "click", function() {\n
\t\t\t\tvar next = b.parentNode.lastChild,\n
\t\t\t\t\tcollapsed = hasClass( next, "qunit-collapsed" );\n
\t\t\t\t( collapsed ? removeClass : addClass )( next, "qunit-collapsed" );\n
\t\t\t});\n
\n
\t\t\taddEvent(b, "dblclick", function( e ) {\n
\t\t\t\tvar target = e && e.target ? e.target : window.event.srcElement;\n
\t\t\t\tif ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) {\n
\t\t\t\t\ttarget = target.parentNode;\n
\t\t\t\t}\n
\t\t\t\tif ( window.location && target.nodeName.toLowerCase() === "strong" ) {\n
\t\t\t\t\twindow.location = QUnit.url({ testNumber: test.testNumber });\n
\t\t\t\t}\n
\t\t\t});\n
\n
\t\t\t// `time` initialized at top of scope\n
\t\t\ttime = document.createElement( "span" );\n
\t\t\ttime.className = "runtime";\n
\t\t\ttime.innerHTML = this.runtime + " ms";\n
\n
\t\t\t// `li` initialized at top of scope\n
\t\t\tli = id( this.id );\n
\t\t\tli.className = bad ? "fail" : "pass";\n
\t\t\tli.removeChild( li.firstChild );\n
\t\t\ta = li.firstChild;\n
\t\t\tli.appendChild( b );\n
\t\t\tli.appendChild( a );\n
\t\t\tli.appendChild( time );\n
\t\t\tli.appendChild( ol );\n
\n
\t\t} else {\n
\t\t\tfor ( i = 0; i < this.assertions.length; i++ ) {\n
\t\t\t\tif ( !this.assertions[i].result ) {\n
\t\t\t\t\tbad++;\n
\t\t\t\t\tconfig.stats.bad++;\n
\t\t\t\t\tconfig.moduleStats.bad++;\n
\t\t\t\t}\n
\t\t\t}\n
\t\t}\n
\n
\t\trunLoggingCallbacks( "testDone", QUnit, {\n
\t\t\tname: this.testName,\n
\t\t\tmodule: this.module,\n
\t\t\tfailed: bad,\n
\t\t\tpassed: this.assertions.length - bad,\n
\t\t\ttotal: this.assertions.length,\n
\t\t\truntime: this.runtime,\n
\t\t\t// DEPRECATED: this property will be removed in 2.0.0, use runtime instead\n
\t\t\tduration: this.runtime\n
\t\t});\n
\n
\t\tQUnit.reset();\n
\n
\t\tconfig.current = undefined;\n
\t},\n
\n
\tqueue: function() {\n
\t\tvar bad,\n
\t\t\ttest = this;\n
\n
\t\tsynchronize(function() {\n
\t\t\ttest.init();\n
\t\t});\n
\t\tfunction run() {\n
\t\t\t// each of these can by async\n
\t\t\tsynchronize(function() {\n
\t\t\t\ttest.setup();\n
\t\t\t});\n
\t\t\tsynchronize(function() {\n
\t\t\t\ttest.run();\n
\t\t\t});\n
\t\t\tsynchronize(function() {\n
\t\t\t\ttest.teardown();\n
\t\t\t});\n
\t\t\tsynchronize(function() {\n
\t\t\t\ttest.finish();\n
\t\t\t});\n
\t\t}\n
\n
\t\t// `bad` initialized at top of scope\n
\t\t// defer when previous test run passed, if storage is available\n
\t\tbad = QUnit.config.reorder && defined.sessionStorage &&\n
\t\t\t\t\t\t+sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName );\n
\n
\t\tif ( bad ) {\n
\t\t\trun();\n
\t\t} else {\n
\t\t\tsynchronize( run, true );\n
\t\t}\n
\t}\n
};\n
\n
// `assert` initialized at top of scope\n
// Assert helpers\n
// All of these must either call QUnit.push() or manually do:\n
// - runLoggingCallbacks( "log", .. );\n
// - config.current.assertions.push({ .. });\n
assert = QUnit.assert = {\n
\t/**\n
\t * Asserts rough true-ish result.\n
\t * @name ok\n
\t * @function\n
\t * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" );\n
\t */\n
\tok: function( result, msg ) {\n
\t\tif ( !config.current ) {\n
\t\t\tthrow new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) );\n
\t\t}\n
\t\tresult = !!result;\n
\t\tmsg = msg || ( result ? "okay" : "failed" );\n
\n
\t\tvar source,\n
\t\t\tdetails = {\n
\t\t\t\tmodule: config.current.module,\n
\t\t\t\tname: config.current.testName,\n
\t\t\t\tresult: result,\n
\t\t\t\tmessage: msg\n
\t\t\t};\n
\n
\t\tmsg = "<span class=\'test-message\'>" + escapeText( msg ) + "</span>";\n
\n
\t\tif ( !result ) {\n
\t\t\tsource = sourceFromStacktrace( 2 );\n
\t\t\tif ( source ) {\n
\t\t\t\tdetails.source = source;\n
\t\t\t\tmsg += "<table><tr class=\'test-source\'><th>Source: </th><td><pre>" +\n
\t\t\t\t\tescapeText( source ) +\n
\t\t\t\t\t"</pre></td></tr></table>";\n
\t\t\t}\n
\t\t}\n
\t\trunLoggingCallbacks( "log", QUnit, details );\n
\t\tconfig.current.assertions.push({\n
\t\t\tresult: result,\n
\t\t\tmessage: msg\n
\t\t});\n
\t},\n
\n
\t/**\n
\t * Assert that the first two arguments are equal, with an optional message.\n
\t * Prints out both actual and expected values.\n
\t * @name equal\n
\t * @function\n
\t * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" );\n
\t */\n
\tequal: function( actual, expected, message ) {\n
\t\t/*jshint eqeqeq:false */\n
\t\tQUnit.push( expected == actual, actual, expected, message );\n
\t},\n
\n
\t/**\n
\t * @name notEqual\n
\t * @function\n
\t */\n
\tnotEqual: function( actual, expected, message ) {\n
\t\t/*jshint eqeqeq:false */\n
\t\tQUnit.push( expected != actual, actual, expected, message );\n
\t},\n
\n
\t/**\n
\t * @name propEqual\n
\t * @function\n
\t */\n
\tpropEqual: function( actual, expected, message ) {\n
\t\tactual = objectValues(actual);\n
\t\texpected = objectValues(expected);\n
\t\tQUnit.push( QUnit.equiv(actual, expected), actual, expected, message );\n
\t},\n
\n
\t/**\n
\t * @name notPropEqual\n
\t * @function\n
\t */\n
\tnotPropEqual: function( actual, expected, message ) {\n
\t\tactual = objectValues(actual);\n
\t\texpected = objectValues(expected);\n
\t\tQUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );\n
\t},\n
\n
\t/**\n
\t * @name deepEqual\n
\t * @function\n
\t */\n
\tdeepEqual: function( actual, expected, message ) {\n
\t\tQUnit.push( QUnit.equiv(actual, expected), actual, expected, message );\n
\t},\n
\n
\t/**\n
\t * @name notDeepEqual\n
\t * @function\n
\t */\n
\tnotDeepEqual: function( actual, expected, message ) {\n
\t\tQUnit.push( !QUnit.equiv(actual, expected), actual, expected, message );\n
\t},\n
\n
\t/**\n
\t * @name strictEqual\n
\t * @function\n
\t */\n
\tstrictEqual: function( actual, expected, message ) {\n
\t\tQUnit.push( expected === actual, actual, expected, message );\n
\t},\n
\n
\t/**\n
\t * @name notStrictEqual\n
\t * @function\n
\t */\n
\tnotStrictEqual: function( actual, expected, message ) {\n
\t\tQUnit.push( expected !== actual, actual, expected, message );\n
\t},\n
\n
\t"throws": function( block, expected, message ) {\n
\t\tvar actual,\n
\t\t\texpectedOutput = expected,\n
\t\t\tok = false;\n
\n
\t\t// \'expected\' is optional\n
\t\tif ( !message && typeof expected === "string" ) {\n
\t\t\tmessage = expected;\n
\t\t\texpected = null;\n
\t\t}\n
\n
\t\tconfig.current.ignoreGlobalErrors = true;\n
\t\ttry {\n
\t\t\tblock.call( config.current.testEnvironment );\n
\t\t} catch (e) {\n
\t\t\tactual = e;\n
\t\t}\n
\t\tconfig.current.ignoreGlobalErrors = false;\n
\n
\t\tif ( actual ) {\n
\n
\t\t\t// we don\'t want to validate thrown error\n
\t\t\tif ( !expected ) {\n
\t\t\t\tok = true;\n
\t\t\t\texpectedOutput = null;\n
\n
\t\t\t// expected is an Error object\n
\t\t\t} else if ( expected instanceof Error ) {\n
\t\t\t\tok = actual instanceof Error &&\n
\t\t\t\t\t actual.name === expected.name &&\n
\t\t\t\t\t actual.message === expected.message;\n
\n
\t\t\t// expected is a regexp\n
\t\t\t} else if ( QUnit.objectType( expected ) === "regexp" ) {\n
\t\t\t\tok = expected.test( errorString( actual ) );\n
\n
\t\t\t// expected is a string\n
\t\t\t} else if ( QUnit.objectType( expected ) === "string" ) {\n
\t\t\t\tok = expected === errorString( actual );\n
\n
\t\t\t// expected is a constructor\n
\t\t\t} else if ( actual instanceof expected ) {\n
\t\t\t\tok = true;\n
\n
\t\t\t// expected is a validation function which returns true is validation passed\n
\t\t\t} else if ( expected.call( {}, actual ) === true ) {\n
\t\t\t\texpectedOutput = null;\n
\t\t\t\tok = true;\n
\t\t\t}\n
\n
\t\t\tQUnit.push( ok, actual, expectedOutput, message );\n
\t\t} else {\n
\t\t\tQUnit.pushFailure( message, null, "No exception was thrown." );\n
\t\t}\n
\t}\n
};\n
\n
/**\n
* @deprecated since 1.8.0\n
* Kept assertion helpers in root for backwards compatibility.\n
*/\n
extend( QUnit.constructor.prototype, assert );\n
\n
/**\n
* @deprecated since 1.9.0\n
* Kept to avoid TypeErrors for undefined methods.\n
*/\n
QUnit.constructor.prototype.raises = function() {\n
\tQUnit.push( false, false, false, "QUnit.raises has been deprecated since 2012 (fad3c1ea), use QUnit.throws instead" );\n
};\n
\n
/**\n
* @deprecated since 1.0.0, replaced with error pushes since 1.3.0\n
* Kept to avoid TypeErrors for undefined methods.\n
*/\n
QUnit.constructor.prototype.equals = function() {\n
\tQUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" );\n
};\n
QUnit.constructor.prototype.same = function() {\n
\tQUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" );\n
};\n
\n
// Test for equality any JavaScript type.\n
// Author: Philippe Rathé <prathe@gmail.com>\n
QUnit.equiv = (function() {\n
\n
\t// Call the o related callback with the given arguments.\n
\tfunction bindCallbacks( o, callbacks, args ) {\n
\t\tvar prop = QUnit.objectType( o );\n
\t\tif ( prop ) {\n
\t\t\tif ( QUnit.objectType( callbacks[ prop ] ) === "function" ) {\n
\t\t\t\treturn callbacks[ prop ].apply( callbacks, args );\n
\t\t\t} else {\n
\t\t\t\treturn callbacks[ prop ]; // or undefined\n
\t\t\t}\n
\t\t}\n
\t}\n
\n
\t// the real equiv function\n
\tvar innerEquiv,\n
\t\t// stack to decide between skip/abort functions\n
\t\tcallers = [],\n
\t\t// stack to avoiding loops from circular referencing\n
\t\tparents = [],\n
\t\tparentsB = [],\n
\n
\t\tgetProto = Object.getPrototypeOf || function ( obj ) {\n
\t\t\t/*jshint camelcase:false */\n
\t\t\treturn obj.__proto__;\n
\t\t},\n
\t\tcallbacks = (function () {\n
\n
\t\t\t// for string, boolean, number and null\n
\t\t\tfunction useStrictEquality( b, a ) {\n
\t\t\t\t/*jshint eqeqeq:false */\n
\t\t\t\tif ( b instanceof a.constructor || a instanceof b.constructor ) {\n
\t\t\t\t\t// to catch short annotation VS \'new\' annotation of a\n
\t\t\t\t\t// declaration\n
\t\t\t\t\t// e.g. var i = 1;\n
\t\t\t\t\t// var j = new Number(1);\n
\t\t\t\t\treturn a == b;\n
\t\t\t\t} else {\n
\t\t\t\t\treturn a === b;\n
\t\t\t\t}\n
\t\t\t}\n
\n
\t\t\treturn {\n
\t\t\t\t"string": useStrictEquality,\n
\t\t\t\t"boolean": useStrictEquality,\n
\t\t\t\t"number": useStrictEquality,\n
\t\t\t\t"null": useStrictEquality,\n
\t\t\t\t"undefined": useStrictEquality,\n
\n
\t\t\t\t"nan": function( b ) {\n
\t\t\t\t\treturn isNaN( b );\n
\t\t\t\t},\n
\n
\t\t\t\t"date": function( b, a ) {\n
\t\t\t\t\treturn QUnit.objectType( b ) === "date" && a.valueOf() === b.valueOf();\n
\t\t\t\t},\n
\n
\t\t\t\t"regexp": function( b, a ) {\n
\t\t\t\t\treturn QUnit.objectType( b ) === "regexp" &&\n
\t\t\t\t\t\t// the regex itself\n
\t\t\t\t\t\ta.source === b.source &&\n
\t\t\t\t\t\t// and its modifiers\n
\t\t\t\t\t\ta.global === b.global &&\n
\t\t\t\t\t\t// (gmi) ...\n
\t\t\t\t\t\ta.ignoreCase === b.ignoreCase &&\n
\t\t\t\t\t\ta.multiline === b.multiline &&\n
\t\t\t\t\t\ta.sticky === b.sticky;\n
\t\t\t\t},\n
\n
\t\t\t\t// - skip when the property is a method of an instance (OOP)\n
\t\t\t\t// - abort otherwise,\n
\t\t\t\t// initial === would have catch identical references anyway\n
\t\t\t\t"function": function() {\n
\t\t\t\t\tvar caller = callers[callers.length - 1];\n
\t\t\t\t\treturn caller !== Object && typeof caller !== "undefined";\n
\t\t\t\t},\n
\n
\t\t\t\t"array": function( b, a ) {\n
\t\t\t\t\tvar i, j, len, loop, aCircular, bCircular;\n
\n
\t\t\t\t\t// b could be an object literal here\n
\t\t\t\t\tif ( QUnit.objectType( b ) !== "array" ) {\n
\t\t\t\t\t\treturn false;\n
\t\t\t\t\t}\n
\n
\t\t\t\t\tlen = a.length;\n
\t\t\t\t\tif ( len !== b.length ) {\n
\t\t\t\t\t\t// safe and faster\n
\t\t\t\t\t\treturn false;\n
\t\t\t\t\t}\n
\n
\t\t\t\t\t// track reference to avoid circular references\n
\t\t\t\t\tparents.push( a );\n
\t\t\t\t\tparentsB.push( b );\n
\t\t\t\t\tfor ( i = 0; i < len; i++ ) {\n
\t\t\t\t\t\tloop = false;\n
\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n
\t\t\t\t\t\t\taCircular = parents[j] === a[i];\n
\t\t\t\t\t\t\tbCircular = parentsB[j] === b[i];\n
\t\t\t\t\t\t\tif ( aCircular || bCircular ) {\n
\t\t\t\t\t\t\t\tif ( a[i] === b[i] || aCircular && bCircular ) {\n
\t\t\t\t\t\t\t\t\tloop = true;\n
\t\t\t\t\t\t\t\t} else {\n
\t\t\t\t\t\t\t\t\tparents.pop();\n
\t\t\t\t\t\t\t\t\tparentsB.pop();\n
\t\t\t\t\t\t\t\t\treturn false;\n
\t\t\t\t\t\t\t\t}\n
\t\t\t\t\t\t\t}\n
\t\t\t\t\t\t}\n
\t\t\t\t\t\tif ( !loop && !innerEquiv(a[i], b[i]) ) {\n
\t\t\t\t\t\t\tparents.pop();\n
\t\t\t\t\t\t\tparentsB.pop();\n
\t\t\t\t\t\t\treturn false;\n
\t\t\t\t\t\t}\n
\t\t\t\t\t}\n
\t\t\t\t\tparents.pop();\n
\t\t\t\t\tparentsB.pop();\n
\t\t\t\t\treturn true;\n
\t\t\t\t},\n
\n
\t\t\t\t"object": function( b, a ) {\n
\t\t\t\t\t/*jshint forin:false */\n
\t\t\t\t\tvar i, j, loop, aCircular, bCircular,\n
\t\t\t\t\t\t// Default to true\n
\t\t\t\t\t\teq = true,\n
\t\t\t\t\t\taProperties = [],\n
\t\t\t\t\t\tbProperties = [];\n
\n
\t\t\t\t\t// comparing constructors is more strict than using\n
\t\t\t\t\t// instanceof\n
\t\t\t\t\tif ( a.constructor !== b.constructor ) {\n
\t\t\t\t\t\t// Allow objects with no prototype to be equivalent to\n
\t\t\t\t\t\t// objects with Object as their constructor.\n
\t\t\t\t\t\tif ( !(( getProto(a) === null && getProto(b) === Object.prototype ) ||\n
\t\t\t\t\t\t\t( getProto(b) === null && getProto(a) === Object.prototype ) ) ) {\n
\t\t\t\t\t\t\t\treturn false;\n
\t\t\t\t\t\t}\n
\t\t\t\t\t}\n
\n
\t\t\t\t\t// stack constructor before traversing properties\n
\t\t\t\t\tcallers.push( a.constructor );\n
\n
\t\t\t\t\t// track reference to avoid circular references\n
\t\t\t\t\tparents.push( a );\n
\t\t\t\t\tparentsB.push( b );\n
\n
\t\t\t\t\t// be strict: don\'t ensure hasOwnProperty and go deep\n
\t\t\t\t\tfor ( i in a ) {\n
\t\t\t\t\t\tloop = false;\n
\t\t\t\t\t\tfor ( j = 0; j < parents.length; j++ ) {\n
\t\t\t\t\t\t\taCircular = parents[j] === a[i];\n
\t\t\t\t\t\t\tbCircular = parentsB[j] === b[i];\n
\t\t\t\t\t\t\tif ( aCircular || bCircular ) {\n
\t\t\t\t\t\t\t\tif ( a[i] === b[i] || aCircular && bCircular ) {\n
\t\t\t\t\t\t\t\t\tloop = true;\n
\t\t\t\t\t\t\t\t} else {\n
\t\t\t\t\t\t\t\t\teq = false;\n
\t\t\t\t\t\t\t\t\tbreak;\n
\t\t\t\t\t\t\t\t}\n
\t\t\t\t\t\t\t}\n
\t\t\t\t\t\t}\n
\t\t\t\t\t\taProperties.push(i);\n
\t\t\t\t\t\tif ( !loop && !innerEquiv(a[i], b[i]) ) {\n
\t\t\t\t\t\t\teq = false;\n
\t\t\t\t\t\t\tbreak;\n
\t\t\t\t\t\t}\n
\t\t\t\t\t}\n
\n
\t\t\t\t\tparents.pop();\n
\t\t\t\t\tparentsB.pop();\n
\t\t\t\t\tcallers.pop(); // unstack, we are done\n
\n
\t\t\t\t\tfor ( i in b ) {\n
\t\t\t\t\t\tbProperties.push( i ); // collect b\'s properties\n
\t\t\t\t\t}\n
\n
\t\t\t\t\t// Ensures identical properties name\n
\t\t\t\t\treturn eq && innerEquiv( aProperties.sort(), bProperties.sort() );\n
\t\t\t\t}\n
\t\t\t};\n
\t\t}());\n
\n
\tinnerEquiv = function() { // can take multiple arguments\n
\t\tvar args = [].slice.apply( arguments );\n
\t\tif ( args.length < 2 ) {\n
\t\t\treturn true; // end transition\n
\t\t}\n
\n
\t\treturn (function( a, b ) {\n
\t\t\tif ( a === b ) {\n
\t\t\t\treturn true; // catch the most you can\n
\t\t\t} else if ( a === null || b === null || typeof a === "undefined" ||\n
\t\t\t\t\ttypeof b === "undefined" ||\n
\t\t\t\t\tQUnit.objectType(a) !== QUnit.objectType(b) ) {\n
\t\t\t\treturn false; // don\'t lose time with error prone cases\n
\t\t\t} else {\n
\t\t\t\treturn bindCallbacks(a, callbacks, [ b, a ]);\n
\t\t\t}\n
\n
\t\t\t// apply transition with (1..n) arguments\n
\t\t}( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) );\n
\t};\n
\n
\treturn innerEquiv;\n
}());\n
\n
/**\n
* jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |\n
* http://flesler.blogspot.com Licensed under BSD\n
* (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008\n
*\n
* @projectDescription Advanced and extensible data dumping for Javascript.\n
* @version 1.0.0\n
* @author Ariel Flesler\n
* @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}\n
*/\n
QUnit.jsDump = (function() {\n
\tfunction quote( str ) {\n
\t\treturn "\\"" + str.toString().replace( /"/g, "\\\\\\"" ) + "\\"";\n
\t}\n
\tfunction literal( o ) {\n
\t\treturn o + "";\n
\t}\n
\tfunction join( pre, arr, post ) {\n
\t\tvar s = jsDump.separator(),\n
\t\t\tbase = jsDump.indent(),\n
\t\t\tinner = jsDump.indent(1);\n
\t\tif ( arr.join ) {\n
\t\t\tarr = arr.join( "," + s + inner );\n
\t\t}\n
\t\tif ( !arr ) {\n
\t\t\treturn pre + post;\n
\t\t}\n
\t\treturn [ pre, inner + arr, base + post ].join(s);\n
\t}\n
\tfunction array( arr, stack ) {\n
\t\tvar i = arr.length, ret = new Array(i);\n
\t\tthis.up();\n
\t\twhile ( i-- ) {\n
\t\t\tret[i] = this.parse( arr[i] , undefined , stack);\n
\t\t}\n
\t\tthis.down();\n
\t\treturn join( "[", ret, "]" );\n
\t}\n
\n
\tvar reName = /^function (\\w+)/,\n
\t\tjsDump = {\n
\t\t\t// type is used mostly internally, you can fix a (custom)type in advance\n
\t\t\tparse: function( obj, type, stack ) {\n
\t\t\t\tstack = stack || [ ];\n
\t\t\t\tvar inStack, res,\n
\t\t\t\t\tparser = this.parsers[ type || this.typeOf(obj) ];\n
\n
\t\t\t\ttype = typeof parser;\n
\t\t\t\tinStack = inArray( obj, stack );\n
\n
\t\t\t\tif ( inStack !== -1 ) {\n
\t\t\t\t\treturn "recursion(" + (inStack - stack.length) + ")";\n
\t\t\t\t}\n
\t\t\t\tif ( type === "function" ) {\n
\t\t\t\t\tstack.push( obj );\n
\t\t\t\t\tres = parser.call( this, obj, stack );\n
\t\t\t\t\tstack.pop();\n
\t\t\t\t\treturn res;\n
\t\t\t\t}\n
\t\t\t\treturn ( type === "string" ) ? parser : this.parsers.error;\n
\t\t\t},\n
\t\t\ttypeOf: function( obj ) {\n
\t\t\t\tvar type;\n
\t\t\t\tif ( obj === null ) {\n
\t\t\t\t\ttype = "null";\n
\t\t\t\t} else if ( typeof obj === "undefined" ) {\n
\t\t\t\t\ttype = "undefined";\n
\t\t\t\t} else if ( QUnit.is( "regexp", obj) ) {\n
\t\t\t\t\ttype = "regexp";\n
\t\t\t\t} else if ( QUnit.is( "date", obj) ) {\n
\t\t\t\t\ttype = "date";\n
\t\t\t\t} else if ( QUnit.is( "function", obj) ) {\n
\t\t\t\t\ttype = "function";\n
\t\t\t\t} else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) {\n
\t\t\t\t\ttype = "window";\n
\t\t\t\t} else if ( obj.nodeType === 9 ) {\n
\t\t\t\t\ttype = "document";\n
\t\t\t\t} else if ( obj.nodeType ) {\n
\t\t\t\t\ttype = "node";\n
\t\t\t\t} else if (\n
\t\t\t\t\t// native arrays\n
\t\t\t\t\ttoString.call( obj ) === "[object Array]" ||\n
\t\t\t\t\t// NodeList objects\n
\t\t\t\t\t( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) )\n
\t\t\t\t) {\n
\t\t\t\t\ttype = "array";\n
\t\t\t\t} else if ( obj.constructor === Error.prototype.constructor ) {\n
\t\t\t\t\ttype = "error";\n
\t\t\t\t} else {\n
\t\t\t\t\ttype = typeof obj;\n
\t\t\t\t}\n
\t\t\t\treturn type;\n
\t\t\t},\n
\t\t\tseparator: function() {\n
\t\t\t\treturn this.multiline ?\tthis.HTML ? "<br />" : "\\n" : this.HTML ? "&nbsp;" : " ";\n
\t\t\t},\n
\t\t\t// extra can be a number, shortcut for increasing-calling-decreasing\n
\t\t\tindent: function( extra ) {\n
\t\t\t\tif ( !this.multiline ) {\n
\t\t\t\t\treturn "";\n
\t\t\t\t}\n
\t\t\t\tvar chr = this.indentChar;\n
\t\t\t\tif ( this.HTML ) {\n
\t\t\t\t\tchr = chr.replace( /\\t/g, " " ).replace( / /g, "&nbsp;" );\n
\t\t\t\t}\n
\t\t\t\treturn new Array( this.depth + ( extra || 0 ) ).join(chr);\n
\t\t\t},\n
\t\t\tup: function( a ) {\n
\t\t\t\tthis.depth += a || 1;\n
\t\t\t},\n
\t\t\tdown: function( a ) {\n
\t\t\t\tthis.depth -= a || 1;\n
\t\t\t},\n
\t\t\tsetParser: function( name, parser ) {\n
\t\t\t\tthis.parsers[name] = parser;\n
\t\t\t},\n
\t\t\t// The next 3 are exposed so you can use them\n
\t\t\tquote: quote,\n
\t\t\tliteral: literal,\n
\t\t\tjoin: join,\n
\t\t\t//\n
\t\t\tdepth: 1,\n
\t\t\t// This is the list of parsers, to modify them, use jsDump.setParser\n
\t\t\tparsers: {\n
\t\t\t\twindow: "[Window]",\n
\t\t\t\tdocument: "[Document]",\n
\t\t\t\terror: function(error) {\n
\t\t\t\t\treturn "Error(\\"" + error.message + "\\")";\n
\t\t\t\t},\n
\t\t\t\tunknown: "[Unknown]",\n
\t\t\t\t"null": "null",\n
\t\t\t\t"undefined": "undefined",\n
\t\t\t\t"function": function( fn ) {\n
\t\t\t\t\tvar ret = "function",\n
\t\t\t\t\t\t// functions never have name in IE\n
\t\t\t\t\t\tname = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];\n
\n
\t\t\t\t\tif ( name ) {\n
\t\t\t\t\t\tret += " " + name;\n
\t\t\t\t\t}\n
\t\t\t\t\tret += "( ";\n
\n
\t\t\t\t\tret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" );\n
\t\t\t\t\treturn join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" );\n
\t\t\t\t},\n
\t\t\t\tarray: array,\n
\t\t\t\tnodelist: array,\n
\t\t\t\t"arguments": array,\n
\t\t\t\tobject: function( map, stack ) {\n
\t\t\t\t\t/*jshint forin:false */\n
\t\t\t\t\tvar ret = [ ], keys, key, val, i;\n
\t\t\t\t\tQUnit.jsDump.up();\n
\t\t\t\t\tkeys = [];\n
\t\t\t\t\tfor ( key in map ) {\n
\t\t\t\t\t\tkeys.push( key );\n
\t\t\t\t\t}\n
\t\t\t\t\tkeys.sort();\n
\t\t\t\t\tfor ( i = 0; i < keys.length; i++ ) {\n
\t\t\t\t\t\tkey = keys[ i ];\n
\t\t\t\t\t\tval = map[ key ];\n
\t\t\t\t\t\tret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) );\n
\t\t\t\t\t}\n
\t\t\t\t\tQUnit.jsDump.down();\n
\t\t\t\t\treturn join( "{", ret, "}" );\n
\t\t\t\t},\n
\t\t\t\tnode: function( node ) {\n
\t\t\t\t\tvar len, i, val,\n
\t\t\t\t\t\topen = QUnit.jsDump.HTML ? "&lt;" : "<",\n
\t\t\t\t\t\tclose = QUnit.jsDump.HTML ? "&gt;" : ">",\n
\t\t\t\t\t\ttag = node.nodeName.toLowerCase(),\n
\t\t\t\t\t\tret = open + tag,\n
\t\t\t\t\t\tattrs = node.attributes;\n
\n
\t\t\t\t\tif ( attrs ) {\n
\t\t\t\t\t\tfor ( i = 0, len = attrs.length; i < len; i++ ) {\n
\t\t\t\t\t\t\tval = attrs[i].nodeValue;\n
\t\t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly set.\n
\t\t\t\t\t\t\t// Those have values like undefined, null, 0, false, "" or "inherit".\n
\t\t\t\t\t\t\tif ( val && val !== "inherit" ) {\n
\t\t\t\t\t\t\t\tret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" );\n
\t\t\t\t\t\t\t}\n
\t\t\t\t\t\t}\n
\t\t\t\t\t}\n
\t\t\t\t\tret += close;\n
\n
\t\t\t\t\t// Show content of TextNode or CDATASection\n
\t\t\t\t\tif ( node.nodeType === 3 || node.nodeType === 4 ) {\n
\t\t\t\t\t\tret += node.nodeValue;\n
\t\t\t\t\t}\n
\n
\t\t\t\t\treturn ret + open + "/" + tag + close;\n
\t\t\t\t},\n
\t\t\t\t// function calls it internally, it\'s the arguments part of the function\n
\t\t\t\tfunctionArgs: function( fn ) {\n
\t\t\t\t\tvar args,\n
\t\t\t\t\t\tl = fn.length;\n
\n
\t\t\t\t\tif ( !l ) {\n
\t\t\t\t\t\treturn "";\n
\t\t\t\t\t}\n
\n
\t\t\t\t\targs = new Array(l);\n
\t\t\t\t\twhile ( l-- ) {\n
\t\t\t\t\t\t// 97 is \'a\'\n
\t\t\t\t\t\targs[l] = String.fromCharCode(97+l);\n
\t\t\t\t\t}\n
\t\t\t\t\treturn " " + args.join( ", " ) + " ";\n
\t\t\t\t},\n
\t\t\t\t// object calls it internally, the key part of an item in a map\n
\t\t\t\tkey: quote,\n
\t\t\t\t// function calls it internally, it\'s the content of the function\n
\t\t\t\tfunctionCode: "[code]",\n
\t\t\t\t// node calls it internally, it\'s an html attribute value\n
\t\t\t\tattribute: quote,\n
\t\t\t\tstring: quote,\n
\t\t\t\tdate: quote,\n
\t\t\t\tregexp: literal,\n
\t\t\t\tnumber: literal,\n
\t\t\t\t"boolean": literal\n
\t\t\t},\n
\t\t\t// if true, entities are escaped ( <, >, \\t, space and \\n )\n
\t\t\tHTML: false,\n
\t\t\t// indentation unit\n
\t\t\tindentChar: " ",\n
\t\t\t// if true, items in a collection, are separated by a \\n, else just a space.\n
\t\t\tmultiline: true\n
\t\t};\n
\n
\treturn jsDump;\n
}());\n
\n
/*\n
* Javascript Diff Algorithm\n
* By John Resig (http://ejohn.org/)\n
* Modified by Chu Alan "sprite"\n
*\n
* Released under the MIT license.\n
*\n
* More Info:\n
* http://ejohn.org/projects/javascript-diff-algorithm/\n
*\n
* Usage: QUnit.diff(expected, actual)\n
*\n
* QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over"\n
*/\n
QUnit.diff = (function() {\n
\t/*jshint eqeqeq:false, eqnull:true */\n
\tfunction diff( o, n ) {\n
\t\tvar i,\n
\t\t\tns = {},\n
\t\t\tos = {};\n
\n
\t\tfor ( i = 0; i < n.length; i++ ) {\n
\t\t\tif ( !hasOwn.call( ns, n[i] ) ) {\n
\t\t\t\tns[ n[i] ] = {\n
\t\t\t\t\trows: [],\n
\t\t\t\t\to: null\n
\t\t\t\t};\n
\t\t\t}\n
\t\t\tns[ n[i] ].rows.push( i );\n
\t\t}\n
\n
\t\tfor ( i = 0; i < o.length; i++ ) {\n
\t\t\tif ( !hasOwn.call( os, o[i] ) ) {\n
\t\t\t\tos[ o[i] ] = {\n
\t\t\t\t\trows: [],\n
\t\t\t\t\tn: null\n
\t\t\t\t};\n
\t\t\t}\n
\t\t\tos[ o[i] ].rows.push( i );\n
\t\t}\n
\n
\t\tfor ( i in ns ) {\n
\t\t\tif ( hasOwn.call( ns, i ) ) {\n
\t\t\t\tif ( ns[i].rows.length === 1 && hasOwn.call( os, i ) && os[i].rows.length === 1 ) {\n
\t\t\t\t\tn[ ns[i].rows[0] ] = {\n
\t\t\t\t\t\ttext: n[ ns[i].rows[0] ],\n
\t\t\t\t\t\trow: os[i].rows[0]\n
\t\t\t\t\t};\n
\t\t\t\t\to[ os[i].rows[0] ] = {\n
\t\t\t\t\t\ttext: o[ os[i].rows[0] ],\n
\t\t\t\t\t\trow: ns[i].rows[0]\n
\t\t\t\t\t};\n
\t\t\t\t}\n
\t\t\t}\n
\t\t}\n
\n
\t\tfor ( i = 0; i < n.length - 1; i++ ) {\n
\t\t\tif ( n[i].text != null && n[ i + 1 ].text == null && n[i].row + 1 < o.length && o[ n[i].row + 1 ].text == null &&\n
\t\t\t\t\t\tn[ i + 1 ] == o[ n[i].row + 1 ] ) {\n
\n
\t\t\t\tn[ i + 1 ] = {\n
\t\t\t\t\ttext: n[ i + 1 ],\n
\t\t\t\t\trow: n[i].row + 1\n
\t\t\t\t};\n
\t\t\t\to[ n[i].row + 1 ] = {\n
\t\t\t\t\ttext: o[ n[i].row + 1 ],\n
\t\t\t\t\trow: i + 1\n
\t\t\t\t};\n
\t\t\t}\n
\t\t}\n
\n
\t\tfor ( i = n.length - 1; i > 0; i-- ) {\n
\t\t\tif ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null &&\n
\t\t\t\t\t\tn[ i - 1 ] == o[ n[i].row - 1 ]) {\n
\n
\t\t\t\tn[ i - 1 ] = {\n
\t\t\t\t\ttext: n[ i - 1 ],\n
\t\t\t\t\trow: n[i].row - 1\n
\t\t\t\t};\n
\t\t\t\to[ n[i].row - 1 ] = {\n
\t\t\t\t\ttext: o[ n[i].row - 1 ],\n
\t\t\t\t\trow: i - 1\n
\t\t\t\t};\n
\t\t\t}\n
\t\t}\n
\n
\t\treturn {\n
\t\t\to: o,\n
\t\t\tn: n\n
\t\t};\n
\t}\n
\n
\treturn function( o, n ) {\n
\t\to = o.replace( /\\s+$/, "" );\n
\t\tn = n.replace( /\\s+$/, "" );\n
\n
\t\tvar i, pre,\n
\t\t\tstr = "",\n
\t\t\tout = diff( o === "" ? [] : o.split(/\\s+/), n === "" ? [] : n.split(/\\s+/) ),\n
\t\t\toSpace = o.match(/\\s+/g),\n
\t\t\tnSpace = n.match(/\\s+/g);\n
\n
\t\tif ( oSpace == null ) {\n
\t\t\toSpace = [ " " ];\n
\t\t}\n
\t\telse {\n
\t\t\toSpace.push( " " );\n
\t\t}\n
\n
\t\tif ( nSpace == null ) {\n
\t\t\tnSpace = [ " " ];\n
\t\t}\n
\t\telse {\n
\t\t\tnSpace.push( " " );\n
\t\t}\n
\n
\t\tif ( out.n.length === 0 ) {\n
\t\t\tfor ( i = 0; i < out.o.length; i++ ) {\n
\t\t\t\tstr += "<del>" + out.o[i] + oSpace[i] + "</del>";\n
\t\t\t}\n
\t\t}\n
\t\telse {\n
\t\t\tif ( out.n[0].text == null ) {\n
\t\t\t\tfor ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) {\n
\t\t\t\t\tstr += "<del>" + out.o[n] + oSpace[n] + "</del>";\n
\t\t\t\t}\n
\t\t\t}\n
\n
\t\t\tfor ( i = 0; i < out.n.length; i++ ) {\n
\t\t\t\tif (out.n[i].text == null) {\n
\t\t\t\t\tstr += "<ins>" + out.n[i] + nSpace[i] + "</ins>";\n
\t\t\t\t}\n
\t\t\t\telse {\n
\t\t\t\t\t// `pre` initialized at top of scope\n
\t\t\t\t\tpre = "";\n
\n
\t\t\t\t\tfor ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) {\n
\t\t\t\t\t\tpre += "<del>" + out.o[n] + oSpace[n] + "</del>";\n
\t\t\t\t\t}\n
\t\t\t\t\tstr += " " + out.n[i].text + nSpace[i] + pre;\n
\t\t\t\t}\n
\t\t\t}\n
\t\t}\n
\n
\t\treturn str;\n
\t};\n
}());\n
\n
// For browser, export only select globals\n
if ( typeof window !== "undefined" ) {\n
\textend( window, QUnit.constructor.prototype );\n
\twindow.QUnit = QUnit;\n
}\n
\n
// For CommonJS environments, export everything\n
if ( typeof module !== "undefined" && module.exports ) {\n
\tmodule.exports = QUnit;\n
}\n
\n
\n
// Get a reference to the global object, like window in browsers\n
}( (function() {\n
\treturn this;\n
})() ));\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>61033</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681768.93</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>renderjs.min.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>80955</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="Pdata" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*\n
* js_channel is a very lightweight abstraction on top of\n
* postMessage which defines message formats and semantics\n
* to support interactions more rich than just message passing\n
* js_channel supports:\n
* + query/response - traditional rpc\n
* + query/update/response - incremental async return of results\n
* to a query\n
* + notifications - fire and forget\n
* + error handling\n
*\n
* js_channel is based heavily on json-rpc, but is focused at the\n
* problem of inter-iframe RPC.\n
*\n
* Message types:\n
* There are 5 types of messages that can flow over this channel,\n
* and you may determine what type of message an object is by\n
* examining its parameters:\n
* 1. Requests\n
* + integer id\n
* + string method\n
* + (optional) any params\n
* 2. Callback Invocations (or just "Callbacks")\n
* + integer id\n
* + string callback\n
* + (optional) params\n
* 3. Error Responses (or just "Errors)\n
* + integer id\n
* + string error\n
* + (optional) string message\n
* 4. Responses\n
* + integer id\n
* + (optional) any result\n
* 5. Notifications\n
* + string method\n
* + (optional) any params\n
*/\n
\n
;var Channel = (function() {\n
"use strict";\n
\n
// current transaction id, start out at a random *odd* number between 1 and a million\n
// There is one current transaction counter id per page, and it\'s shared between\n
// channel instances. That means of all messages posted from a single javascript\n
// evaluation context, we\'ll never have two with the same id.\n
var s_curTranId = Math.floor(Math.random()*1000001);\n
\n
// no two bound channels in the same javascript evaluation context may have the same origin, scope, and window.\n
// futher if two bound channels have the same window and scope, they may not have *overlapping* origins\n
// (either one or both support \'*\'). This restriction allows a single onMessage handler to efficiently\n
// route messages based on origin and scope. The s_boundChans maps origins to scopes, to message\n
// handlers. Request and Notification messages are routed using this table.\n
// Finally, channels are inserted into this table when built, and removed when destroyed.\n
var s_boundChans = { };\n
\n
// add a channel to s_boundChans, throwing if a dup exists\n
function s_addBoundChan(win, origin, scope, handler) {\n
function hasWin(arr) {\n
for (var i = 0; i < arr.length; i++) if (arr[i].win === win) return true;\n
return false;\n
}\n
\n
// does she exist?\n
var exists = false;\n
\n
\n
if (origin === \'*\') {\n
// we must check all other origins, sadly.\n
for (var k in s_boundChans) {\n
if (!s_boundChans.hasOwnProperty(k)) continue;\n
if (k === \'*\') continue;\n
if (typeof s_boundChans[k][scope] === \'object\') {\n
exists = hasWin(s_boundChans[k][scope]);\n
if (exists) break;\n
}\n
}\n
} else {\n
// we must check only \'*\'\n
if ((s_boundChans[\'*\'] && s_boundChans[\'*\'][scope])) {\n
exists = hasWin(s_boundChans[\'*\'][scope]);\n
}\n
if (!exists && s_boundChans[origin] && s_boundChans[origin][scope])\n
{\n
exists = hasWin(s_boundChans[origin][scope]);\n
}\n
}\n
if (exists) throw "A channel is already bound to the same window which overlaps with origin \'"+ origin +"\' and has scope \'"+scope+"\'";\n
\n
if (typeof s_boundChans[origin] != \'object\') s_boundChans[origin] = { };\n
if (typeof s_boundChans[origin][scope] != \'object\') s_boundChans[origin][scope] = [ ];\n
s_boundChans[origin][scope].push({win: win, handler: handler});\n
}\n
\n
function s_removeBoundChan(win, origin, scope) {\n
var arr = s_boundChans[origin][scope];\n
for (var i = 0; i < arr.length; i++) {\n
if (arr[i].win === win) {\n
arr.splice(i,1);\n
}\n
}\n
if (s_boundChans[origin][scope].length === 0) {\n
delete s_boundChans[origin][scope];\n
}\n
}\n
\n
function s_isArray(obj) {\n
if (Array.isArray) return Array.isArray(obj);\n
else {\n
return (obj.constructor.toString().indexOf("Array") != -1);\n
}\n
}\n
\n
// No two outstanding outbound messages may have the same id, period. Given that, a single table\n
// mapping "transaction ids" to message handlers, allows efficient routing of Callback, Error, and\n
// Response messages. Entries are added to this table when requests are sent, and removed when\n
// responses are received.\n
var s_transIds = { };\n
\n
// class singleton onMessage handler\n
// this function is registered once and all incoming messages route through here. This\n
// arrangement allows certain efficiencies, message data is only parsed once and dispatch\n
// is more efficient, especially for large numbers of simultaneous channels.\n
var s_onMessage = function(e) {\n
try {\n
var m = JSON.parse(e.data);\n
if (typeof m !== \'object\' || m === null) throw "malformed";\n
} catch(e) {\n
// just ignore any posted messages that do not consist of valid JSON\n
return;\n
}\n
\n
var w = e.source;\n
var o = e.origin;\n
var s, i, meth;\n
\n
if (typeof m.method === \'string\') {\n
var ar = m.method.split(\'::\');\n
if (ar.length == 2) {\n
s = ar[0];\n
meth = ar[1];\n
} else {\n
meth = m.method;\n
}\n
}\n
\n
if (typeof m.id !== \'undefined\') i = m.id;\n
\n
// w is message source window\n
// o is message origin\n
// m is parsed message\n
// s is message scope\n
// i is message id (or undefined)\n
// meth is unscoped method name\n
// ^^ based on these factors we can route the message\n
\n
// if it has a method it\'s either a notification or a request,\n
// route using s_boundChans\n
if (typeof meth === \'string\') {\n
var delivered = false;\n
if (s_boundChans[o] && s_boundChans[o][s]) {\n
for (var j = 0; j < s_boundChans[o][s].length; j++) {\n
if (s_boundChans[o][s][j].win === w) {\n
s_boundChans[o][s][j].handler(o, meth, m);\n
delivered = true;\n
break;\n
}\n
}\n
}\n
\n
if (!delivered && s_boundChans[\'*\'] && s_boundChans[\'*\'][s]) {\n
for (var j = 0; j < s_boundChans[\'*\'][s].length; j++) {\n
if (s_boundChans[\'*\'][s][j].win === w) {\n
s_boundChans[\'*\'][s][j].handler(o, meth, m);\n
break;\n
}\n
}\n
}\n
}\n
// otherwise it must have an id (or be poorly formed\n
else if (typeof i != \'undefined\') {\n
if (s_transIds[i]) s_transIds[i](o, meth, m);\n
}\n
};\n
\n
// Setup postMessage event listeners\n
if (window.addEventListener) window.addEventListener(\'message\', s_onMessage, false);\n
else if(window.attachEvent) window.attachEvent(\'onmessage\', s_onMessage);\n
\n
/* a messaging channel is constructed from a window and an origin.\n
* the channel will assert that all messages received over the\n
* channel match the origin\n
*\n
* Arguments to Channel.build(cfg):\n
*\n
* cfg.window - the remote window with which we\'ll communicate\n
* cfg.origin - the expected origin of the remote window, may be \'*\'\n
* which matches any origin\n
* cfg.scope - the \'scope\' of messages. a scope string that is\n
* prepended to message names. local and remote endpoints\n
* of a single channel must agree upon scope. Scope may\n
* not contain double colons (\'::\').\n
* cfg.debugOutput - A boolean value. If true and window.console.log is\n
* a function, then debug strings will be emitted to that\n
* function.\n
* cfg.debugOutput - A boolean value. If true and window.console.log is\n
* a function, then debug strings will be emitted to that\n
* function.\n
* cfg.postMessageObserver - A function that will be passed two arguments,\n
* an origin and a message. It will be passed these immediately\n
* before messages are posted.\n
* cfg.gotMessageObserver - A function that will be passed two arguments,\n
* an origin and a message. It will be passed these arguments\n
* immediately after they pass scope and origin checks, but before\n
* they are processed.\n
* cfg.onReady - A function that will be invoked when a channel becomes "ready",\n
* this occurs once both sides of the channel have been\n
* instantiated and an application level handshake is exchanged.\n
* the onReady function will be passed a single argument which is\n
* the channel object that was returned from build().\n
*/\n
return {\n
build: function(cfg) {\n
var debug = function(m) {\n
if (cfg.debugOutput && window.console && window.console.log) {\n
// try to stringify, if it doesn\'t work we\'ll let javascript\'s built in toString do its magic\n
try { if (typeof m !== \'string\') m = JSON.stringify(m); } catch(e) { }\n
console.log("["+chanId+"] " + m);\n
}\n
};\n
\n
/* browser capabilities check */\n
if (!window.postMessage) throw("jschannel cannot run this browser, no postMessage");\n
if (!window.JSON || !window.JSON.stringify || ! window.JSON.parse) {\n
throw("jschannel cannot run this browser, no JSON parsing/serialization");\n
}\n
\n
/* basic argument validation */\n
if (typeof cfg != \'object\') throw("Channel build invoked without a proper object argument");\n
\n
if (!cfg.window || !cfg.window.postMessage) throw("Channel.build() called without a valid window argument");\n
\n
/* we\'d have to do a little more work to be able to run multiple channels that intercommunicate the same\n
* window... Not sure if we care to support that */\n
if (window === cfg.window) throw("target window is same as present window -- not allowed");\n
\n
// let\'s require that the client specify an origin. if we just assume \'*\' we\'ll be\n
// propagating unsafe practices. that would be lame.\n
var validOrigin = false;\n
if (typeof cfg.origin === \'string\') {\n
var oMatch;\n
if (cfg.origin === "*") validOrigin = true;\n
// allow valid domains under http and https. Also, trim paths off otherwise valid origins.\n
else if (null !== (oMatch = cfg.origin.match(/^https?:\\/\\/(?:[-a-zA-Z0-9_\\.])+(?::\\d+)?/))) {\n
cfg.origin = oMatch[0].toLowerCase();\n
validOrigin = true;\n
}\n
}\n
\n
if (!validOrigin) throw ("Channel.build() called with an invalid origin");\n
\n
if (typeof cfg.scope !== \'undefined\') {\n
if (typeof cfg.scope !== \'string\') throw \'scope, when specified, must be a string\';\n
if (cfg.scope.split(\'::\').length > 1) throw "scope may not contain double colons: \'::\'";\n
}\n
\n
/* private variables */\n
// generate a random and psuedo unique id for this channel\n
var chanId = (function () {\n
var text = "";\n
var alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";\n
for(var i=0; i < 5; i++) text += alpha.charAt(Math.floor(Math.random() * alpha.length));\n
return text;\n
})();\n
\n
// registrations: mapping method names to call objects\n
var regTbl = { };\n
// current oustanding sent requests\n
var outTbl = { };\n
// current oustanding received requests\n
var inTbl = { };\n
// are we ready yet? when false we will block outbound messages.\n
var ready = false;\n
var pendingQueue = [ ];\n
\n
var createTransaction = function(id,origin,callbacks) {\n
var shouldDelayReturn = false;\n
var completed = false;\n
\n
return {\n
origin: origin,\n
invoke: function(cbName, v) {\n
// verify in table\n
if (!inTbl[id]) throw "attempting to invoke a callback of a nonexistent transaction: " + id;\n
// verify that the callback name is valid\n
var valid = false;\n
for (var i = 0; i < callbacks.length; i++) if (cbName === callbacks[i]) { valid = true; break; }\n
if (!valid) throw "request supports no such callback \'" + cbName + "\'";\n
\n
// send callback invocation\n
postMessage({ id: id, callback: cbName, params: v});\n
},\n
error: function(error, message) {\n
completed = true;\n
// verify in table\n
if (!inTbl[id]) throw "error called for nonexistent message: " + id;\n
\n
// remove transaction from table\n
delete inTbl[id];\n
\n
// send error\n
postMessage({ id: id, error: error, message: message });\n
},\n
complete: function(v) {\n
completed = true;\n
// verify in table\n
if (!inTbl[id]) throw "complete called for nonexistent message: " + id;\n
// remove transaction from table\n
delete inTbl[id];\n
// send complete\n
postMessage({ id: id, result: v });\n
},\n
delayReturn: function(delay) {\n
if (typeof delay === \'boolean\') {\n
shouldDelayReturn = (delay === true);\n
}\n
return shouldDelayReturn;\n
},\n
completed: function() {\n
return completed;\n
}\n
};\n
};\n
\n
var setTransactionTimeout = function(transId, timeout, method) {\n
return window.setTimeout(function() {\n
if (outTbl[transId]) {\n
// XXX: what if client code raises an exception here?\n
var msg = "timeout (" + timeout + "ms) exceeded on method \'" + method + "\'";\n
(1,outTbl[transId].error)("timeout_error", msg);\n
delete outTbl[transId];\n
delete s_transIds[transId];\n
}\n
}, timeout);\n
};\n
\n
var onMessage = function(origin, method, m) {\n
// if an observer was specified at allocation time, invoke it\n
if (typeof cfg.gotMessageObserver === \'function\') {\n
// pass observer a clone of the object so that our\n
// manipulations are not visible (i.e. method unscoping).\n
// This is not particularly efficient, but then we expect\n
// that message observers are primarily for debugging anyway.\n
try {\n
cfg.gotMessageObserver(origin, m);\n
} catch (e) {\n
debug("gotMessageObserver() raised an exception: " + e.toString());\n
}\n
}\n
\n
// now, what type of message is this?\n
if (m.id && method) {\n
// a request! do we have a registered handler for this request?\n
if (regTbl[method]) {\n
var trans = createTransaction(m.id, origin, m.callbacks ? m.callbacks : [ ]);\n
inTbl[m.id] = { };\n
try {\n
// callback handling. we\'ll magically create functions inside the parameter list for each\n
// callback\n
if (m.callbacks && s_isArray(m.callbacks) && m.callbacks.length > 0) {\n
for (var i = 0; i < m.callbacks.length; i++) {\n
var path = m.callbacks[i];\n
var obj = m.params;\n
var pathItems = path.split(\'/\');\n
for (var j = 0; j < pathItems.length - 1; j++) {\n
var cp = pathItems[j];\n
if (typeof obj[cp] !== \'object\') obj[cp] = { };\n
obj = obj[cp];\n
}\n
obj[pathItems[pathItems.length - 1]] = (function() {\n
var cbName = path;\n
return function(params) {\n
return trans.invoke(cbName, params);\n
};\n
})();\n
}\n
}\n
var resp = regTbl[method](trans, m.params);\n
if (!trans.delayReturn() && !trans.completed()) trans.complete(resp);\n
} catch(e) {\n
// automagic handling of exceptions:\n
var error = "runtime_error";\n
var message = null;\n
// * if it\'s a string then it gets an error code of \'runtime_error\' and string is the message\n
if (typeof e === \'string\') {\n
message = e;\n
} else if (typeof e === \'object\') {\n
// either an array or an object\n
// * if it\'s an array of length two, then array[0] is the code, array[1] is the error message\n
if (e && s_isArray(e) && e.length == 2) {\n
error = e[0];\n
message = e[1];\n
}\n
// * if it\'s an object then we\'ll look form error and message parameters\n
else if (typeof e.error === \'string\') {\n
error = e.error;\n
if (!e.message) message = "";\n
else if (typeof e.message === \'string\') message = e.message;\n
else e = e.message; // let the stringify/toString message give us a reasonable verbose error string\n
}\n
}\n
\n
// message is *still* null, let\'s try harder\n
if (message === null) {\n
try {\n
message = JSON.stringify(e);\n
/* On MSIE8, this can result in \'out of memory\', which\n
* leaves message undefined. */\n
if (typeof(message) == \'undefined\')\n
message = e.toString();\n
} catch (e2) {\n
message = e.toString();\n
}\n
}\n
\n
trans.error(error,message);\n
}\n
}\n
} else if (m.id && m.callback) {\n
if (!outTbl[m.id] ||!outTbl[m.id].callbacks || !outTbl[m.id].callbacks[m.callback])\n
{\n
debug("ignoring invalid callback, id:"+m.id+ " (" + m.callback +")");\n
} else {\n
// XXX: what if client code raises an exception here?\n
outTbl[m.id].callbacks[m.callback](m.params);\n
}\n
} else if (m.id) {\n
if (!outTbl[m.id]) {\n
debug("ignoring invalid response: " + m.id);\n
} else {\n
// XXX: what if client code raises an exception here?\n
if (m.error) {\n
(1,outTbl[m.id].error)(m.error, m.message);\n
} else {\n
if (m.result !== undefined) (1,outTbl[m.id].success)(m.result);\n
else (1,outTbl[m.id].success)();\n
}\n
delete outTbl[m.id];\n
delete s_transIds[m.id];\n
}\n
} else if (method) {\n
// tis a notification.\n
if (regTbl[method]) {\n
// yep, there\'s a handler for that.\n
// transaction has only origin for notifications.\n
regTbl[method]({ origin: origin }, m.params);\n
// if the client throws, we\'ll just let it bubble out\n
// what can we do? Also, here we\'ll ignore return values\n
}\n
}\n
};\n
\n
// now register our bound channel for msg routing\n
s_addBoundChan(cfg.window, cfg.origin, ((typeof cfg.scope === \'string\') ? cfg.scope : \'\'), onMessage);\n
\n
// scope method names based on cfg.scope specified when the Channel was instantiated\n
var scopeMethod = function(m) {\n
if (typeof cfg.scope === \'string\' && cfg.scope.length) m = [cfg.scope, m].join("::");\n
return m;\n
};\n
\n
// a small wrapper around postmessage whose primary function is to handle the\n
// case that clients start sending messages before the other end is "ready"\n
var postMessage = function(msg, force) {\n
if (!msg) throw "postMessage called with null message";\n
\n
// delay posting if we\'re not ready yet.\n
var verb = (ready ? "post " : "queue ");\n
debug(verb + " message: " + JSON.stringify(msg));\n
if (!force && !ready) {\n
pendingQueue.push(msg);\n
} else {\n
if (typeof cfg.postMessageObserver === \'function\') {\n
try {\n
cfg.postMessageObserver(cfg.origin, msg);\n
} catch (e) {\n
debug("postMessageObserver() raised an exception: " + e.toString());\n
}\n
}\n
\n
cfg.window.postMessage(JSON.stringify(msg), cfg.origin);\n
}\n
};\n
\n
var onReady = function(trans, type) {\n
debug(\'ready msg received\');\n
if (ready) throw "received ready message while in ready state. help!";\n
\n
if (type === \'ping\') {\n
chanId += \'-R\';\n
} else {\n
chanId += \'-L\';\n
}\n
\n
obj.unbind(\'__ready\'); // now this handler isn\'t needed any more.\n
ready = true;\n
debug(\'ready msg accepted.\');\n
\n
if (type === \'ping\') {\n
obj.notify({ method: \'__ready\', params: \'pong\' });\n
}\n
\n
// flush queue\n
while (pendingQueue.length) {\n
postMessage(pendingQueue.pop());\n
}\n
\n
// invoke onReady observer if provided\n
if (typeof cfg.onReady === \'function\') cfg.onReady(obj);\n
};\n
\n
var obj = {\n
// tries to unbind a bound message handler. returns false if not possible\n
unbind: function (method) {\n
if (regTbl[method]) {\n
if (!(delete regTbl[method])) throw ("can\'t delete method: " + method);\n
return true;\n
}\n
return false;\n
},\n
bind: function (method, cb) {\n
if (!method || typeof method !== \'string\') throw "\'method\' argument to bind must be string";\n
if (!cb || typeof cb !== \'function\') throw "callback missing from bind params";\n
\n
if (regTbl[method]) throw "method \'"+method+"\' is already bound!";\n
regTbl[method] = cb;\n
return this;\n
},\n
call: function(m) {\n
if (!m) throw \'missing arguments to call function\';\n
if (!m.method || typeof m.method !== \'string\') throw "\'method\' argument to call must be string";\n
if (!m.success || typeof m.success !== \'function\') throw "\'success\' callback missing from call";\n
\n
// now it\'s time to support the \'callback\' feature of jschannel. We\'ll traverse the argument\n
// object and pick out all of the functions that were passed as arguments.\n
var callbacks = { };\n
var callbackNames = [ ];\n
\n
var pruneFunctions = function (path, obj) {\n
if (typeof obj === \'object\') {\n
for (var k in obj) {\n
if (!obj.hasOwnProperty(k)) continue;\n
var np = path + (path.length ? \'/\' : \'\') + k;\n
if (typeof obj[k] === \'function\') {\n
callbacks[np] = obj[k];\n
callbackNames.push(np);\n
delete obj[k];\n
} else if (typeof obj[k] === \'object\') {\n
pruneFunctions(np, obj[k]);\n
}\n
}\n
}\n
};\n
pruneFunctions("", m.params);\n
\n
// build a \'request\' message and send it\n
var msg = { id: s_curTranId, method: scopeMethod(m.method), params: m.params };\n
if (callbackNames.length) msg.callbacks = callbackNames;\n
\n
if (m.timeout)\n
// XXX: This function returns a timeout ID, but we don\'t do anything with it.\n
// We might want to keep track of it so we can cancel it using clearTimeout()\n
// when the transaction completes.\n
setTransactionTimeout(s_curTranId, m.timeout, scopeMethod(m.method));\n
\n
// insert into the transaction table\n
outTbl[s_curTranId] = { callbacks: callbacks, error: m.error, success: m.success };\n
s_transIds[s_curTranId] = onMessage;\n
\n
// increment current id\n
s_curTranId++;\n
\n
postMessage(msg);\n
},\n
notify: function(m) {\n
if (!m) throw \'missing arguments to notify function\';\n
if (!m.method || typeof m.method !== \'string\') throw "\'method\' argument to notify must be string";\n
\n
// no need to go into any transaction table\n
postMessage({ method: scopeMethod(m.method), params: m.params });\n
},\n
destroy: function () {\n
s_removeBoundChan(cfg.window, cfg.origin, ((typeof cfg.scope === \'string\') ? cfg.scope : \'\'));\n
if (window.removeEventListener) window.removeEventListener(\'message\', onMessage, false);\n
else if(window.detachEvent) window.detachEvent(\'onmessage\', onMessage);\n
ready = false;\n
regTbl = { };\n
inTbl = { };\n
outTbl = { };\n
cfg.origin = null;\n
pendingQueue = [ ];\n
debug("channel destroyed");\n
chanId = "";\n
}\n
};\n
\n
obj.bind(\'__ready\', onReady);\n
setTimeout(function() {\n
postMessage({ method: scopeMethod(\'__ready\'), params: "ping" }, true);\n
}, 0);\n
\n
return obj;\n
}\n
};\n
})();\n
;/*\n
* DOMParser HTML extension\n
* 2012-09-04\n
*\n
* By Eli Grey, http://eligrey.com\n
* Public domain.\n
* NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n
*/\n
/*! @source https://gist.github.com/1129031 */\n
(function (DOMParser) {\n
"use strict";\n
var DOMParser_proto = DOMParser.prototype,\n
real_parseFromString = DOMParser_proto.parseFromString;\n
\n
// Firefox/Opera/IE throw errors on unsupported types\n
try {\n
// WebKit returns null on unsupported types\n
if ((new DOMParser()).parseFromString("", "text/html")) {\n
// text/html parsing is natively supported\n
return;\n
}\n
} catch (ignore) {}\n
\n
DOMParser_proto.parseFromString = function (markup, type) {\n
var result, doc, doc_elt, first_elt;\n
if (/^\\s*text\\/html\\s*(?:;|$)/i.test(type)) {\n
doc = document.implementation.createHTMLDocument("");\n
doc_elt = doc.documentElement;\n
\n
doc_elt.innerHTML = markup;\n
first_elt = doc_elt.firstElementChild;\n
\n
if (doc_elt.childElementCount === 1\n
&& first_elt.localName.toLowerCase() === "html") {\n
doc.replaceChild(first_elt, doc_elt);\n
}\n
\n
result = doc;\n
} else {\n
result = real_parseFromString.apply(this, arguments);\n
}\n
return result;\n
};\n
}(DOMParser));\n
\n
;// IE does not support have Document.prototype.contains.\n
if (typeof document.contains !== \'function\') {\n
Document.prototype.contains = function(node) {\n
if (node === this || node.parentNode === this)\n
return true;\n
return this.documentElement.contains(node);\n
}\n
}\n
;/*! RenderJs */\n
/*global console*/\n
/*jslint nomen: true*/\n
function loopEventListener(target, type, useCapture, callback) {\n
"use strict";\n
//////////////////////////\n
// Infinite event listener (promise is never resolved)\n
// eventListener is removed when promise is cancelled/rejected\n
//////////////////////////\n
var handle_event_callback,\n
callback_promise;\n
\n
function cancelResolver() {\n
if ((callback_promise !== undefined) &&\n
(typeof callback_promise.cancel === "function")) {\n
callback_promise.cancel();\n
}\n
}\n
\n
function canceller() {\n
if (handle_event_callback !== undefined) {\n
target.removeEventListener(type, handle_event_callback, useCapture);\n
}\n
cancelResolver();\n
}\n
function itsANonResolvableTrap(resolve, reject) {\n
\n
handle_event_callback = function (evt) {\n
evt.stopPropagation();\n
evt.preventDefault();\n
cancelResolver();\n
callback_promise = new RSVP.Queue()\n
.push(function () {\n
return callback(evt);\n
})\n
.push(undefined, function (error) {\n
if (!(error instanceof RSVP.CancellationError)) {\n
canceller();\n
reject(error);\n
}\n
});\n
};\n
\n
target.addEventListener(type, handle_event_callback, useCapture);\n
}\n
return new RSVP.Promise(itsANonResolvableTrap, canceller);\n
}\n
\n
/*\n
* renderJs - Generic Gadget library renderer.\n
* http://www.renderjs.org/documentation\n
*/\n
(function (document, window, RSVP, DOMParser, Channel, MutationObserver,\n
Node) {\n
"use strict";\n
\n
var gadget_model_dict = {},\n
javascript_registration_dict = {},\n
stylesheet_registration_dict = {},\n
gadget_loading_klass,\n
loading_klass_promise,\n
renderJS,\n
Monitor;\n
\n
/////////////////////////////////////////////////////////////////\n
// Helper functions\n
/////////////////////////////////////////////////////////////////\n
function listenHashChange(gadget) {\n
\n
function extractHashAndDispatch(evt) {\n
var hash = (evt.newURL || window.location.toString()).split(\'#\')[1],\n
subhashes,\n
subhash,\n
keyvalue,\n
index,\n
options = {};\n
if (hash === undefined) {\n
hash = "";\n
} else {\n
hash = hash.split(\'?\')[0];\n
}\n
\n
function optionalize(key, value, dict) {\n
var key_list = key.split("."),\n
kk,\n
i;\n
for (i = 0; i < key_list.length; i += 1) {\n
kk = key_list[i];\n
if (i === key_list.length - 1) {\n
dict[kk] = value;\n
} else {\n
if (!dict.hasOwnProperty(kk)) {\n
dict[kk] = {};\n
}\n
dict = dict[kk];\n
}\n
}\n
}\n
\n
subhashes = hash.split(\'&\');\n
for (index in subhashes) {\n
if (subhashes.hasOwnProperty(index)) {\n
subhash = subhashes[index];\n
if (subhash !== \'\') {\n
keyvalue = subhash.split(\'=\');\n
if (keyvalue.length === 2) {\n
\n
optionalize(decodeURIComponent(keyvalue[0]),\n
decodeURIComponent(keyvalue[1]),\n
options);\n
\n
}\n
}\n
}\n
}\n
\n
if (gadget.render !== undefined) {\n
return gadget.render(options);\n
}\n
}\n
\n
var result = loopEventListener(window, \'hashchange\', false,\n
extractHashAndDispatch),\n
event = document.createEvent("Event");\n
\n
event.initEvent(\'hashchange\', true, true);\n
event.newURL = window.location.toString();\n
window.dispatchEvent(event);\n
return result;\n
}\n
\n
\n
function removeHash(url) {\n
var index = url.indexOf(\'#\');\n
if (index > 0) {\n
url = url.substring(0, index);\n
}\n
return url;\n
}\n
\n
function letsCrash(e) {\n
if (e.constructor === XMLHttpRequest) {\n
e = {\n
readyState: e.readyState,\n
status: e.status,\n
statusText: e.statusText,\n
response_headers: e.getAllResponseHeaders()\n
};\n
}\n
if (e.constructor === Array ||\n
e.constructor === String ||\n
e.constructor === Object) {\n
try {\n
e = JSON.stringify(e);\n
} catch (ignore) {\n
}\n
}\n
document.getElementsByTagName(\'body\')[0].textContent = e;\n
// XXX Do not crash the application if it fails\n
// Where to write the error?\n
/*global console*/\n
console.error(e.stack);\n
console.error(e);\n
}\n
\n
/////////////////////////////////////////////////////////////////\n
// Service Monitor promise\n
/////////////////////////////////////////////////////////////////\n
function ResolvedMonitorError(message) {\n
this.name = "resolved";\n
if ((message !== undefined) && (typeof message !== "string")) {\n
throw new TypeError(\'You must pass a string.\');\n
}\n
this.message = message || "Default Message";\n
}\n
ResolvedMonitorError.prototype = new Error();\n
ResolvedMonitorError.prototype.constructor = ResolvedMonitorError;\n
\n
Monitor = function () {\n
var monitor = this,\n
promise_list = [],\n
promise,\n
reject,\n
notify,\n
resolved;\n
\n
if (!(this instanceof Monitor)) {\n
return new Monitor();\n
}\n
\n
function canceller() {\n
var len = promise_list.length,\n
i;\n
for (i = 0; i < len; i += 1) {\n
promise_list[i].cancel();\n
}\n
// Clean it to speed up other canceller run\n
promise_list = [];\n
}\n
\n
promise = new RSVP.Promise(function (done, fail, progress) {\n
reject = function (rejectedReason) {\n
if (resolved) {\n
return;\n
}\n
monitor.isRejected = true;\n
monitor.rejectedReason = rejectedReason;\n
resolved = true;\n
canceller();\n
return fail(rejectedReason);\n
};\n
notify = progress;\n
}, canceller);\n
\n
monitor.cancel = function () {\n
if (resolved) {\n
return;\n
}\n
resolved = true;\n
promise.cancel();\n
promise.fail(function (rejectedReason) {\n
monitor.isRejected = true;\n
monitor.rejectedReason = rejectedReason;\n
});\n
};\n
monitor.then = function () {\n
return promise.then.apply(promise, arguments);\n
};\n
monitor.fail = function () {\n
return promise.fail.apply(promise, arguments);\n
};\n
\n
monitor.monitor = function (promise_to_monitor) {\n
if (resolved) {\n
throw new ResolvedMonitorError();\n
}\n
var queue = new RSVP.Queue()\n
.push(function () {\n
return promise_to_monitor;\n
})\n
.push(function (fulfillmentValue) {\n
// Promise to monitor is fullfilled, remove it from the list\n
var len = promise_list.length,\n
sub_promise_to_monitor,\n
new_promise_list = [],\n
i;\n
for (i = 0; i < len; i += 1) {\n
sub_promise_to_monitor = promise_list[i];\n
if (!(sub_promise_to_monitor.isFulfilled ||\n
sub_promise_to_monitor.isRejected)) {\n
new_promise_list.push(sub_promise_to_monitor);\n
}\n
}\n
promise_list = new_promise_list;\n
}, function (rejectedReason) {\n
if (rejectedReason instanceof RSVP.CancellationError) {\n
if (!(promise_to_monitor.isFulfilled &&\n
promise_to_monitor.isRejected)) {\n
// The queue could be cancelled before the first push is run\n
promise_to_monitor.cancel();\n
}\n
}\n
reject(rejectedReason);\n
throw rejectedReason;\n
}, function (notificationValue) {\n
notify(notificationValue);\n
return notificationValue;\n
});\n
\n
promise_list.push(queue);\n
\n
return this;\n
};\n
};\n
\n
Monitor.prototype = Object.create(RSVP.Promise.prototype);\n
Monitor.prototype.constructor = Monitor;\n
\n
/////////////////////////////////////////////////////////////////\n
// RenderJSGadget\n
/////////////////////////////////////////////////////////////////\n
function RenderJSGadget() {\n
if (!(this instanceof RenderJSGadget)) {\n
return new RenderJSGadget();\n
}\n
}\n
RenderJSGadget.prototype.__title = "";\n
RenderJSGadget.prototype.__interface_list = [];\n
RenderJSGadget.prototype.__path = "";\n
RenderJSGadget.prototype.__html = "";\n
RenderJSGadget.prototype.__required_css_list = [];\n
RenderJSGadget.prototype.__required_js_list = [];\n
\n
function createMonitor(g) {\n
if (g.__monitor !== undefined) {\n
g.__monitor.cancel();\n
}\n
g.__monitor = new Monitor();\n
g.__monitor.fail(function (error) {\n
if (!(error instanceof RSVP.CancellationError)) {\n
return g.aq_reportServiceError(error);\n
}\n
}).fail(function (error) {\n
// Crash the application if the acquisition generates an error.\n
return letsCrash(error);\n
});\n
}\n
\n
function clearGadgetInternalParameters(g) {\n
g.__sub_gadget_dict = {};\n
createMonitor(g);\n
}\n
\n
function loadSubGadgetDOMDeclaration(g) {\n
var element_list = g.__element.querySelectorAll(\'[data-gadget-scope]\'),\n
element,\n
promise_list = [],\n
scope,\n
url,\n
sandbox,\n
i;\n
\n
for (i = 0; i < element_list.length; i += 1) {\n
element = element_list[i];\n
scope = element.getAttribute("data-gadget-scope");\n
url = element.getAttribute("data-gadget-url");\n
sandbox = element.getAttribute("data-gadget-sandbox");\n
if ((scope !== null) && (url !== null)) {\n
promise_list.push(g.declareGadget(url, {\n
element: element,\n
scope: scope || undefined,\n
sandbox: sandbox || undefined\n
}));\n
}\n
}\n
\n
return RSVP.all(promise_list);\n
}\n
\n
RenderJSGadget.__ready_list = [clearGadgetInternalParameters,\n
loadSubGadgetDOMDeclaration];\n
RenderJSGadget.ready = function (callback) {\n
this.__ready_list.push(callback);\n
return this;\n
};\n
\n
RenderJSGadget.__service_list = [];\n
RenderJSGadget.declareService = function (callback) {\n
this.__service_list.push(callback);\n
return this;\n
};\n
\n
function startService(gadget) {\n
gadget.__monitor.monitor(new RSVP.Queue()\n
.push(function () {\n
var i,\n
service_list = gadget.constructor.__service_list;\n
for (i = 0; i < service_list.length; i += 1) {\n
gadget.__monitor.monitor(service_list[i].apply(gadget));\n
}\n
})\n
);\n
}\n
\n
/////////////////////////////////////////////////////////////////\n
// RenderJSGadget.declareMethod\n
/////////////////////////////////////////////////////////////////\n
RenderJSGadget.declareMethod = function (name, callback) {\n
this.prototype[name] = function () {\n
var context = this,\n
argument_list = arguments;\n
\n
return new RSVP.Queue()\n
.push(function () {\n
return callback.apply(context, argument_list);\n
});\n
};\n
// Allow chain\n
return this;\n
};\n
\n
RenderJSGadget\n
.declareMethod(\'getInterfaceList\', function () {\n
// Returns the list of gadget prototype\n
return this.__interface_list;\n
})\n
.declareMethod(\'getRequiredCSSList\', function () {\n
// Returns a list of CSS required by the gadget\n
return this.__required_css_list;\n
})\n
.declareMethod(\'getRequiredJSList\', function () {\n
// Returns a list of JS required by the gadget\n
return this.__required_js_list;\n
})\n
.declareMethod(\'getPath\', function () {\n
// Returns the path of the code of a gadget\n
return this.__path;\n
})\n
.declareMethod(\'getTitle\', function () {\n
// Returns the title of a gadget\n
return this.__title;\n
})\n
.declareMethod(\'getElement\', function () {\n
// Returns the DOM Element of a gadget\n
if (this.__element === undefined) {\n
throw new Error("No element defined");\n
}\n
return this.__element;\n
});\n
\n
/////////////////////////////////////////////////////////////////\n
// RenderJSGadget.declareAcquiredMethod\n
/////////////////////////////////////////////////////////////////\n
function acquire(child_gadget, method_name, argument_list) {\n
var gadget = this,\n
key,\n
gadget_scope;\n
\n
for (key in gadget.__sub_gadget_dict) {\n
if (gadget.__sub_gadget_dict.hasOwnProperty(key)) {\n
if (gadget.__sub_gadget_dict[key] === child_gadget) {\n
gadget_scope = key;\n
}\n
}\n
}\n
return new RSVP.Queue()\n
.push(function () {\n
// Do not specify default __acquired_method_dict on prototype\n
// to prevent modifying this default value (with\n
// allowPublicAcquiredMethod for example)\n
var aq_dict = gadget.__acquired_method_dict || {};\n
if (aq_dict.hasOwnProperty(method_name)) {\n
return aq_dict[method_name].apply(gadget,\n
[argument_list, gadget_scope]);\n
}\n
throw new renderJS.AcquisitionError("aq_dynamic is not defined");\n
})\n
.push(undefined, function (error) {\n
if (error instanceof renderJS.AcquisitionError) {\n
return gadget.__aq_parent(method_name, argument_list);\n
}\n
throw error;\n
});\n
}\n
\n
RenderJSGadget.declareAcquiredMethod =\n
function (name, method_name_to_acquire) {\n
this.prototype[name] = function () {\n
var argument_list = Array.prototype.slice.call(arguments, 0),\n
gadget = this;\n
return new RSVP.Queue()\n
.push(function () {\n
return gadget.__aq_parent(method_name_to_acquire, argument_list);\n
});\n
};\n
\n
// Allow chain\n
return this;\n
};\n
RenderJSGadget.declareAcquiredMethod("aq_reportServiceError",\n
"reportServiceError");\n
RenderJSGadget.declareAcquiredMethod("aq_pleasePublishMyState",\n
"pleasePublishMyState");\n
\n
/////////////////////////////////////////////////////////////////\n
// RenderJSGadget.allowPublicAcquisition\n
/////////////////////////////////////////////////////////////////\n
RenderJSGadget.allowPublicAcquisition =\n
function (method_name, callback) {\n
this.prototype.__acquired_method_dict[method_name] = callback;\n
\n
// Allow chain\n
return this;\n
};\n
\n
// Set aq_parent on gadget_instance which call acquire on parent_gadget\n
function setAqParent(gadget_instance, parent_gadget) {\n
gadget_instance.__aq_parent = function (method_name, argument_list) {\n
return acquire.apply(parent_gadget, [gadget_instance, method_name,\n
argument_list]);\n
};\n
}\n
\n
function pleasePublishMyState(param_list, child_gadget_scope) {\n
var new_param = {},\n
key;\n
for (key in this.state_parameter_dict) {\n
if (this.state_parameter_dict.hasOwnProperty(key)) {\n
new_param[key] = this.state_parameter_dict[key];\n
}\n
}\n
if (child_gadget_scope === undefined) {\n
throw new Error("gadget scope is mandatory");\n
}\n
new_param[child_gadget_scope] = param_list[0];\n
param_list = [new_param];\n
return this.aq_pleasePublishMyState.apply(this, param_list);\n
}\n
\n
/////////////////////////////////////////////////////////////////\n
// RenderJSEmbeddedGadget\n
/////////////////////////////////////////////////////////////////\n
// Class inheritance\n
function RenderJSEmbeddedGadget() {\n
if (!(this instanceof RenderJSEmbeddedGadget)) {\n
return new RenderJSEmbeddedGadget();\n
}\n
RenderJSGadget.call(this);\n
}\n
RenderJSEmbeddedGadget.__ready_list = RenderJSGadget.__ready_list.slice();\n
RenderJSEmbeddedGadget.__service_list =\n
RenderJSGadget.__service_list.slice();\n
RenderJSEmbeddedGadget.ready =\n
RenderJSGadget.ready;\n
RenderJSEmbeddedGadget.declareService =\n
RenderJSGadget.declareService;\n
RenderJSEmbeddedGadget.prototype = new RenderJSGadget();\n
RenderJSEmbeddedGadget.prototype.constructor = RenderJSEmbeddedGadget;\n
\n
/////////////////////////////////////////////////////////////////\n
// privateDeclarePublicGadget\n
/////////////////////////////////////////////////////////////////\n
function privateDeclarePublicGadget(url, options, parent_gadget) {\n
var gadget_instance;\n
if (options.element === undefined) {\n
options.element = document.createElement("div");\n
}\n
\n
function loadDependency(method, url) {\n
return function () {\n
return method(url);\n
};\n
}\n
\n
return new RSVP.Queue()\n
.push(function () {\n
return renderJS.declareGadgetKlass(url);\n
})\n
// Get the gadget class and instanciate it\n
.push(function (Klass) {\n
var i,\n
template_node_list = Klass.__template_element.body.childNodes;\n
gadget_loading_klass = Klass;\n
gadget_instance = new Klass();\n
gadget_instance.__element = options.element;\n
for (i = 0; i < template_node_list.length; i += 1) {\n
gadget_instance.__element.appendChild(\n
template_node_list[i].cloneNode(true)\n
);\n
}\n
setAqParent(gadget_instance, parent_gadget);\n
// Load dependencies if needed\n
return RSVP.all([\n
gadget_instance.getRequiredJSList(),\n
gadget_instance.getRequiredCSSList()\n
]);\n
})\n
// Load all JS/CSS\n
.push(function (all_list) {\n
var q = new RSVP.Queue(),\n
i;\n
// Load JS\n
for (i = 0; i < all_list[0].length; i += 1) {\n
q.push(loadDependency(renderJS.declareJS, all_list[0][i]));\n
}\n
// Load CSS\n
for (i = 0; i < all_list[1].length; i += 1) {\n
q.push(loadDependency(renderJS.declareCSS, all_list[1][i]));\n
}\n
return q;\n
})\n
.push(function () {\n
return gadget_instance;\n
});\n
}\n
\n
/////////////////////////////////////////////////////////////////\n
// RenderJSIframeGadget\n
/////////////////////////////////////////////////////////////////\n
function RenderJSIframeGadget() {\n
if (!(this instanceof RenderJSIframeGadget)) {\n
return new RenderJSIframeGadget();\n
}\n
RenderJSGadget.call(this);\n
}\n
RenderJSIframeGadget.__ready_list = RenderJSGadget.__ready_list.slice();\n
RenderJSIframeGadget.ready =\n
RenderJSGadget.ready;\n
RenderJSIframeGadget.__service_list = RenderJSGadget.__service_list.slice();\n
RenderJSIframeGadget.declareService =\n
RenderJSGadget.declareService;\n
RenderJSIframeGadget.prototype = new RenderJSGadget();\n
RenderJSIframeGadget.prototype.constructor = RenderJSIframeGadget;\n
\n
/////////////////////////////////////////////////////////////////\n
// privateDeclareIframeGadget\n
/////////////////////////////////////////////////////////////////\n
function privateDeclareIframeGadget(url, options, parent_gadget) {\n
var gadget_instance,\n
iframe,\n
iframe_loading_deferred = RSVP.defer();\n
if (options.element === undefined) {\n
throw new Error("DOM element is required to create Iframe Gadget " +\n
url);\n
}\n
\n
// Check if the element is attached to the DOM\n
if (!document.contains(options.element)) {\n
throw new Error("The parent element is not attached to the DOM for " +\n
url);\n
}\n
\n
gadget_instance = new RenderJSIframeGadget();\n
setAqParent(gadget_instance, parent_gadget);\n
iframe = document.createElement("iframe");\n
// gadget_instance.element.setAttribute("seamless", "seamless");\n
iframe.setAttribute("src", url);\n
gadget_instance.__path = url;\n
gadget_instance.__element = options.element;\n
// Attach it to the DOM\n
options.element.appendChild(iframe);\n
\n
// XXX Manage unbind when deleting the gadget\n
\n
// Create the communication channel with the iframe\n
gadget_instance.__chan = Channel.build({\n
window: iframe.contentWindow,\n
origin: "*",\n
scope: "renderJS"\n
});\n
\n
// Create new method from the declareMethod call inside the iframe\n
gadget_instance.__chan.bind("declareMethod",\n
function (trans, method_name) {\n
gadget_instance[method_name] = function () {\n
var argument_list = arguments;\n
return new RSVP.Promise(function (resolve, reject) {\n
gadget_instance.__chan.call({\n
method: "methodCall",\n
params: [\n
method_name,\n
Array.prototype.slice.call(argument_list, 0)],\n
success: function (s) {\n
resolve(s);\n
},\n
error: function (e) {\n
reject(e);\n
}\n
});\n
});\n
};\n
return "OK";\n
});\n
\n
// Wait for the iframe to be loaded before continuing\n
gadget_instance.__chan.bind("ready", function (trans) {\n
iframe_loading_deferred.resolve(gadget_instance);\n
return "OK";\n
});\n
gadget_instance.__chan.bind("failed", function (trans, params) {\n
iframe_loading_deferred.reject(params);\n
return "OK";\n
});\n
gadget_instance.__chan.bind("acquire", function (trans, params) {\n
gadget_instance.__aq_parent.apply(gadget_instance, params)\n
.then(function (g) {\n
trans.complete(g);\n
}).fail(function (e) {\n
trans.error(e.toString());\n
});\n
trans.delayReturn(true);\n
});\n
\n
return RSVP.any([\n
iframe_loading_deferred.promise,\n
// Timeout to prevent non renderJS embeddable gadget\n
// XXX Maybe using iframe.onload/onerror would be safer?\n
RSVP.timeout(5000)\n
]);\n
}\n
\n
/////////////////////////////////////////////////////////////////\n
// RenderJSGadget.declareGadget\n
/////////////////////////////////////////////////////////////////\n
RenderJSGadget\n
.declareMethod(\'declareGadget\', function (url, options) {\n
var queue,\n
parent_gadget = this,\n
local_loading_klass_promise,\n
previous_loading_klass_promise = loading_klass_promise;\n
\n
if (options === undefined) {\n
options = {};\n
}\n
if (options.sandbox === undefined) {\n
options.sandbox = "public";\n
}\n
\n
// transform url to absolute url if it is relative\n
url = renderJS.getAbsoluteURL(url, this.__path);\n
// Change the global variable to update the loading queue\n
loading_klass_promise = new RSVP.Queue()\n
// Wait for previous gadget loading to finish first\n
.push(function () {\n
return previous_loading_klass_promise;\n
})\n
.push(undefined, function () {\n
// Forget previous declareGadget error\n
return;\n
})\n
.push(function () {\n
var method;\n
if (options.sandbox === "public") {\n
method = privateDeclarePublicGadget;\n
} else if (options.sandbox === "iframe") {\n
method = privateDeclareIframeGadget;\n
} else {\n
throw new Error("Unsupported sandbox options \'" +\n
options.sandbox + "\'");\n
}\n
return method(url, options, parent_gadget);\n
})\n
// Set the HTML context\n
.push(function (gadget_instance) {\n
// Drop the current loading klass info used by selector\n
gadget_loading_klass = undefined;\n
return gadget_instance;\n
})\n
.push(undefined, function (e) {\n
// Drop the current loading klass info used by selector\n
// even in case of error\n
gadget_loading_klass = undefined;\n
throw e;\n
});\n
local_loading_klass_promise = loading_klass_promise;\n
\n
queue = new RSVP.Queue()\n
.push(function () {\n
return local_loading_klass_promise;\n
})\n
// Set the HTML context\n
.push(function (gadget_instance) {\n
var i;\n
// Trigger calling of all ready callback\n
function ready_wrapper() {\n
return gadget_instance;\n
}\n
for (i = 0; i < gadget_instance.constructor.__ready_list.length;\n
i += 1) {\n
// Put a timeout?\n
queue.push(gadget_instance.constructor.__ready_list[i]);\n
// Always return the gadget instance after ready function\n
queue.push(ready_wrapper);\n
}\n
\n
// Store local reference to the gadget instance\n
if (options.scope !== undefined) {\n
parent_gadget.__sub_gadget_dict[options.scope] = gadget_instance;\n
gadget_instance.__element.setAttribute("data-gadget-scope",\n
options.scope);\n
}\n
\n
// Put some attribute to ease page layout comprehension\n
gadget_instance.__element.setAttribute("data-gadget-url", url);\n
gadget_instance.__element.setAttribute("data-gadget-sandbox",\n
options.sandbox);\n
gadget_instance.__element._gadget = gadget_instance;\n
\n
if (document.contains(gadget_instance.__element)) {\n
// Put a timeout\n
queue.push(startService);\n
}\n
// Always return the gadget instance after ready function\n
queue.push(ready_wrapper);\n
\n
return gadget_instance;\n
});\n
return queue;\n
})\n
.declareMethod(\'getDeclaredGadget\', function (gadget_scope) {\n
if (!this.__sub_gadget_dict.hasOwnProperty(gadget_scope)) {\n
throw new Error("Gadget scope \'" + gadget_scope + "\' is not known.");\n
}\n
return this.__sub_gadget_dict[gadget_scope];\n
})\n
.declareMethod(\'dropGadget\', function (gadget_scope) {\n
if (!this.__sub_gadget_dict.hasOwnProperty(gadget_scope)) {\n
throw new Error("Gadget scope \'" + gadget_scope + "\' is not known.");\n
}\n
// http://perfectionkills.com/understanding-delete/\n
delete this.__sub_gadget_dict[gadget_scope];\n
});\n
\n
/////////////////////////////////////////////////////////////////\n
// renderJS selector\n
/////////////////////////////////////////////////////////////////\n
renderJS = function (selector) {\n
var result;\n
if (selector === window) {\n
// window is the \'this\' value when loading a javascript file\n
// In this case, use the current loading gadget constructor\n
result = gadget_loading_klass;\n
}\n
if (result === undefined) {\n
throw new Error("Unknown selector \'" + selector + "\'");\n
}\n
return result;\n
};\n
\n
/////////////////////////////////////////////////////////////////\n
// renderJS.AcquisitionError\n
/////////////////////////////////////////////////////////////////\n
renderJS.AcquisitionError = function (message) {\n
this.name = "AcquisitionError";\n
if ((message !== undefined) && (typeof message !== "string")) {\n
throw new TypeError(\'You must pass a string.\');\n
}\n
this.message = message || "Acquisition failed";\n
};\n
renderJS.AcquisitionError.prototype = new Error();\n
renderJS.AcquisitionError.prototype.constructor =\n
renderJS.AcquisitionError;\n
\n
/////////////////////////////////////////////////////////////////\n
// renderJS.getAbsoluteURL\n
/////////////////////////////////////////////////////////////////\n
renderJS.getAbsoluteURL = function (url, base_url) {\n
var doc, base, link,\n
html = "<!doctype><html><head></head></html>",\n
isAbsoluteOrDataURL = new RegExp(\'^(?:[a-z]+:)?//|data:\', \'i\');\n
\n
if (url && base_url && !isAbsoluteOrDataURL.test(url)) {\n
doc = (new DOMParser()).parseFromString(html, \'text/html\');\n
base = doc.createElement(\'base\');\n
link = doc.createElement(\'link\');\n
doc.head.appendChild(base);\n
doc.head.appendChild(link);\n
base.href = base_url;\n
link.href = url;\n
return link.href;\n
}\n
return url;\n
};\n
\n
/////////////////////////////////////////////////////////////////\n
// renderJS.declareJS\n
/////////////////////////////////////////////////////////////////\n
renderJS.declareJS = function (url) {\n
// Prevent infinite recursion if loading render.js\n
// more than once\n
var result;\n
if (javascript_registration_dict.hasOwnProperty(url)) {\n
result = RSVP.resolve();\n
} else {\n
result = new RSVP.Promise(function (resolve, reject) {\n
var newScript;\n
newScript = document.createElement(\'script\');\n
newScript.type = \'text/javascript\';\n
newScript.src = url;\n
newScript.onload = function () {\n
javascript_registration_dict[url] = null;\n
resolve();\n
};\n
newScript.onerror = function (e) {\n
reject(e);\n
};\n
document.head.appendChild(newScript);\n
});\n
}\n
return result;\n
};\n
\n
/////////////////////////////////////////////////////////////////\n
// renderJS.declareCSS\n
/////////////////////////////////////////////////////////////////\n
renderJS.declareCSS = function (url) {\n
// https://github.com/furf/jquery-getCSS/blob/master/jquery.getCSS.js\n
// No way to cleanly check if a css has been loaded\n
// So, always resolve the promise...\n
// http://requirejs.org/docs/faq-advanced.html#css\n
var result;\n
if (stylesheet_registration_dict.hasOwnProperty(url)) {\n
result = RSVP.resolve();\n
} else {\n
result = new RSVP.Promise(function (resolve, reject) {\n
var link;\n
link = document.createElement(\'link\');\n
link.rel = \'stylesheet\';\n
link.type = \'text/css\';\n
link.href = url;\n
link.onload = function () {\n
stylesheet_registration_dict[url] = null;\n
resolve();\n
};\n
link.onerror = function (e) {\n
reject(e);\n
};\n
document.head.appendChild(link);\n
});\n
}\n
return result;\n
};\n
\n
/////////////////////////////////////////////////////////////////\n
// renderJS.declareGadgetKlass\n
/////////////////////////////////////////////////////////////////\n
renderJS.declareGadgetKlass = function (url) {\n
var result,\n
xhr;\n
\n
function parse() {\n
var tmp_constructor,\n
key,\n
parsed_html;\n
if (!gadget_model_dict.hasOwnProperty(url)) {\n
// Class inheritance\n
tmp_constructor = function () {\n
RenderJSGadget.call(this);\n
};\n
tmp_constructor.__ready_list = RenderJSGadget.__ready_list.slice();\n
tmp_constructor.__service_list = RenderJSGadget.__service_list.slice();\n
tmp_constructor.declareMethod =\n
RenderJSGadget.declareMethod;\n
tmp_constructor.declareAcquiredMethod =\n
RenderJSGadget.declareAcquiredMethod;\n
tmp_constructor.allowPublicAcquisition =\n
RenderJSGadget.allowPublicAcquisition;\n
tmp_constructor.ready =\n
RenderJSGadget.ready;\n
tmp_constructor.declareService =\n
RenderJSGadget.declareService;\n
tmp_constructor.prototype = new RenderJSGadget();\n
tmp_constructor.prototype.constructor = tmp_constructor;\n
tmp_constructor.prototype.__path = url;\n
tmp_constructor.prototype.__acquired_method_dict = {};\n
tmp_constructor.allowPublicAcquisition("pleasePublishMyState",\n
pleasePublishMyState);\n
// https://developer.mozilla.org/en-US/docs/HTML_in_XMLHttpRequest\n
// https://developer.mozilla.org/en-US/docs/Web/API/DOMParser\n
// https://developer.mozilla.org/en-US/docs/Code_snippets/HTML_to_DOM\n
tmp_constructor.__template_element =\n
(new DOMParser()).parseFromString(xhr.responseText, "text/html");\n
parsed_html = renderJS.parseGadgetHTMLDocument(\n
tmp_constructor.__template_element,\n
url\n
);\n
for (key in parsed_html) {\n
if (parsed_html.hasOwnProperty(key)) {\n
tmp_constructor.prototype[\'__\' + key] = parsed_html[key];\n
}\n
}\n
\n
gadget_model_dict[url] = tmp_constructor;\n
}\n
\n
return gadget_model_dict[url];\n
}\n
\n
function resolver(resolve, reject) {\n
function handler() {\n
var tmp_result;\n
try {\n
if (xhr.readyState === 0) {\n
// UNSENT\n
reject(xhr);\n
} else if (xhr.readyState === 4) {\n
// DONE\n
if ((xhr.status < 200) || (xhr.status >= 300) ||\n
(!/^text\\/html[;]?/.test(\n
xhr.getResponseHeader("Content-Type") || ""\n
))) {\n
reject(xhr);\n
} else {\n
tmp_result = parse();\n
resolve(tmp_result);\n
}\n
}\n
} catch (e) {\n
reject(e);\n
}\n
}\n
\n
xhr = new XMLHttpRequest();\n
xhr.open("GET", url);\n
xhr.onreadystatechange = handler;\n
xhr.setRequestHeader(\'Accept\', \'text/html\');\n
xhr.withCredentials = true;\n
xhr.send();\n
}\n
\n
function canceller() {\n
if ((xhr !== undefined) && (xhr.readyState !== xhr.DONE)) {\n
xhr.abort();\n
}\n
}\n
\n
if (gadget_model_dict.hasOwnProperty(url)) {\n
// Return klass object if it already exists\n
result = RSVP.resolve(gadget_model_dict[url]);\n
} else {\n
// Fetch the HTML page and parse it\n
result = new RSVP.Promise(resolver, canceller);\n
}\n
return result;\n
};\n
\n
/////////////////////////////////////////////////////////////////\n
// renderJS.clearGadgetKlassList\n
/////////////////////////////////////////////////////////////////\n
// For test purpose only\n
renderJS.clearGadgetKlassList = function () {\n
gadget_model_dict = {};\n
javascript_registration_dict = {};\n
stylesheet_registration_dict = {};\n
};\n
\n
/////////////////////////////////////////////////////////////////\n
// renderJS.parseGadgetHTMLDocument\n
/////////////////////////////////////////////////////////////////\n
renderJS.parseGadgetHTMLDocument = function (document_element, url) {\n
var settings = {\n
title: "",\n
interface_list: [],\n
required_css_list: [],\n
required_js_list: []\n
},\n
i,\n
element,\n
isAbsoluteURL = new RegExp(\'^(?:[a-z]+:)?//\', \'i\');\n
\n
if (!url || !isAbsoluteURL.test(url)) {\n
throw new Error("The url should be absolute: " + url);\n
}\n
\n
if (document_element.nodeType === 9) {\n
settings.title = document_element.title;\n
\n
if (document_element.head !== null) {\n
for (i = 0; i < document_element.head.children.length; i += 1) {\n
element = document_element.head.children[i];\n
if (element.href !== null) {\n
// XXX Manage relative URL during extraction of URLs\n
// element.href returns absolute URL in firefox but "" in chrome;\n
if (element.rel === "stylesheet") {\n
settings.required_css_list.push(\n
renderJS.getAbsoluteURL(element.getAttribute("href"), url)\n
);\n
} else if (element.nodeName === "SCRIPT" &&\n
(element.type === "text/javascript" ||\n
!element.type)) {\n
settings.required_js_list.push(\n
renderJS.getAbsoluteURL(element.getAttribute("src"), url)\n
);\n
} else if (element.rel ===\n
"http://www.renderjs.org/rel/interface") {\n
settings.interface_list.push(\n
renderJS.getAbsoluteURL(element.getAttribute("href"), url)\n
);\n
}\n
}\n
}\n
}\n
} else {\n
throw new Error("The first parameter should be an HTMLDocument");\n
}\n
return settings;\n
};\n
\n
/////////////////////////////////////////////////////////////////\n
// global\n
/////////////////////////////////////////////////////////////////\n
window.rJS = window.renderJS = renderJS;\n
window.__RenderJSGadget = RenderJSGadget;\n
window.__RenderJSEmbeddedGadget = RenderJSEmbeddedGadget;\n
window.__RenderJSIframeGadget = RenderJSIframeGadget;\n
\n
///////////////////////////////////////////////////\n
// Bootstrap process. Register the self gadget.\n
///////////////////////////////////////////////////\n
\n
function mergeSubDict(dict) {\n
var subkey,\n
subkey2,\n
subresult2,\n
value,\n
result = {};\n
for (subkey in dict) {\n
if (dict.hasOwnProperty(subkey)) {\n
value = dict[subkey];\n
if (value instanceof Object) {\n
subresult2 = mergeSubDict(value);\n
for (subkey2 in subresult2) {\n
if (subresult2.hasOwnProperty(subkey2)) {\n
// XXX key should not have an . inside\n
if (result.hasOwnProperty(subkey + "." + subkey2)) {\n
throw new Error("Key " + subkey + "." +\n
subkey2 + " already present");\n
}\n
result[subkey + "." + subkey2] = subresult2[subkey2];\n
}\n
}\n
} else {\n
if (result.hasOwnProperty(subkey)) {\n
throw new Error("Key " + subkey + " already present");\n
}\n
result[subkey] = value;\n
}\n
}\n
}\n
return result;\n
\n
}\n
\n
function bootstrap() {\n
var url = removeHash(window.location.href),\n
tmp_constructor,\n
root_gadget,\n
loading_gadget_promise = new RSVP.Queue(),\n
declare_method_count = 0,\n
embedded_channel,\n
notifyReady,\n
notifyDeclareMethod,\n
gadget_ready = false,\n
iframe_top_gadget,\n
last_acquisition_gadget;\n
\n
// Create the gadget class for the current url\n
if (gadget_model_dict.hasOwnProperty(url)) {\n
throw new Error("bootstrap should not be called twice");\n
}\n
loading_klass_promise = new RSVP.Promise(function (resolve, reject) {\n
\n
last_acquisition_gadget = new RenderJSGadget();\n
last_acquisition_gadget.__acquired_method_dict = {\n
getTopURL: function () {\n
return url;\n
},\n
reportServiceError: function (param_list) {\n
letsCrash(param_list[0]);\n
},\n
pleaseRedirectMyHash: function (param_list) {\n
window.location.replace(param_list[0]);\n
},\n
pleasePublishMyState: function (param_list) {\n
var key,\n
first = true,\n
hash = "#";\n
param_list[0] = mergeSubDict(param_list[0]);\n
for (key in param_list[0]) {\n
if (param_list[0].hasOwnProperty(key)) {\n
if (!first) {\n
hash += "&";\n
}\n
hash += encodeURIComponent(key) + "=" +\n
encodeURIComponent(param_list[0][key]);\n
first = false;\n
}\n
}\n
return hash;\n
}\n
};\n
// Stop acquisition on the last acquisition gadget\n
// Do not put this on the klass, as their could be multiple instances\n
last_acquisition_gadget.__aq_parent = function (method_name) {\n
throw new renderJS.AcquisitionError(\n
"No gadget provides " + method_name\n
);\n
};\n
\n
//we need to determine tmp_constructor\'s value before exit bootstrap\n
//because of function : renderJS\n
//but since the channel checking is async,\n
//we can\'t use code structure like:\n
// if channel communication is ok\n
// tmp_constructor = RenderJSGadget\n
// else\n
// tmp_constructor = RenderJSEmbeddedGadget\n
if (window.self === window.top) {\n
// XXX Copy/Paste from declareGadgetKlass\n
tmp_constructor = function () {\n
RenderJSGadget.call(this);\n
};\n
tmp_constructor.declareMethod = RenderJSGadget.declareMethod;\n
tmp_constructor.declareAcquiredMethod =\n
RenderJSGadget.declareAcquiredMethod;\n
tmp_constructor.allowPublicAcquisition =\n
RenderJSGadget.allowPublicAcquisition;\n
tmp_constructor.__ready_list = RenderJSGadget.__ready_list.slice();\n
tmp_constructor.ready = RenderJSGadget.ready;\n
tmp_constructor.__service_list = RenderJSGadget.__service_list.slice();\n
tmp_constructor.declareService =\n
RenderJSGadget.declareService;\n
tmp_constructor.prototype = new RenderJSGadget();\n
tmp_constructor.prototype.constructor = tmp_constructor;\n
tmp_constructor.prototype.__path = url;\n
gadget_model_dict[url] = tmp_constructor;\n
\n
// Create the root gadget instance and put it in the loading stack\n
root_gadget = new gadget_model_dict[url]();\n
\n
tmp_constructor.declareService(function () {\n
return listenHashChange(this);\n
});\n
\n
setAqParent(root_gadget, last_acquisition_gadget);\n
\n
} else {\n
// Create the communication channel\n
embedded_channel = Channel.build({\n
window: window.parent,\n
origin: "*",\n
scope: "renderJS"\n
});\n
// Create the root gadget instance and put it in the loading stack\n
tmp_constructor = RenderJSEmbeddedGadget;\n
tmp_constructor.__ready_list = RenderJSGadget.__ready_list.slice();\n
tmp_constructor.__service_list = RenderJSGadget.__service_list.slice();\n
tmp_constructor.prototype.__path = url;\n
root_gadget = new RenderJSEmbeddedGadget();\n
\n
\n
// Notify parent about gadget instanciation\n
notifyReady = function () {\n
if ((declare_method_count === 0) && (gadget_ready === true)) {\n
embedded_channel.notify({method: "ready"});\n
}\n
};\n
\n
// Inform parent gadget about declareMethod calls here.\n
notifyDeclareMethod = function (name) {\n
declare_method_count += 1;\n
embedded_channel.call({\n
method: "declareMethod",\n
params: name,\n
success: function () {\n
declare_method_count -= 1;\n
notifyReady();\n
},\n
error: function () {\n
declare_method_count -= 1;\n
}\n
});\n
};\n
\n
notifyDeclareMethod("getInterfaceList");\n
notifyDeclareMethod("getRequiredCSSList");\n
notifyDeclareMethod("getRequiredJSList");\n
notifyDeclareMethod("getPath");\n
notifyDeclareMethod("getTitle");\n
\n
// Surcharge declareMethod to inform parent window\n
tmp_constructor.declareMethod = function (name, callback) {\n
var result = RenderJSGadget.declareMethod.apply(\n
this,\n
[name, callback]\n
);\n
notifyDeclareMethod(name);\n
return result;\n
};\n
\n
tmp_constructor.declareService =\n
RenderJSGadget.declareService;\n
tmp_constructor.declareAcquiredMethod =\n
RenderJSGadget.declareAcquiredMethod;\n
tmp_constructor.allowPublicAcquisition =\n
RenderJSGadget.allowPublicAcquisition;\n
\n
//Default: Define __aq_parent to inform parent window\n
tmp_constructor.prototype.__aq_parent = function (method_name,\n
argument_list, time_out) {\n
return new RSVP.Promise(function (resolve, reject) {\n
embedded_channel.call({\n
method: "acquire",\n
params: [\n
method_name,\n
argument_list\n
],\n
success: function (s) {\n
resolve(s);\n
},\n
error: function (e) {\n
reject(e);\n
},\n
timeout: time_out\n
});\n
});\n
};\n
}\n
\n
tmp_constructor.prototype.__acquired_method_dict = {};\n
tmp_constructor.allowPublicAcquisition("pleasePublishMyState",\n
pleasePublishMyState);\n
gadget_loading_klass = tmp_constructor;\n
\n
function init() {\n
// XXX HTML properties can only be set when the DOM is fully loaded\n
var settings = renderJS.parseGadgetHTMLDocument(document, url),\n
j,\n
key;\n
for (key in settings) {\n
if (settings.hasOwnProperty(key)) {\n
tmp_constructor.prototype[\'__\' + key] = settings[key];\n
}\n
}\n
tmp_constructor.__template_element = document.createElement("div");\n
root_gadget.__element = document.body;\n
for (j = 0; j < root_gadget.__element.childNodes.length; j += 1) {\n
tmp_constructor.__template_element.appendChild(\n
root_gadget.__element.childNodes[j].cloneNode(true)\n
);\n
}\n
RSVP.all([root_gadget.getRequiredJSList(),\n
root_gadget.getRequiredCSSList()])\n
.then(function (all_list) {\n
var i,\n
js_list = all_list[0],\n
css_list = all_list[1];\n
for (i = 0; i < js_list.length; i += 1) {\n
javascript_registration_dict[js_list[i]] = null;\n
}\n
for (i = 0; i < css_list.length; i += 1) {\n
stylesheet_registration_dict[css_list[i]] = null;\n
}\n
gadget_loading_klass = undefined;\n
}).then(function () {\n
\n
// select the target node\n
var target = document.querySelector(\'body\'),\n
// create an observer instance\n
observer = new MutationObserver(function (mutations) {\n
var i, k, len, len2, node, added_list;\n
mutations.forEach(function (mutation) {\n
if (mutation.type === \'childList\') {\n
\n
len = mutation.removedNodes.length;\n
for (i = 0; i < len; i += 1) {\n
node = mutation.removedNodes[i];\n
if (node.nodeType === Node.ELEMENT_NODE) {\n
if (node.hasAttribute("data-gadget-url") &&\n
(node._gadget !== undefined)) {\n
createMonitor(node._gadget);\n
}\n
added_list =\n
node.querySelectorAll("[data-gadget-url]");\n
len2 = added_list.length;\n
for (k = 0; k < len2; k += 1) {\n
node = added_list[k];\n
if (node._gadget !== undefined) {\n
createMonitor(node._gadget);\n
}\n
}\n
}\n
}\n
\n
len = mutation.addedNodes.length;\n
for (i = 0; i < len; i += 1) {\n
node = mutation.addedNodes[i];\n
if (node.nodeType === Node.ELEMENT_NODE) {\n
if (node.hasAttribute("data-gadget-url") &&\n
(node._gadget !== undefined)) {\n
if (document.contains(node)) {\n
startService(node._gadget);\n
}\n
}\n
added_list =\n
node.querySelectorAll("[data-gadget-url]");\n
len2 = added_list.length;\n
for (k = 0; k < len2; k += 1) {\n
node = added_list[k];\n
if (document.contains(node)) {\n
if (node._gadget !== undefined) {\n
startService(node._gadget);\n
}\n
}\n
}\n
}\n
}\n
\n
}\n
});\n
}),\n
// configuration of the observer:\n
config = {\n
childList: true,\n
subtree: true,\n
attributes: false,\n
characterData: false\n
};\n
\n
// pass in the target node, as well as the observer options\n
observer.observe(target, config);\n
\n
return root_gadget;\n
}).then(resolve, function (e) {\n
reject(e);\n
console.error(e);\n
throw e;\n
});\n
}\n
document.addEventListener(\'DOMContentLoaded\', init, false);\n
});\n
\n
loading_gadget_promise\n
.push(function () {\n
return loading_klass_promise;\n
})\n
.push(function (root_gadget) {\n
var i;\n
\n
function ready_wrapper() {\n
return root_gadget;\n
}\n
\n
if (window.top !== window.self) {\n
//checking channel should be done before sub gadget\'s declaration\n
//__ready_list:\n
//0: clearGadgetInternalParameters\n
//1: loadSubGadgetDOMDeclaration\n
//.....\n
tmp_constructor.__ready_list.splice(1, 0, function () {\n
return root_gadget.__aq_parent(\'getTopURL\', [], 100)\n
.then(function (topURL) {\n
var base = document.createElement(\'base\');\n
base.href = topURL;\n
base.target = "_top";\n
document.head.appendChild(base);\n
//the channel is ok\n
//so bind calls to renderJS method on the instance\n
embedded_channel.bind("methodCall", function (trans, v) {\n
root_gadget[v[0]].apply(root_gadget, v[1])\n
.then(function (g) {\n
trans.complete(g);\n
}).fail(function (e) {\n
trans.error(e.toString());\n
});\n
trans.delayReturn(true);\n
});\n
})\n
.fail(function (error) {\n
if (error === "timeout_error") {\n
//the channel fail\n
//we consider current gadget is parent gadget\n
//redifine last acquisition gadget\n
iframe_top_gadget = true;\n
tmp_constructor.declareService(function () {\n
return listenHashChange(this);\n
});\n
setAqParent(root_gadget, last_acquisition_gadget);\n
} else {\n
throw error;\n
}\n
});\n
});\n
}\n
\n
tmp_constructor.ready(function (g) {\n
return startService(g);\n
});\n
\n
loading_gadget_promise.push(ready_wrapper);\n
for (i = 0; i < tmp_constructor.__ready_list.length; i += 1) {\n
// Put a timeout?\n
loading_gadget_promise\n
.push(tmp_constructor.__ready_list[i])\n
// Always return the gadget instance after ready function\n
.push(ready_wrapper);\n
}\n
});\n
if (window.self === window.top) {\n
loading_gadget_promise\n
.fail(function (e) {\n
letsCrash(e);\n
throw e;\n
});\n
} else {\n
// Inform parent window that gadget is correctly loaded\n
loading_gadget_promise\n
.then(function () {\n
gadget_ready = true;\n
notifyReady();\n
})\n
.fail(function (e) {\n
//top gadget in iframe\n
if (iframe_top_gadget) {\n
letsCrash(e);\n
} else {\n
embedded_channel.notify({method: "failed", params: e.toString()});\n
}\n
throw e;\n
});\n
}\n
\n
}\n
bootstrap();\n
\n
}(document, window, RSVP, DOMParser, Channel, MutationObserver, Node));\n
]]></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681769.39</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>rsvp.min.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
(function(globals) {\n
var define, requireModule;\n
\n
(function() {\n
var registry = {}, seen = {};\n
\n
define = function(name, deps, callback) {\n
registry[name] = { deps: deps, callback: callback };\n
};\n
\n
requireModule = function(name) {\n
if (seen[name]) { return seen[name]; }\n
seen[name] = {};\n
\n
var mod = registry[name];\n
if (!mod) {\n
throw new Error("Module \'" + name + "\' not found.");\n
}\n
\n
var deps = mod.deps,\n
callback = mod.callback,\n
reified = [],\n
exports;\n
\n
for (var i=0, l=deps.length; i<l; i++) {\n
if (deps[i] === \'exports\') {\n
reified.push(exports = {});\n
} else {\n
reified.push(requireModule(deps[i]));\n
}\n
}\n
\n
var value = callback.apply(this, reified);\n
return seen[name] = exports || value;\n
};\n
})();\n
\n
define("rsvp/all",\n
["rsvp/promise","exports"],\n
function(__dependency1__, __exports__) {\n
"use strict";\n
var Promise = __dependency1__.Promise;\n
/* global toString */\n
\n
\n
function promiseAtLeast(expected_count, promises) {\n
if (Object.prototype.toString.call(promises) !== "[object Array]") {\n
throw new TypeError(\'You must pass an array to all.\');\n
}\n
\n
function canceller() {\n
var promise;\n
for (var i = 0; i < promises.length; i++) {\n
promise = promises[i];\n
\n
if (promise && typeof promise.then === \'function\' &&\n
typeof promise.cancel === \'function\') {\n
promise.cancel();\n
}\n
}\n
}\n
\n
return new Promise(function(resolve, reject, notify) {\n
var results = [], remaining = promises.length,\n
promise, remaining_count = promises.length - expected_count;\n
\n
if (remaining === 0) {\n
if (expected_count === 1) {\n
resolve();\n
} else {\n
resolve([]);\n
}\n
}\n
\n
function resolver(index) {\n
return function(value) {\n
resolveAll(index, value);\n
};\n
}\n
\n
function resolveAll(index, value) {\n
results[index] = value;\n
if (--remaining === remaining_count) {\n
if (remaining_count === 0) {\n
resolve(results);\n
} else {\n
resolve(value);\n
canceller();\n
}\n
}\n
}\n
\n
function notifier(index) {\n
return function(value) {\n
notify({"index": index, "value": value});\n
};\n
}\n
\n
function cancelAll(rejectionValue) {\n
reject(rejectionValue);\n
canceller();\n
}\n
\n
for (var i = 0; i < promises.length; i++) {\n
promise = promises[i];\n
\n
if (promise && typeof promise.then === \'function\') {\n
promise.then(resolver(i), cancelAll, notifier(i));\n
} else {\n
resolveAll(i, promise);\n
}\n
}\n
}, canceller\n
);\n
}\n
\n
function all(promises) {\n
return promiseAtLeast(promises.length, promises);\n
}\n
\n
function any(promises) {\n
return promiseAtLeast(1, promises);\n
}\n
\n
\n
__exports__.all = all;\n
__exports__.any = any;\n
});\n
define("rsvp/async",\n
["exports"],\n
function(__exports__) {\n
"use strict";\n
var browserGlobal = (typeof window !== \'undefined\') ? window : {};\n
var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\n
var async;\n
var local = (typeof global !== \'undefined\') ? global : this;\n
\n
// old node\n
function useNextTick() {\n
return function(callback, arg) {\n
process.nextTick(function() {\n
callback(arg);\n
});\n
};\n
}\n
\n
// node >= 0.10.x\n
function useSetImmediate() {\n
return function(callback, arg) {\n
/* global setImmediate */\n
setImmediate(function(){\n
callback(arg);\n
});\n
};\n
}\n
\n
function useMutationObserver() {\n
var queue = [];\n
\n
var observer = new BrowserMutationObserver(function() {\n
var toProcess = queue.slice();\n
queue = [];\n
\n
toProcess.forEach(function(tuple) {\n
var callback = tuple[0], arg= tuple[1];\n
callback(arg);\n
});\n
});\n
\n
var element = document.createElement(\'div\');\n
observer.observe(element, { attributes: true });\n
\n
// Chrome Memory Leak: https://bugs.webkit.org/show_bug.cgi?id=93661\n
window.addEventListener(\'unload\', function(){\n
observer.disconnect();\n
observer = null;\n
}, false);\n
\n
return function(callback, arg) {\n
queue.push([callback, arg]);\n
element.setAttribute(\'drainQueue\', \'drainQueue\');\n
};\n
}\n
\n
function useSetTimeout() {\n
return function(callback, arg) {\n
local.setTimeout(function() {\n
callback(arg);\n
}, 1);\n
};\n
}\n
\n
if (typeof setImmediate === \'function\') {\n
async = useSetImmediate();\n
} else if (typeof process !== \'undefined\' && {}.toString.call(process) === \'[object process]\') {\n
async = useNextTick();\n
} else if (BrowserMutationObserver) {\n
async = useMutationObserver();\n
} else {\n
async = useSetTimeout();\n
}\n
\n
\n
__exports__.async = async;\n
});\n
define("rsvp/cancellation_error",\n
["exports"],\n
function(__exports__) {\n
"use strict";\n
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\n
function CancellationError(message) {\n
this.name = "cancel";\n
if ((message !== undefined) && (typeof message !== "string")) {\n
throw new TypeError(\'You must pass a string.\');\n
}\n
this.message = message || "Default Message";\n
}\n
CancellationError.prototype = new Error();\n
CancellationError.prototype.constructor = CancellationError;\n
\n
\n
__exports__.CancellationError = CancellationError;\n
});\n
define("rsvp/config",\n
["rsvp/async","exports"],\n
function(__dependency1__, __exports__) {\n
"use strict";\n
var async = __dependency1__.async;\n
\n
var config = {};\n
config.async = async;\n
\n
\n
__exports__.config = config;\n
});\n
define("rsvp/defer",\n
["rsvp/promise","exports"],\n
function(__dependency1__, __exports__) {\n
"use strict";\n
var Promise = __dependency1__.Promise;\n
\n
function defer() {\n
var deferred = {\n
// pre-allocate shape\n
resolve: undefined,\n
reject: undefined,\n
promise: undefined\n
};\n
\n
deferred.promise = new Promise(function(resolve, reject) {\n
deferred.resolve = resolve;\n
deferred.reject = reject;\n
});\n
\n
return deferred;\n
}\n
\n
\n
__exports__.defer = defer;\n
});\n
define("rsvp/events",\n
["exports"],\n
function(__exports__) {\n
"use strict";\n
var Event = function(type, options) {\n
this.type = type;\n
\n
for (var option in options) {\n
if (!options.hasOwnProperty(option)) { continue; }\n
\n
this[option] = options[option];\n
}\n
};\n
\n
var indexOf = function(callbacks, callback) {\n
for (var i=0, l=callbacks.length; i<l; i++) {\n
if (callbacks[i][0] === callback) { return i; }\n
}\n
\n
return -1;\n
};\n
\n
var callbacksFor = function(object) {\n
var callbacks = object._promiseCallbacks;\n
\n
if (!callbacks) {\n
callbacks = object._promiseCallbacks = {};\n
}\n
\n
return callbacks;\n
};\n
\n
var EventTarget = {\n
mixin: function(object) {\n
object.on = this.on;\n
object.off = this.off;\n
object.trigger = this.trigger;\n
return object;\n
},\n
\n
on: function(eventNames, callback, binding) {\n
var allCallbacks = callbacksFor(this), callbacks, eventName;\n
eventNames = eventNames.split(/\\s+/);\n
binding = binding || this;\n
\n
while (eventName = eventNames.shift()) {\n
callbacks = allCallbacks[eventName];\n
\n
if (!callbacks) {\n
callbacks = allCallbacks[eventName] = [];\n
}\n
\n
if (indexOf(callbacks, callback) === -1) {\n
callbacks.push([callback, binding]);\n
}\n
}\n
},\n
\n
off: function(eventNames, callback) {\n
var allCallbacks = callbacksFor(this), callbacks, eventName, index;\n
eventNames = eventNames.split(/\\s+/);\n
\n
while (eventName = eventNames.shift()) {\n
if (!callback) {\n
allCallbacks[eventName] = [];\n
continue;\n
}\n
\n
callbacks = allCallbacks[eventName];\n
\n
index = indexOf(callbacks, callback);\n
\n
if (index !== -1) { callbacks.splice(index, 1); }\n
}\n
},\n
\n
trigger: function(eventName, options) {\n
var allCallbacks = callbacksFor(this),\n
callbacks, callbackTuple, callback, binding, event;\n
\n
if (callbacks = allCallbacks[eventName]) {\n
// Don\'t cache the callbacks.length since it may grow\n
for (var i=0; i<callbacks.length; i++) {\n
callbackTuple = callbacks[i];\n
callback = callbackTuple[0];\n
binding = callbackTuple[1];\n
\n
if (typeof options !== \'object\') {\n
options = { detail: options };\n
}\n
\n
event = new Event(eventName, options);\n
callback.call(binding, event);\n
}\n
}\n
}\n
};\n
\n
\n
__exports__.EventTarget = EventTarget;\n
});\n
define("rsvp/hash",\n
["rsvp/defer","exports"],\n
function(__dependency1__, __exports__) {\n
"use strict";\n
var defer = __dependency1__.defer;\n
\n
function size(object) {\n
var s = 0;\n
\n
for (var prop in object) {\n
s++;\n
}\n
\n
return s;\n
}\n
\n
function hash(promises) {\n
var results = {}, deferred = defer(), remaining = size(promises);\n
\n
if (remaining === 0) {\n
deferred.resolve({});\n
}\n
\n
var resolver = function(prop) {\n
return function(value) {\n
resolveAll(prop, value);\n
};\n
};\n
\n
var resolveAll = function(prop, value) {\n
results[prop] = value;\n
if (--remaining === 0) {\n
deferred.resolve(results);\n
}\n
};\n
\n
var rejectAll = function(error) {\n
deferred.reject(error);\n
};\n
\n
for (var prop in promises) {\n
if (promises[prop] && typeof promises[prop].then === \'function\') {\n
promises[prop].then(resolver(prop), rejectAll);\n
} else {\n
resolveAll(prop, promises[prop]);\n
}\n
}\n
\n
return deferred.promise;\n
}\n
\n
\n
__exports__.hash = hash;\n
});\n
define("rsvp/node",\n
["rsvp/promise","rsvp/all","exports"],\n
function(__dependency1__, __dependency2__, __exports__) {\n
"use strict";\n
var Promise = __dependency1__.Promise;\n
var all = __dependency2__.all;\n
\n
function makeNodeCallbackFor(resolve, reject) {\n
return function (error, value) {\n
if (error) {\n
reject(error);\n
} else if (arguments.length > 2) {\n
resolve(Array.prototype.slice.call(arguments, 1));\n
} else {\n
resolve(value);\n
}\n
};\n
}\n
\n
function denodeify(nodeFunc) {\n
return function() {\n
var nodeArgs = Array.prototype.slice.call(arguments), resolve, reject;\n
var thisArg = this;\n
\n
var promise = new Promise(function(nodeResolve, nodeReject) {\n
resolve = nodeResolve;\n
reject = nodeReject;\n
});\n
\n
all(nodeArgs).then(function(nodeArgs) {\n
nodeArgs.push(makeNodeCallbackFor(resolve, reject));\n
\n
try {\n
nodeFunc.apply(thisArg, nodeArgs);\n
} catch(e) {\n
reject(e);\n
}\n
});\n
\n
return promise;\n
};\n
}\n
\n
\n
__exports__.denodeify = denodeify;\n
});\n
define("rsvp/promise",\n
["rsvp/config","rsvp/events","rsvp/cancellation_error","exports"],\n
function(__dependency1__, __dependency2__, __dependency3__, __exports__) {\n
"use strict";\n
var config = __dependency1__.config;\n
var EventTarget = __dependency2__.EventTarget;\n
var CancellationError = __dependency3__.CancellationError;\n
\n
function objectOrFunction(x) {\n
return isFunction(x) || (typeof x === "object" && x !== null);\n
}\n
\n
function isFunction(x){\n
return typeof x === "function";\n
}\n
\n
var Promise = function(resolver, canceller) {\n
var promise = this,\n
resolved = false;\n
\n
if (typeof resolver !== \'function\') {\n
throw new TypeError(\'You must pass a resolver function as the sole argument to the promise constructor\');\n
}\n
\n
if ((canceller !== undefined) && (typeof canceller !== \'function\')) {\n
throw new TypeError(\'You can only pass a canceller function\' +\n
\' as the second argument to the promise constructor\');\n
}\n
\n
if (!(promise instanceof Promise)) {\n
return new Promise(resolver, canceller);\n
}\n
\n
var resolvePromise = function(value) {\n
if (resolved) { return; }\n
resolved = true;\n
resolve(promise, value);\n
};\n
\n
var rejectPromise = function(value) {\n
if (resolved) { return; }\n
resolved = true;\n
reject(promise, value);\n
};\n
\n
var notifyPromise = function(value) {\n
if (resolved) { return; }\n
notify(promise, value);\n
};\n
\n
this.on(\'promise:failed\', function(event) {\n
this.trigger(\'error\', { detail: event.detail });\n
}, this);\n
\n
this.on(\'error\', onerror);\n
\n
this.cancel = function () {\n
// For now, simply reject the promise and does not propagate the cancel\n
// to parent or children\n
if (resolved) { return; }\n
if (canceller !== undefined) {\n
try {\n
canceller();\n
} catch (e) {\n
rejectPromise(e);\n
return;\n
}\n
}\n
// Trigger cancel?\n
rejectPromise(new CancellationError());\n
};\n
\n
try {\n
resolver(resolvePromise, rejectPromise, notifyPromise);\n
} catch(e) {\n
rejectPromise(e);\n
}\n
};\n
\n
function onerror(event) {\n
if (config.onerror) {\n
config.onerror(event.detail);\n
}\n
}\n
\n
var invokeCallback = function(type, promise, callback, event) {\n
var hasCallback = isFunction(callback),\n
value, error, succeeded, failed;\n
\n
if (promise.isFulfilled) { return; }\n
if (promise.isRejected) { return; }\n
\n
if (hasCallback) {\n
try {\n
value = callback(event.detail);\n
succeeded = true;\n
} catch(e) {\n
failed = true;\n
error = e;\n
}\n
} else {\n
value = event.detail;\n
succeeded = true;\n
}\n
\n
if (handleThenable(promise, value)) {\n
return;\n
} else if (hasCallback && succeeded) {\n
resolve(promise, value);\n
} else if (failed) {\n
reject(promise, error);\n
} else if (type === \'resolve\') {\n
resolve(promise, value);\n
} else if (type === \'reject\') {\n
reject(promise, value);\n
}\n
};\n
\n
\n
var invokeNotifyCallback = function(promise, callback, event) {\n
var value;\n
if (typeof callback === \'function\') {\n
try {\n
value = callback(event.detail);\n
} catch (e) {\n
// stop propagating\n
return;\n
}\n
notify(promise, value);\n
} else {\n
notify(promise, event.detail);\n
}\n
};\n
\n
Promise.prototype = {\n
constructor: Promise,\n
\n
isRejected: undefined,\n
isFulfilled: undefined,\n
rejectedReason: undefined,\n
fulfillmentValue: undefined,\n
\n
then: function(done, fail, progress) {\n
this.off(\'error\', onerror);\n
\n
var thenPromise = new this.constructor(function() {},\n
function () {\n
thenPromise.trigger(\'promise:cancelled\', {});\n
});\n
\n
if (this.isFulfilled) {\n
config.async(function(promise) {\n
invokeCallback(\'resolve\', thenPromise, done, { detail: promise.fulfillmentValue });\n
}, this);\n
}\n
\n
if (this.isRejected) {\n
config.async(function(promise) {\n
invokeCallback(\'reject\', thenPromise, fail, { detail: promise.rejectedReason });\n
}, this);\n
}\n
\n
this.on(\'promise:resolved\', function(event) {\n
invokeCallback(\'resolve\', thenPromise, done, event);\n
});\n
\n
this.on(\'promise:failed\', function(event) {\n
invokeCallback(\'reject\', thenPromise, fail, event);\n
});\n
\n
this.on(\'promise:notified\', function (event) {\n
invokeNotifyCallback(thenPromise, progress, event);\n
});\n
\n
return thenPromise;\n
},\n
\n
fail: function(fail) {\n
return this.then(null, fail);\n
},\n
\n
always: function(fail) {\n
return this.then(fail, fail);\n
}\n
};\n
\n
EventTarget.mixin(Promise.prototype);\n
\n
function resolve(promise, value) {\n
if (promise === value) {\n
fulfill(promise, value);\n
} else if (!handleThenable(promise, value)) {\n
fulfill(promise, value);\n
}\n
}\n
\n
function handleThenable(promise, value) {\n
var then = null,\n
resolved;\n
\n
try {\n
if (promise === value) {\n
throw new TypeError("A promises callback cannot return that same promise.");\n
}\n
\n
if (objectOrFunction(value)) {\n
then = value.then;\n
\n
if (isFunction(then)) {\n
if (isFunction(value.on)) {\n
value.on(\'promise:notified\', function (event) {\n
notify(promise, event.detail);\n
});\n
}\n
promise.on(\'promise:cancelled\', function(event) {\n
if (isFunction(value.cancel)) {\n
value.cancel();\n
}\n
});\n
then.call(value, function(val) {\n
if (resolved) { return true; }\n
resolved = true;\n
\n
if (value !== val) {\n
resolve(promise, val);\n
} else {\n
fulfill(promise, val);\n
}\n
}, function(val) {\n
if (resolved) { return true; }\n
resolved = true;\n
\n
reject(promise, val);\n
});\n
\n
return true;\n
}\n
}\n
} catch (error) {\n
reject(promise, error);\n
return true;\n
}\n
\n
return false;\n
}\n
\n
function fulfill(promise, value) {\n
config.async(function() {\n
if (promise.isFulfilled) { return; }\n
if (promise.isRejected) { return; }\n
promise.trigger(\'promise:resolved\', { detail: value });\n
promise.isFulfilled = true;\n
promise.fulfillmentValue = value;\n
});\n
}\n
\n
function reject(promise, value) {\n
config.async(function() {\n
if (promise.isFulfilled) { return; }\n
if (promise.isRejected) { return; }\n
promise.trigger(\'promise:failed\', { detail: value });\n
promise.isRejected = true;\n
promise.rejectedReason = value;\n
});\n
}\n
\n
function notify(promise, value) {\n
config.async(function() {\n
promise.trigger(\'promise:notified\', { detail: value });\n
});\n
}\n
\n
\n
__exports__.Promise = Promise;\n
});\n
define("rsvp/queue",\n
["rsvp/promise","rsvp/timeout","exports"],\n
function(__dependency1__, __dependency2__, __exports__) {\n
"use strict";\n
var Promise = __dependency1__.Promise;\n
var delay = __dependency2__.delay;\n
\n
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\n
function ResolvedQueueError(message) {\n
this.name = "resolved";\n
if ((message !== undefined) && (typeof message !== "string")) {\n
throw new TypeError(\'You must pass a string.\');\n
}\n
this.message = message || "Default Message";\n
}\n
ResolvedQueueError.prototype = new Error();\n
ResolvedQueueError.prototype.constructor = ResolvedQueueError;\n
\n
var Queue = function() {\n
var queue = this,\n
promise_list = [],\n
promise,\n
fulfill,\n
reject,\n
notify,\n
resolved;\n
\n
if (!(this instanceof Queue)) {\n
return new Queue();\n
}\n
\n
function canceller() {\n
for (var i = 0; i < 2; i++) {\n
promise_list[i].cancel();\n
}\n
}\n
\n
promise = new Promise(function(done, fail, progress) {\n
fulfill = function (fulfillmentValue) {\n
if (resolved) {return;}\n
queue.isFulfilled = true;\n
queue.fulfillmentValue = fulfillmentValue;\n
resolved = true;\n
return done(fulfillmentValue);\n
};\n
reject = function (rejectedReason) {\n
if (resolved) {return;}\n
queue.isRejected = true;\n
queue.rejectedReason = rejectedReason ;\n
resolved = true;\n
return fail(rejectedReason);\n
};\n
notify = progress;\n
}, canceller);\n
\n
promise_list.push(delay());\n
promise_list.push(promise_list[0].then(function () {\n
promise_list.splice(0, 2);\n
if (promise_list.length === 0) {\n
fulfill();\n
}\n
}));\n
\n
queue.cancel = function () {\n
if (resolved) {return;}\n
resolved = true;\n
promise.cancel();\n
promise.fail(function (rejectedReason) {\n
queue.isRejected = true;\n
queue.rejectedReason = rejectedReason;\n
});\n
};\n
queue.then = function () {\n
return promise.then.apply(promise, arguments);\n
};\n
\n
queue.push = function(done, fail, progress) {\n
var last_promise = promise_list[promise_list.length - 1],\n
next_promise;\n
\n
if (resolved) {\n
throw new ResolvedQueueError();\n
}\n
\n
next_promise = last_promise.then(done, fail, progress);\n
promise_list.push(next_promise);\n
\n
// Handle pop\n
last_promise = next_promise.then(function (fulfillmentValue) {\n
promise_list.splice(0, 2);\n
if (promise_list.length === 0) {\n
fulfill(fulfillmentValue);\n
} else {\n
return fulfillmentValue;\n
}\n
}, function (rejectedReason) {\n
promise_list.splice(0, 2);\n
if (promise_list.length === 0) {\n
reject(rejectedReason);\n
} else {\n
throw rejectedReason;\n
}\n
}, function (notificationValue) {\n
if (promise_list[promise_list.length - 1] === last_promise) {\n
notify(notificationValue);\n
}\n
return notificationValue;\n
});\n
promise_list.push(last_promise);\n
\n
return this;\n
};\n
};\n
\n
Queue.prototype = Object.create(Promise.prototype);\n
Queue.prototype.constructor = Queue;\n
\n
\n
__exports__.Queue = Queue;\n
__exports__.ResolvedQueueError = ResolvedQueueError;\n
});\n
define("rsvp/reject",\n
["rsvp/promise","exports"],\n
function(__dependency1__, __exports__) {\n
"use strict";\n
var Promise = __dependency1__.Promise;\n
\n
function reject(reason) {\n
return new Promise(function (resolve, reject) {\n
reject(reason);\n
});\n
}\n
\n
\n
__exports__.reject = reject;\n
});\n
define("rsvp/resolve",\n
["rsvp/promise","exports"],\n
function(__dependency1__, __exports__) {\n
"use strict";\n
var Promise = __dependency1__.Promise;\n
\n
function resolve(thenable) {\n
return new Promise(function(resolve, reject) {\n
if (typeof thenable === "object" && thenable !== null) {\n
var then = thenable.then;\n
if ((then !== undefined) && (typeof then === "function")) {\n
return then.apply(thenable, [resolve, reject]);\n
}\n
}\n
return resolve(thenable);\n
}, function () {\n
if ((thenable !== undefined) && (thenable.cancel !== undefined)) {\n
thenable.cancel();\n
}\n
});\n
}\n
\n
\n
__exports__.resolve = resolve;\n
});\n
define("rsvp/rethrow",\n
["exports"],\n
function(__exports__) {\n
"use strict";\n
var local = (typeof global === "undefined") ? this : global;\n
\n
function rethrow(reason) {\n
local.setTimeout(function() {\n
throw reason;\n
});\n
throw reason;\n
}\n
\n
\n
__exports__.rethrow = rethrow;\n
});\n
define("rsvp/timeout",\n
["rsvp/promise","exports"],\n
function(__dependency1__, __exports__) {\n
"use strict";\n
var Promise = __dependency1__.Promise;\n
\n
function promiseSetTimeout(millisecond, should_reject, message) {\n
var timeout_id;\n
\n
function resolver(resolve, reject) {\n
timeout_id = setTimeout(function () {\n
if (should_reject) {\n
reject(message);\n
} else {\n
resolve(message);\n
}\n
}, millisecond);\n
}\n
function canceller() {\n
clearTimeout(timeout_id);\n
}\n
return new Promise(resolver, canceller);\n
}\n
\n
function delay(millisecond, message) {\n
return promiseSetTimeout(millisecond, false, message);\n
}\n
\n
function timeout(millisecond) {\n
return promiseSetTimeout(millisecond, true,\n
"Timed out after " + millisecond + " ms");\n
}\n
\n
Promise.prototype.delay = function(millisecond) {\n
return this.then(function (fulfillmentValue) {\n
return delay(millisecond, fulfillmentValue);\n
});\n
};\n
\n
\n
__exports__.delay = delay;\n
__exports__.timeout = timeout;\n
});\n
define("rsvp/watcher",\n
["rsvp/promise","rsvp/queue","rsvp/cancellation_error","exports"],\n
function(__dependency1__, __dependency2__, __dependency3__, __exports__) {\n
"use strict";\n
var Promise = __dependency1__.Promise;\n
var Queue = __dependency2__.Queue;\n
var CancellationError = __dependency3__.CancellationError;\n
\n
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error\n
function ResolvedMonitorError(message) {\n
this.name = "resolved";\n
if ((message !== undefined) && (typeof message !== "string")) {\n
throw new TypeError(\'You must pass a string.\');\n
}\n
this.message = message || "Default Message";\n
}\n
ResolvedMonitorError.prototype = new Error();\n
ResolvedMonitorError.prototype.constructor = ResolvedMonitorError;\n
\n
function isFunction(x){\n
return typeof x === "function";\n
}\n
\n
var Monitor = function() {\n
var monitor = this,\n
promise_list = [],\n
promise,\n
reject,\n
notify,\n
resolved;\n
\n
if (!(this instanceof Monitor)) {\n
return new Monitor();\n
}\n
\n
function canceller() {\n
var len = promise_list.length,\n
i;\n
for (i = 0; i < len; i += 1) {\n
promise_list[i].cancel();\n
}\n
// Clean it to speed up other canceller run\n
promise_list = [];\n
}\n
\n
promise = new Promise(function(done, fail, progress) {\n
reject = function (rejectedReason) {\n
if (resolved) {return;}\n
monitor.isRejected = true;\n
monitor.rejectedReason = rejectedReason ;\n
resolved = true;\n
canceller();\n
return fail(rejectedReason);\n
};\n
notify = progress;\n
}, canceller);\n
\n
monitor.cancel = function () {\n
if (resolved) {return;}\n
resolved = true;\n
promise.cancel();\n
promise.fail(function (rejectedReason) {\n
monitor.isRejected = true;\n
monitor.rejectedReason = rejectedReason;\n
});\n
};\n
monitor.then = function () {\n
return promise.then.apply(promise, arguments);\n
};\n
\n
monitor.monitor = function(promise_to_monitor) {\n
if (resolved) {\n
throw new ResolvedMonitorError();\n
}\n
var queue = new Queue()\n
.push(function () {\n
return promise_to_monitor;\n
})\n
.push(function (fulfillmentValue) {\n
// Promise to monitor is fullfilled, remove it from the list\n
var len = promise_list.length,\n
promise_to_monitor,\n
new_promise_list = [],\n
i;\n
for (i = 0; i < len; i += 1) {\n
promise_to_monitor = promise_list[i];\n
if (!(promise_to_monitor.isFulfilled ||\n
promise_to_monitor.isRejected)) {\n
new_promise_list.push(promise_to_monitor);\n
}\n
}\n
promise_list = new_promise_list;\n
}, function (rejectedReason) {\n
if (rejectedReason instanceof CancellationError) {\n
if (!(promise_to_monitor.isFulfilled && promise_to_monitor.isRejected)) {\n
// The queue could be cancelled before the first push is run\n
promise_to_monitor.cancel();\n
}\n
}\n
reject(rejectedReason);\n
throw rejectedReason;\n
}, function (notificationValue) {\n
notify(notificationValue);\n
return notificationValue;\n
});\n
\n
promise_list.push(queue);\n
\n
return this;\n
};\n
};\n
\n
Monitor.prototype = Object.create(Promise.prototype);\n
Monitor.prototype.constructor = Monitor;\n
\n
\n
__exports__.Monitor = Monitor;\n
__exports__.ResolvedMonitorError = ResolvedMonitorError;\n
});\n
define("rsvp",\n
["rsvp/events","rsvp/cancellation_error","rsvp/promise","rsvp/node","rsvp/all","rsvp/queue","rsvp/watcher","rsvp/timeout","rsvp/hash","rsvp/rethrow","rsvp/defer","rsvp/config","rsvp/resolve","rsvp/reject","exports"],\n
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __exports__) {\n
"use strict";\n
var EventTarget = __dependency1__.EventTarget;\n
var CancellationError = __dependency2__.CancellationError;\n
var Promise = __dependency3__.Promise;\n
var denodeify = __dependency4__.denodeify;\n
var all = __dependency5__.all;\n
var any = __dependency5__.any;\n
var Queue = __dependency6__.Queue;\n
var ResolvedQueueError = __dependency6__.ResolvedQueueError;\n
var Monitor = __dependency7__.Monitor;\n
var ResolvedMonitorError = __dependency7__.ResolvedMonitorError;\n
var delay = __dependency8__.delay;\n
var timeout = __dependency8__.timeout;\n
var hash = __dependency9__.hash;\n
var rethrow = __dependency10__.rethrow;\n
var defer = __dependency11__.defer;\n
var config = __dependency12__.config;\n
var resolve = __dependency13__.resolve;\n
var reject = __dependency14__.reject;\n
\n
function configure(name, value) {\n
config[name] = value;\n
}\n
\n
\n
__exports__.CancellationError = CancellationError;\n
__exports__.Promise = Promise;\n
__exports__.EventTarget = EventTarget;\n
__exports__.all = all;\n
__exports__.any = any;\n
__exports__.Queue = Queue;\n
__exports__.ResolvedQueueError = ResolvedQueueError;\n
__exports__.Monitor = Monitor;\n
__exports__.ResolvedMonitorError = ResolvedMonitorError;\n
__exports__.delay = delay;\n
__exports__.timeout = timeout;\n
__exports__.hash = hash;\n
__exports__.rethrow = rethrow;\n
__exports__.defer = defer;\n
__exports__.denodeify = denodeify;\n
__exports__.configure = configure;\n
__exports__.resolve = resolve;\n
__exports__.reject = reject;\n
});\n
window.RSVP = requireModule("rsvp");\n
})(window);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>30923</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681770.79</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>uritemplate.min.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
!function(e){"use strict";function t(e){var n;if(null===e||void 0===e)return!1;if(r.isArray(e))return e.length>0;if("string"==typeof e||"number"==typeof e||"boolean"==typeof e)return!0;for(n in e)if(e.hasOwnProperty(n)&&t(e[n]))return!0;return!1}var n=function(){function e(e){this.options=e}return e.prototype.toString=function(){return JSON&&JSON.stringify?JSON.stringify(this.options):this.options},e}(),r=function(){function e(e){return"[object Array]"===Object.prototype.toString.apply(e)}function t(e){return"[object String]"===Object.prototype.toString.apply(e)}function n(e){return"[object Number]"===Object.prototype.toString.apply(e)}function r(e){return"[object Boolean]"===Object.prototype.toString.apply(e)}function i(e,t){var n,r="",i=!0;for(n=0;n<e.length;n+=1)i?i=!1:r+=t,r+=e[n];return r}function o(e,t){for(var n=[],r=0;r<e.length;r+=1)n.push(t(e[r]));return n}function s(e,t){for(var n=[],r=0;r<e.length;r+=1)t(e[r])&&n.push(e[r]);return n}function a(e){if("object"!=typeof e||null===e)return e;Object.freeze(e);var t,n;for(n in e)e.hasOwnProperty(n)&&(t=e[n],"object"==typeof t&&u(t));return e}function u(e){return"function"==typeof Object.freeze?a(e):e}return{isArray:e,isString:t,isNumber:n,isBoolean:r,join:i,map:o,filter:s,deepFreeze:u}}(),i=function(){function e(e){return e>="a"&&"z">=e||e>="A"&&"Z">=e}function t(e){return e>="0"&&"9">=e}function n(e){return t(e)||e>="a"&&"f">=e||e>="A"&&"F">=e}return{isAlpha:e,isDigit:t,isHexDigit:n}}(),o=function(){function e(e){var t,n,r="",i=s.encode(e);for(n=0;n<i.length;n+=1)t=i.charCodeAt(n),r+="%"+(16>t?"0":"")+t.toString(16).toUpperCase();return r}function t(e,t){return"%"===e.charAt(t)&&i.isHexDigit(e.charAt(t+1))&&i.isHexDigit(e.charAt(t+2))}function n(e,t){return parseInt(e.substr(t,2),16)}function r(e){if(!t(e,0))return!1;var r=n(e,1),i=s.numBytes(r);if(0===i)return!1;for(var o=1;i>o;o+=1)if(!t(e,3*o)||!s.isValidFollowingCharCode(n(e,3*o+1)))return!1;return!0}function o(e,r){var i=e.charAt(r);if(!t(e,r))return i;var o=n(e,r+1),a=s.numBytes(o);if(0===a)return i;for(var u=1;a>u;u+=1)if(!t(e,r+3*u)||!s.isValidFollowingCharCode(n(e,r+3*u+1)))return i;return e.substr(r,3*a)}var s={encode:function(e){return unescape(encodeURIComponent(e))},numBytes:function(e){return 127>=e?1:e>=194&&223>=e?2:e>=224&&239>=e?3:e>=240&&244>=e?4:0},isValidFollowingCharCode:function(e){return e>=128&&191>=e}};return{encodeCharacter:e,isPctEncoded:r,pctCharAt:o}}(),s=function(){function e(e){return i.isAlpha(e)||i.isDigit(e)||"_"===e||o.isPctEncoded(e)}function t(e){return i.isAlpha(e)||i.isDigit(e)||"-"===e||"."===e||"_"===e||"~"===e}function n(e){return":"===e||"/"===e||"?"===e||"#"===e||"["===e||"]"===e||"@"===e||"!"===e||"$"===e||"&"===e||"("===e||")"===e||"*"===e||"+"===e||","===e||";"===e||"="===e||"\'"===e}return{isVarchar:e,isUnreserved:t,isReserved:n}}(),a=function(){function e(e,t){var n,r="",i="";for(("number"==typeof e||"boolean"==typeof e)&&(e=e.toString()),n=0;n<e.length;n+=i.length)i=e.charAt(n),r+=s.isUnreserved(i)||t&&s.isReserved(i)?i:o.encodeCharacter(i);return r}function t(t){return e(t,!0)}function n(e,t){var n=o.pctCharAt(e,t);return n.length>1?n:s.isReserved(n)||s.isUnreserved(n)?n:o.encodeCharacter(n)}function r(e){var t,n="",r="";for(t=0;t<e.length;t+=r.length)r=o.pctCharAt(e,t),n+=r.length>1?r:s.isReserved(r)||s.isUnreserved(r)?r:o.encodeCharacter(r);return n}return{encode:e,encodePassReserved:t,encodeLiteral:r,encodeLiteralCharacter:n}}(),u=function(){function e(e){t[e]={symbol:e,separator:"?"===e?"&":""===e||"+"===e||"#"===e?",":e,named:";"===e||"&"===e||"?"===e,ifEmpty:"&"===e||"?"===e?"=":"",first:"+"===e?"":e,encode:"+"===e||"#"===e?a.encodePassReserved:a.encode,toString:function(){return this.symbol}}}var t={};return e(""),e("+"),e("#"),e("."),e("/"),e(";"),e("?"),e("&"),{valueOf:function(e){return t[e]?t[e]:"=,!@|".indexOf(e)>=0?null:t[""]}}}(),p=function(){function e(e){this.literal=a.encodeLiteral(e)}return e.prototype.expand=function(){return this.literal},e.prototype.toString=e.prototype.expand,e}(),f=function(){function e(e){function t(){var t=e.substring(h,p);if(0===t.length)throw new n({expressionText:e,message:"a varname must be specified",position:p});c={varname:t,exploded:!1,maxLength:null},h=null}function r(){if(d===p)throw new n({expressionText:e,message:"after a \':\' you have to specify the length",position:p});c.maxLength=parseInt(e.substring(d,p),10),d=null}var a,p,f=[],c=null,h=null,d=null,g="";for(a=function(t){var r=u.valueOf(t);if(null===r)throw new n({expressionText:e,message:"illegal use of reserved operator",position:p,operator:t});return r}(e.charAt(0)),p=a.symbol.length,h=p;p<e.length;p+=g.length){if(g=o.pctCharAt(e,p),null!==h){if("."===g){if(h===p)throw new n({expressionText:e,message:"a varname MUST NOT start with a dot",position:p});continue}if(s.isVarchar(g))continue;t()}if(null!==d){if(p===d&&"0"===g)throw new n({expressionText:e,message:"A :prefix must not start with digit 0",position:p});if(i.isDigit(g)){if(p-d>=4)throw new n({expressionText:e,message:"A :prefix must have max 4 digits",position:p});continue}r()}if(":"!==g)if("*"!==g){if(","!==g)throw new n({expressionText:e,message:"illegal character",character:g,position:p});f.push(c),c=null,h=p+1}else{if(null===c)throw new n({expressionText:e,message:"exploded without varspec",position:p});if(c.exploded)throw new n({expressionText:e,message:"exploded twice",position:p});if(c.maxLength)throw new n({expressionText:e,message:"an explode (*) MUST NOT follow to a prefix",position:p});c.exploded=!0}else{if(null!==c.maxLength)throw new n({expressionText:e,message:"only one :maxLength is allowed per varspec",position:p});if(c.exploded)throw new n({expressionText:e,message:"an exploeded varspec MUST NOT be varspeced",position:p});d=p+1}}return null!==h&&t(),null!==d&&r(),f.push(c),new l(e,a,f)}function t(e){return e.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g,"\\\\$&")}function r(r){var i,o,s,a=[],u=null,f="",l=!0,h=0;for(i=0;i<r.length;i+=1)if(o=r.charAt(i),null===h){if(null===u)throw new Error("reached unreachable code");if("{"===o)throw new n({templateText:r,message:"brace already opened",position:i});if("}"===o){if(u+1===i)throw new n({templateText:r,message:"empty braces",position:u});try{s=e(r.substring(u+1,i))}catch(d){if(d.prototype===n.prototype)throw new n({templateText:r,message:d.options.message,position:u+d.options.position,details:d.options});throw d}a.push(s),0===s.operator.symbol.length?f+="([^/]+)":l=!1,u=null,h=i+1}}else{if("}"===o)throw new n({templateText:r,message:"unopened brace closed",position:i});"{"===o&&(i>h&&(s=new p(r.substring(h,i)),a.push(s),f+=t(s.literal)),h=null,u=i)}if(null!==u)throw new n({templateText:r,message:"unclosed brace",position:u});return h<r.length&&(s=new p(r.substring(h)),a.push(s),f+=t(s.literal)),l===!1&&(f=void 0),new c(r,a,f)}return r}(),l=function(){function e(e){return JSON&&JSON.stringify?JSON.stringify(e):e}function n(e){if(!t(e))return!0;if(r.isString(e))return""===e;if(r.isNumber(e)||r.isBoolean(e))return!1;if(r.isArray(e))return 0===e.length;for(var n in e)if(e.hasOwnProperty(n))return!1;return!0}function i(e){var t,n=[];for(t in e)e.hasOwnProperty(t)&&n.push({name:t,value:e[t]});return n}function o(e,t,n){this.templateText=e,this.operator=t,this.varspecs=n}function s(e,t,n){var r="";if(n=n.toString(),t.named){if(r+=a.encodeLiteral(e.varname),""===n)return r+=t.ifEmpty;r+="="}return null!==e.maxLength&&(n=n.substr(0,e.maxLength)),r+=t.encode(n)}function u(e){return t(e.value)}function p(e,o,s){var p=[],f="";if(o.named){if(f+=a.encodeLiteral(e.varname),n(s))return f+=o.ifEmpty;f+="="}return r.isArray(s)?(p=s,p=r.filter(p,t),p=r.map(p,o.encode),f+=r.join(p,",")):(p=i(s),p=r.filter(p,u),p=r.map(p,function(e){return o.encode(e.name)+","+o.encode(e.value)}),f+=r.join(p,",")),f}function f(e,o,s){var p=r.isArray(s),f=[];return p?(f=s,f=r.filter(f,t),f=r.map(f,function(t){var r=a.encodeLiteral(e.varname);return r+=n(t)?o.ifEmpty:"="+o.encode(t)})):(f=i(s),f=r.filter(f,u),f=r.map(f,function(e){var t=a.encodeLiteral(e.name);return t+=n(e.value)?o.ifEmpty:"="+o.encode(e.value)})),r.join(f,o.separator)}function l(e,n){var o=[],s="";return r.isArray(n)?(o=n,o=r.filter(o,t),o=r.map(o,e.encode),s+=r.join(o,e.separator)):(o=i(n),o=r.filter(o,function(e){return t(e.value)}),o=r.map(o,function(t){return e.encode(t.name)+"="+e.encode(t.value)}),s+=r.join(o,e.separator)),s}return o.prototype.toString=function(){return this.templateText},o.prototype.expand=function(i){var o,a,u,c,h=[],d=!1,g=this.operator;for(o=0;o<this.varspecs.length;o+=1)if(a=this.varspecs[o],u=i[a.varname],null!==u&&void 0!==u)if(a.exploded&&(d=!0),c=r.isArray(u),"string"==typeof u||"number"==typeof u||"boolean"==typeof u)h.push(s(a,g,u));else{if(a.maxLength&&t(u))throw new Error("Prefix modifiers are not applicable to variables that have composite values. You tried to expand "+this+" with "+e(u));a.exploded?t(u)&&(g.named?h.push(f(a,g,u)):h.push(l(g,u))):(g.named||!n(u))&&h.push(p(a,g,u))}return 0===h.length?"":g.first+r.join(h,g.separator)},o}(),c=function(){function e(e,t,n){this.templateText=e,this.expressions=t,void 0!==n&&(this.regexp=new RegExp("^"+n+"$")),r.deepFreeze(this)}return e.prototype.toString=function(){return this.templateText},e.prototype.expand=function(e){var t,n="";for(t=0;t<this.expressions.length;t+=1)n+=this.expressions[t].expand(e);return n},e.prototype.extract=function(e){var t,n,r,i,o=1,s=!0,a={};if(void 0!==this.regexp&&this.regexp.test(e)){for(i=this.regexp.exec(e),t=0;t<this.expressions.length;t+=1)n=this.expressions[t],void 0===n.literal&&(void 0!==n.operator&&0===n.operator.symbol.length&&1===n.varspecs.length?(r=n.varspecs[0],r.exploded===!1&&null===r.maxLength?-1===i[o].indexOf(",")?(a[r.varname]=decodeURIComponent(i[o]),o+=1):s=!1:s=!1):s=!1);if(s)return a}return!1},e.parse=f,e.UriTemplateError=n,e}();e(c)}(function(e){"use strict";"undefined"!=typeof module?module.exports=e:"function"==typeof define?define([],function(){return e}):"undefined"!=typeof window?window.UriTemplate=e:global.UriTemplate=e});
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>10059</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>list_field</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681771.98</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n
<meta name="viewport" content="width=device-width, user-scalable=no" />\n
<title>Listfield</title>\n
\n
<!-- renderjs -->\n
<script src="../lib/rsvp.min.js" type="text/javascript"></script>\n
<script src="../lib/renderjs.min.js" type="text/javascript"></script>\n
<script src="../lib/handlebars.min.js" type="text/javascript"></script>\n
<!-- custom script -->\n
<script src="listfield.js" type="text/javascript"></script>\n
\n
<script id="option-template" type="text/x-handlebars-template">\n
<option value="{{value}}">{{text}}</option>\n
</script>\n
\n
<script id="selected-option-template" type="text/x-handlebars-template">\n
<option selected="selected" value="{{value}}">{{text}}</option>\n
</script>\n
\n
</head>\n
<body>\n
<select />\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>893</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681772.11</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>listfield.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
/*global window, rJS, Handlebars */\n
/*jslint nomen: true */\n
(function(window, rJS, Handlebars) {\n
"use strict";\n
/////////////////////////////////////////////////////////////////\n
// Handlebars\n
/////////////////////////////////////////////////////////////////\n
// Precompile the templates while loading the first gadget instance\n
var gadget_klass = rJS(window), option_source = gadget_klass.__template_element.getElementById("option-template").innerHTML, option_template = Handlebars.compile(option_source), selected_option_source = gadget_klass.__template_element.getElementById("selected-option-template").innerHTML, selected_option_template = Handlebars.compile(selected_option_source);\n
gadget_klass.ready(function(g) {\n
return g.getElement().push(function(element) {\n
g.element = element;\n
});\n
}).declareMethod("render", function(options) {\n
var select = this.element.getElementsByTagName("select")[0], i, template, tmp = "";\n
select.setAttribute("name", options.key);\n
for (i = 0; i < options.property_definition.enum.length; i += 1) {\n
if (options.property_definition.enum[i] === options.value) {\n
template = selected_option_template;\n
} else {\n
template = option_template;\n
}\n
// XXX value and text are always same in json schema\n
tmp += template({\n
value: options.property_definition.enum[i],\n
text: options.property_definition.enum[i]\n
});\n
}\n
select.innerHTML += tmp;\n
}).declareMethod("getContent", function() {\n
var select = this.element.getElementsByTagName("select")[0], result = {};\n
result[select.getAttribute("name")] = select.options[select.selectedIndex].value;\n
return result;\n
});\n
})(window, rJS, Handlebars);
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1870</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>number_field</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681772.4</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n
<meta name="viewport" content="width=device-width, user-scalable=no" />\n
<title>Number field</title>\n
\n
<!-- renderjs -->\n
<script src="../lib/rsvp.min.js"></script>\n
<script src="../lib/renderjs.min.js"></script>\n
<!-- custom script -->\n
<script src="numberfield.js" type="text/javascript"></script>\n
\n
</head>\n
<body>\n
<input type=\'number\' step="any" data-mini="true" />\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>522</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681772.54</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>numberfield.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global window, rJS */\n
(function(window, rJS) {\n
"use strict";\n
rJS(window).ready(function(gadget) {\n
return gadget.getElement().push(function(element) {\n
gadget.element = element;\n
});\n
}).declareMethod("render", function(options) {\n
var input = this.element.querySelector("input");\n
input.setAttribute("value", options.value);\n
input.setAttribute("name", options.key);\n
input.setAttribute("title", options.title || options.key);\n
}).declareMethod("getContent", function() {\n
var input = this.element.querySelector("input"), result = {};\n
if (input.value !== "") {\n
result[input.getAttribute("name")] = parseFloat(input.value);\n
} else {\n
result[input.getAttribute("name")] = null;\n
}\n
return result;\n
});\n
})(window, rJS);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>849</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>string_field</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681773.03</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!DOCTYPE html>\n
<html>\n
<head>\n
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n
<meta name="viewport" content="width=device-width, user-scalable=no" />\n
<title>Stringfield</title>\n
\n
<!-- renderjs -->\n
<script src="../lib/rsvp.min.js"></script>\n
<script src="../lib/renderjs.min.js"></script>\n
<!-- custom script -->\n
<script src="stringfield.js" type="text/javascript"></script>\n
\n
</head>\n
<body>\n
<input type=\'text\' data-mini="true" />\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>508</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681773.32</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>stringfield.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global window, rJS */\n
(function(window, rJS) {\n
"use strict";\n
rJS(window).ready(function(gadget) {\n
return gadget.getElement().push(function(element) {\n
gadget.element = element;\n
});\n
}).declareMethod("render", function(options) {\n
var input = this.element.querySelector("input");\n
input.setAttribute("value", options.value || "");\n
input.setAttribute("name", options.key);\n
input.setAttribute("title", options.title || options.key);\n
}).declareMethod("getContent", function() {\n
var input = this.element.querySelector("input"), result = {};\n
result[input.getAttribute("name")] = input.value;\n
return result;\n
});\n
})(window, rJS);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>723</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>toolbox</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681773.72</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>index.html</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string encoding="cdata"><![CDATA[
<!doctype html>\n
<html>\n
<head>\n
<meta charset="utf-8">\n
<link rel="stylesheet" href="../lib/jquery-ui.css">\n
<link rel="stylesheet" href="toolbox.css">\n
\n
<script src="../lib/rsvp.min.js"></script>\n
<script src="../lib/renderjs.min.js"></script>\n
<script src="../dream/mixin_gadget.js"></script>\n
<script src="../dream/mixin_promise.js"></script>\n
\n
<script src="toolbox.js"></script>\n
</head>\n
<body>\n
<div class="tools"></div>\n
</body>\n
</html>\n
]]></string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>475</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681773.91</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>toolbox.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>.tools{border:1px solid #999;margin:20px 0;border-radius:10px;padding-bottom:20px}.tools-container{margin-bottom:4px}.tools .ui-button{margin:4px 0}.tool{border:1px solid #d3d3d3;box-shadow:1px 1px 2px #aaa;min-width:7em;height:3em;z-index:10001;color:gray;font-family:serif;font-style:italic;font-size:.9em;margin:.8em;display:inline-block;border-radius:5px;text-align:center;padding-top:1.3em;cursor:move}.Dream-Source,.Dream-BatchSource{border:1px solid #bbc;background-color:#ffe;background-image:linear-gradient(to bottom,#ffe 0,#dde 100%)}.Dream-Machine,.Dream-MachineJobShop,.Dream-BatchScrapMachine,.Dream-MachineManagedJob,.Dream-MouldAssembly{border:1px solid #cbc;background-color:#fef;background-image:linear-gradient(to bottom,#fef 0,#ede 100%)}.Dream-Queue,.Dream-QueueJobShop,.Dream-LineClearance,.Dream-QueueManagedJob,.Dream-ConditionalBuffer,.Dream-OrderDecomposition,.Dream-MouldAssemblyBuffer{border:1px solid #bcc;background-color:#eff;background-image:linear-gradient(to bottom,#eff 0,#dee 100%)}.Dream-Exit,.Dream-ExitJobShop{border:1px solid #ccb;background-color:#eef;background-image:linear-gradient(to bottom,#eef 0,#dde 100%)}.Dream-EventGenerator{border:1px solid #cba;background-color:#fdc;background-image:linear-gradient(to bottom,#fdc 0,#ecb 100%)}.Dream-BatchDecomposition,.Dream-BatchDecompositionStartTime,.Dream-BatchReassembly{border:1px solid #bcb;background-color:#dfd;background-image:linear-gradient(to bottom,#dfd 0,#cec 100%)}.Dream-Repairman{border:1px solid #cbb;background-color:#fdd;background-image:linear-gradient(to bottom,#fdd 0,#dcc 100%)}</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>1592</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_EtagSupport__etag</string> </key>
<value> <string>ts17681774.03</string> </value>
</item>
<item>
<key> <string>__name__</string> </key>
<value> <string>toolbox.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>data</string> </key>
<value> <string>/*global window, document, RSVP, rJS, initGadgetMixin*/\n
(function(window, document, RSVP, rJS, initGadgetMixin) {\n
"use strict";\n
/*jslint nomen: true*/\n
var gadget_klass = rJS(window);\n
function waitForDragstart(tool) {\n
var callback;\n
function canceller() {\n
if (callback !== undefined) {\n
tool.removeEventListener("dragstart", callback, false);\n
}\n
}\n
/*jslint unparam: true*/\n
function itsANonResolvableTrap(resolve, reject) {\n
callback = function(evt) {\n
try {\n
evt.dataTransfer.setData("application/json", tool.dataset.class_name);\n
} catch (e) {\n
reject(e);\n
}\n
};\n
tool.addEventListener("dragstart", callback, false);\n
}\n
return new RSVP.Promise(itsANonResolvableTrap, canceller);\n
}\n
initGadgetMixin(gadget_klass);\n
gadget_klass.declareMethod("render", function(json_data) {\n
var data = JSON.parse(json_data), tools_container = document.createElement("div");\n
/* display all nodes in the palette.\n
*/\n
tools_container.className = "tools-container";\n
Object.keys(data.class_definition).forEach(function(key) {\n
var _class = data.class_definition[key], tool;\n
// XXX "expand" the json schema "allOF" etc\n
if (_class._class === "node") {\n
tool = document.createElement("div");\n
// XXX maybe allow to configure the class name ?\n
tool.className = "tool " + key;\n
tool.textContent = _class.name || key;\n
tool.draggable = true;\n
tool.dataset.class_name = JSON.stringify(key);\n
Object.keys(_class.css || {}).forEach(function(k) {\n
tool.style[k] = _class.css[k];\n
});\n
tools_container.appendChild(tool);\n
}\n
});\n
this.props.element.querySelector(".tools").appendChild(tools_container);\n
}).declareMethod("startService", function() {\n
var promiseArray = [];\n
[].forEach.call(this.props.element.querySelectorAll(".tool"), function(tool) {\n
promiseArray.push(waitForDragstart(tool));\n
});\n
return RSVP.all(promiseArray);\n
});\n
})(window, document, RSVP, rJS, initGadgetMixin);</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>size</string> </key>
<value> <int>2386</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="InteractionWorkflowDefinition" module="Products.ERP5.InteractionWorkflow"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>groups</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>business_process_graph_editor_interaction_workflow</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Interaction" module="Products.ERP5.Interaction"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_mapping</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>interactions</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="InteractionDefinition" module="Products.ERP5.Interaction"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>actbox_category</string> </key>
<value> <string>workflow</string> </value>
</item>
<item>
<key> <string>actbox_name</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>actbox_url</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>activate_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>after_script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>before_commit_script_name</string> </key>
<value>
<list>
<string>afterEdit</string>
</list>
</value>
</item>
<item>
<key> <string>description</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>guard</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>method_id</string> </key>
<value>
<list>
<string>edit</string>
</list>
</value>
</item>
<item>
<key> <string>once_per_transaction</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>portal_type_filter</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>portal_type_group_filter</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>script_name</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>temporary_document_disallowed</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>trigger_type</string> </key>
<value> <int>2</int> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Scripts" module="Products.DCWorkflow.Scripts"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_mapping</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>scripts</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>_bind_names</string> </key>
<value>
<object>
<klass>
<global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_asgns</string> </key>
<value>
<dictionary>
<item>
<key> <string>name_container</string> </key>
<value> <string>container</string> </value>
</item>
<item>
<key> <string>name_context</string> </key>
<value> <string>context</string> </value>
</item>
<item>
<key> <string>name_m_self</string> </key>
<value> <string>script</string> </value>
</item>
<item>
<key> <string>name_subpath</string> </key>
<value> <string>traverse_subpath</string> </value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_body</string> </key>
<value> <string>import json\n
graph = sci[\'object\'].getProperty(\'jsplumb_graph\')\n
\n
#if graph:\n
# graph = json.loads(graph)\n
context.log(graph)\n
</string> </value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>sci</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>afterEdit</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Variables" module="Products.DCWorkflow.Variables"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_mapping</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>variables</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Worklists" module="Products.DCWorkflow.Worklists"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_mapping</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>worklists</string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Business Process | business_process_graph_editor_interaction_workflow
\ No newline at end of file
erp5_graph_editor
\ No newline at end of file
business_process_graph_editor_interaction_workflow
\ No newline at end of file
erp5_graph_editor
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment