Commit f6bcbc60 authored by Vincent Pelletier's avatar Vincent Pelletier

Initial commit.


git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@17689 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 7fcf0d19
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<tuple>
<global name="Alarm" module="Products.ERP5Type.Document.Alarm"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__ac_local_roles__</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_owner</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>active_sense_method_id</string> </key>
<value> <string>Base_refreshWorklistTableContent</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>enabled</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>worklist_refresh</string> </value>
</item>
<item>
<key> <string>periodicity_hour</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>periodicity_minute</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>periodicity_minute_frequency</string> </key>
<value> <int>5</int> </value>
</item>
<item>
<key> <string>periodicity_month</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>periodicity_month_day</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>periodicity_start_date</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>_aday</string> </key>
<value> <string>Fri</string> </value>
</item>
<item>
<key> <string>_amon</string> </key>
<value> <string>Nov</string> </value>
</item>
<item>
<key> <string>_d</string> </key>
<value> <float>39028.0</float> </value>
</item>
<item>
<key> <string>_day</string> </key>
<value> <int>9</int> </value>
</item>
<item>
<key> <string>_dayoffset</string> </key>
<value> <int>5</int> </value>
</item>
<item>
<key> <string>_fday</string> </key>
<value> <string>Friday</string> </value>
</item>
<item>
<key> <string>_fmon</string> </key>
<value> <string>November</string> </value>
</item>
<item>
<key> <string>_hour</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>_millis</string> </key>
<value> <long>1194566400000</long> </value>
</item>
<item>
<key> <string>_minute</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>_month</string> </key>
<value> <int>11</int> </value>
</item>
<item>
<key> <string>_nearsec</string> </key>
<value> <float>0.0</float> </value>
</item>
<item>
<key> <string>_pday</string> </key>
<value> <string>Fri.</string> </value>
</item>
<item>
<key> <string>_pm</string> </key>
<value> <string>am</string> </value>
</item>
<item>
<key> <string>_pmhour</string> </key>
<value> <int>12</int> </value>
</item>
<item>
<key> <string>_pmon</string> </key>
<value> <string>Nov.</string> </value>
</item>
<item>
<key> <string>_second</string> </key>
<value> <float>0.0</float> </value>
</item>
<item>
<key> <string>_t</string> </key>
<value> <float>1194566400.0</float> </value>
</item>
<item>
<key> <string>_tz</string> </key>
<value> <string>GMT</string> </value>
</item>
<item>
<key> <string>_year</string> </key>
<value> <int>2007</int> </value>
</item>
<item>
<key> <string>time</string> </key>
<value> <float>0.0</float> </value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>periodicity_week</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Alarm</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Refresh worklist table content</string> </value>
</item>
<item>
<key> <string>uid</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<tuple>
<global name="Folder" module="OFS.Folder"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__ac_local_roles__</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>_owner</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>erp5_worklist_sql</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>
<tuple>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Python_magic</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>__ac_local_roles__</string> </key>
<value>
<none/>
</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>from ZODB.POSException import ConflictError\n
# Wrapper for zGetCountFromWorklistTable\n
where_expression = query.asSQLExpression()[\'where_expression\']\n
try:\n
result = context.zGetCountFromWorklistTable(\n
where_expression=where_expression,\n
select_expression=select_expression,\n
group_by_expression=group_by_expression,\n
**kw)\n
except ConflictError:\n
raise\n
except:\n
# Possibly a SQL error caused by a non-existing table.\n
# Attemp a refresh and retry without error handling.\n
context.Base_refreshWorklistTableContent()\n
result = context.zGetCountFromWorklistTable(\n
where_expression=where_expression,\n
select_expression=select_expression,\n
group_by_expression=group_by_expression,\n
**kw)\n
return result\n
</string> </value>
</item>
<item>
<key> <string>_code</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_filepath</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string>query, select_expression, group_by_expression, **kw</string> </value>
</item>
<item>
<key> <string>errors</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>func_code</string> </key>
<value>
<object>
<klass>
<global name="FuncCode" module="Shared.DC.Scripts.Signature"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>co_argcount</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>co_varnames</string> </key>
<value>
<tuple>
<string>query</string>
<string>select_expression</string>
<string>group_by_expression</string>
<string>kw</string>
<string>ZODB.POSException</string>
<string>ConflictError</string>
<string>_getitem_</string>
<string>_getattr_</string>
<string>where_expression</string>
<string>_apply_</string>
<string>context</string>
<string>result</string>
</tuple>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>func_defaults</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Base_getCountFromWorklistTable</string> </value>
</item>
<item>
<key> <string>warnings</string> </key>
<value>
<tuple/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<tuple>
<global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>Python_magic</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>Script_magic</string> </key>
<value> <int>3</int> </value>
</item>
<item>
<key> <string>__ac_local_roles__</string> </key>
<value>
<none/>
</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>context.getPortalObject().portal_workflow.refreshWorklistCache()\n
</string> </value>
</item>
<item>
<key> <string>_code</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_filepath</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_params</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>errors</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>func_code</string> </key>
<value>
<object>
<klass>
<global name="FuncCode" module="Shared.DC.Scripts.Signature"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>co_argcount</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>co_varnames</string> </key>
<value>
<tuple>
<string>_getattr_</string>
<string>context</string>
</tuple>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>func_defaults</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>Base_refreshWorklistTableContent</string> </value>
</item>
<item>
<key> <string>warnings</string> </key>
<value>
<tuple/>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<tuple>
<global name="SQL" module="Products.ZSQLMethods.SQL"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__ac_local_roles__</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_arg</string> </key>
<value>
<object>
<klass>
<global name="Args" module="Shared.DC.ZRDB.Aqueduct"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_data</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>_keys</string> </key>
<value>
<list/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>_col</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>arguments_src</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>connection_id</string> </key>
<value> <string>erp5_sql_connection</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>zCreateWorklistTable</string> </value>
</item>
<item>
<key> <string>src</string> </key>
<value> <string encoding="cdata"><![CDATA[
DROP TABLE IF EXISTS worklist_cache\n
<dtml-var sql_delimiter>\n
CREATE TABLE `worklist_cache` (\n
`count` INT UNSIGNED NOT NULL,\n
`owner` VARCHAR(32) NOT NULL,\n
`security_uid` INT UNSIGNED NOT NULL,\n
`portal_type` VARCHAR(255) NOT NULL,\n
`validation_state` VARCHAR(255) NULL,\n
`simulation_state` VARCHAR(255) NULL,\n
KEY `portal_simulation_security` (`portal_type`, `simulation_state`, `security_uid`),\n
KEY `portal_simulation_owner` (`portal_type`, `simulation_state`, `owner`),\n
KEY `portal_validation_security` (`portal_type`, `validation_state`, `security_uid`),\n
KEY `portal_validation_owner` (`portal_type`, `validation_state`, `owner`)\n
) TYPE=InnoDB;
]]></string> </value>
</item>
<item>
<key> <string>template</string> </key>
<value>
<object>
<klass>
<global name="__newobj__" module="copy_reg"/>
</klass>
<tuple>
<global name="SQL" module="Shared.DC.ZRDB.DA"/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string encoding="cdata"><![CDATA[
<string>
]]></string> </value>
</item>
<item>
<key> <string>_vars</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>globals</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>raw</string> </key>
<value> <string encoding="cdata"><![CDATA[
DROP TABLE IF EXISTS worklist_cache\n
<dtml-var sql_delimiter>\n
CREATE TABLE `worklist_cache` (\n
`count` INT UNSIGNED NOT NULL,\n
`owner` VARCHAR(32) NOT NULL,\n
`security_uid` INT UNSIGNED NOT NULL,\n
`portal_type` VARCHAR(255) NOT NULL,\n
`validation_state` VARCHAR(255) NULL,\n
`simulation_state` VARCHAR(255) NULL,\n
KEY `portal_simulation_security` (`portal_type`, `simulation_state`, `security_uid`),\n
KEY `portal_simulation_owner` (`portal_type`, `simulation_state`, `owner`),\n
KEY `portal_validation_security` (`portal_type`, `validation_state`, `security_uid`),\n
KEY `portal_validation_owner` (`portal_type`, `validation_state`, `owner`)\n
) TYPE=InnoDB;
]]></string> </value>
</item>
</dictionary>
</state>
</object>
</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>
<tuple>
<global name="SQL" module="Products.ZSQLMethods.SQL"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Use_Database_Methods_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Authenticated</string>
<string>Author</string>
<string>Manager</string>
<string>Member</string>
<string>Owner</string>
<string>Reviewer</string>
</tuple>
</value>
</item>
<item>
<key> <string>__ac_local_roles__</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_arg</string> </key>
<value>
<object>
<klass>
<global name="Args" module="Shared.DC.ZRDB.Aqueduct"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_data</string> </key>
<value>
<dictionary>
<item>
<key> <string>group_by_expression</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>select_expression</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>where_expression</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>_keys</string> </key>
<value>
<list>
<string>select_expression</string>
<string>where_expression</string>
<string>group_by_expression</string>
</list>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>arguments_src</string> </key>
<value> <string>select_expression\r\n
where_expression\r\n
group_by_expression</string> </value>
</item>
<item>
<key> <string>connection_id</string> </key>
<value> <string>erp5_sql_connection</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>zGetCountFromWorklistTable</string> </value>
</item>
<item>
<key> <string>src</string> </key>
<value> <string encoding="cdata"><![CDATA[
SELECT\n
<dtml-var select_expression>\n
FROM\n
worklist_cache\n
WHERE\n
<dtml-var where_expression>\n
GROUP BY\n
<dtml-var group_by_expression>\n
]]></string> </value>
</item>
<item>
<key> <string>template</string> </key>
<value>
<object>
<klass>
<global name="__newobj__" module="copy_reg"/>
</klass>
<tuple>
<global name="SQL" module="Shared.DC.ZRDB.DA"/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string encoding="cdata"><![CDATA[
<string>
]]></string> </value>
</item>
<item>
<key> <string>_vars</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>globals</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>raw</string> </key>
<value> <string encoding="cdata"><![CDATA[
SELECT\n
<dtml-var select_expression>\n
FROM\n
worklist_cache\n
WHERE\n
<dtml-var where_expression>\n
GROUP BY\n
<dtml-var group_by_expression>\n
]]></string> </value>
</item>
</dictionary>
</state>
</object>
</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>
<tuple>
<global name="SQL" module="Products.ZSQLMethods.SQL"/>
<tuple/>
</tuple>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__ac_local_roles__</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>_arg</string> </key>
<value>
<object>
<klass>
<global name="Args" module="Shared.DC.ZRDB.Aqueduct"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_data</string> </key>
<value>
<dictionary>
<item>
<key> <string>count</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>owner</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>security_uid</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>simulation_state</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>_keys</string> </key>
<value>
<list>
<string>count</string>
<string>security_uid</string>
<string>portal_type</string>
<string>simulation_state</string>
<string>validation_state</string>
<string>owner</string>
</list>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>arguments_src</string> </key>
<value> <string>count\r\n
security_uid\r\n
portal_type\r\n
simulation_state\r\n
validation_state\r\n
owner</string> </value>
</item>
<item>
<key> <string>connection_id</string> </key>
<value> <string>erp5_sql_connection</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>zInsertIntoWorklistTable</string> </value>
</item>
<item>
<key> <string>src</string> </key>
<value> <string encoding="cdata"><![CDATA[
INSERT INTO\n
worklist_cache\n
(`count`, `owner`, `security_uid`, `portal_type`, `validation_state`, `simulation_state`)\n
VALUES\n
<dtml-in prefix="loop" expr="_.range(_.len(count))">\n
(\n
<dtml-sqlvar expr="count[loop_item]" type="int">,\n
<dtml-sqlvar expr="owner[loop_item]" type="string">,\n
<dtml-sqlvar expr="security_uid[loop_item]" type="int">,\n
<dtml-sqlvar expr="portal_type[loop_item]" type="string">,\n
<dtml-sqlvar expr="validation_state[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="simulation_state[loop_item]" type="string" optional>\n
)\n
<dtml-if sequence-end><dtml-else>,</dtml-if>\n
</dtml-in>
]]></string> </value>
</item>
<item>
<key> <string>template</string> </key>
<value>
<object>
<klass>
<global name="__newobj__" module="copy_reg"/>
</klass>
<tuple>
<global name="SQL" module="Shared.DC.ZRDB.DA"/>
</tuple>
<state>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string encoding="cdata"><![CDATA[
<string>
]]></string> </value>
</item>
<item>
<key> <string>_vars</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>globals</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>raw</string> </key>
<value> <string encoding="cdata"><![CDATA[
INSERT INTO\n
worklist_cache\n
(`count`, `owner`, `security_uid`, `portal_type`, `validation_state`, `simulation_state`)\n
VALUES\n
<dtml-in prefix="loop" expr="_.range(_.len(count))">\n
(\n
<dtml-sqlvar expr="count[loop_item]" type="int">,\n
<dtml-sqlvar expr="owner[loop_item]" type="string">,\n
<dtml-sqlvar expr="security_uid[loop_item]" type="int">,\n
<dtml-sqlvar expr="portal_type[loop_item]" type="string">,\n
<dtml-sqlvar expr="validation_state[loop_item]" type="string" optional>,\n
<dtml-sqlvar expr="simulation_state[loop_item]" type="string" optional>\n
)\n
<dtml-if sequence-end><dtml-else>,</dtml-if>\n
</dtml-in>
]]></string> </value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Depends on erp5_mysql_innodb_catalog version gein at least 1.1 (inclued) because it relies on the presence of the "owner" column.
\ No newline at end of file
Copyright (c) 2007 Nexedi SARL
\ No newline at end of file
erp5_mysql_innodb_catalog (>= 1.1)
\ No newline at end of file
SQL-based caching system for worklists.
This allows to cache object count into a SQL table, reducing greatly the amount of work needed for every worklist generation.
\ No newline at end of file
GPL
\ No newline at end of file
vincent
\ No newline at end of file
None
\ No newline at end of file
5
\ No newline at end of file
None
\ No newline at end of file
portal_alarms/worklist_refresh
\ No newline at end of file
erp5_worklist_sql
\ No newline at end of file
erp5_worklist_sql
\ No newline at end of file
0.1
\ 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