From 0f695e0526a7d44b298c9f4da02be128c67acf6e Mon Sep 17 00:00:00 2001
From: Viktor Kovtun <viktor.kovtun@id.ethz.ch>
Date: Tue, 24 May 2022 13:28:04 +0200
Subject: [PATCH] SSDM-12561 Added new function to the DB schema. Refactoring
 the way the date/timestamp queries are translated for better performance.

---
 .../v3/search/translator/SQLLexemes.java      |  2 +
 .../DateFieldSearchConditionTranslator.java   | 47 +++++++++----------
 .../NumberFieldSearchConditionTranslator.java |  1 -
 .../StringFieldSearchConditionTranslator.java |  4 +-
 .../sql/postgresql/188/function-188.sql       |  7 +++
 .../migration/migration-187-188.sql           |  7 +++
 .../188/021=database_version_logs.tsv         |  2 +-
 .../sql/postgresql/188/schema-188.sql         |  8 ++++
 8 files changed, 49 insertions(+), 29 deletions(-)

diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/SQLLexemes.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/SQLLexemes.java
index b2467170a0e..6c7ce8b557e 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/SQLLexemes.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/SQLLexemes.java
@@ -67,6 +67,8 @@ public class SQLLexemes
 
     public static final String SAFE_DOUBLE = "safe_double";
 
+    public static final String SAFE_TIMESTAMP = "safe_timestamp";
+
     public static final String AT_TIME_ZONE = "AT TIME ZONE";
 
     public static final String SELECT = "SELECT";
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/DateFieldSearchConditionTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/DateFieldSearchConditionTranslator.java
index d3aefd2edbc..385ab3d2e8e 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/DateFieldSearchConditionTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/DateFieldSearchConditionTranslator.java
@@ -40,8 +40,8 @@ public class DateFieldSearchConditionTranslator implements IConditionTranslator<
 {
 
     @Override
-    public Map<String, JoinInformation> getJoinInformationMap(final DateFieldSearchCriteria criterion, final TableMapper tableMapper,
-            final IAliasFactory aliasFactory)
+    public Map<String, JoinInformation> getJoinInformationMap(final DateFieldSearchCriteria criterion,
+            final TableMapper tableMapper, final IAliasFactory aliasFactory)
     {
         switch (criterion.getFieldType())
         {
@@ -61,8 +61,8 @@ public class DateFieldSearchConditionTranslator implements IConditionTranslator<
     }
 
     @Override
-    public void translate(final DateFieldSearchCriteria criterion, final TableMapper tableMapper, final List<Object> args,
-            final StringBuilder sqlBuilder, final Map<String, JoinInformation> aliases,
+    public void translate(final DateFieldSearchCriteria criterion, final TableMapper tableMapper,
+            final List<Object> args, final StringBuilder sqlBuilder, final Map<String, JoinInformation> aliases,
             final Map<String, String> dataTypeByPropertyCode)
     {
         switch (criterion.getFieldType())
@@ -142,7 +142,6 @@ public class DateFieldSearchConditionTranslator implements IConditionTranslator<
         sqlBuilder.append(entityTypesSubTableAlias).append(PERIOD).append(joinInformation.getSubTableIdField())
                 .append(SP).append(IS_NOT_NULL).append(SP).append(AND).append(SP).append(LP);
 
-        sqlBuilder.append(CASE);
         final String casting = dataTypeByPropertyCode.get(fullPropertyName);
 
         if (fullPropertyName == null)
@@ -153,26 +152,29 @@ public class DateFieldSearchConditionTranslator implements IConditionTranslator<
             {
                 if (value instanceof AbstractDateObjectValue)
                 {
-                    appendWhenForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
+                    sqlBuilder.append(LP);
+                    appendConditionForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
                             null, entityTypesSubTableAlias, true, DataType.DATE.toString());
-                    appendWhenForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
+                    sqlBuilder.append(SP).append(OR).append(SP);
+                    appendConditionForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
                             null, entityTypesSubTableAlias, false, DataType.TIMESTAMP.toString());
+                    sqlBuilder.append(RP);
                 } else
                 {
                     if (bareDateValue)
                     {
-                        appendWhenForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
-                                null, entityTypesSubTableAlias, true,
+                        appendConditionForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases,
+                                timeZone, null, entityTypesSubTableAlias, true,
                                 DataType.DATE.toString(), DataType.TIMESTAMP.toString());
                     } else
                     {
-                        appendWhenForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
-                                null, entityTypesSubTableAlias, false, DataType.TIMESTAMP.toString());
+                        appendConditionForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases,
+                                timeZone, null, entityTypesSubTableAlias, false, DataType.TIMESTAMP.toString());
                     }
                 }
             } else
             {
-                appendWhenForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
+                appendConditionForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
                         null, entityTypesSubTableAlias, false, DataType.TIMESTAMP.toString(), DataType.DATE.toString());
             }
         } else
@@ -187,11 +189,11 @@ public class DateFieldSearchConditionTranslator implements IConditionTranslator<
                             "Search criteria with time zone doesn't make sense for property %s of data type %s.",
                             fullPropertyName, DataType.DATE));
                 }
-                appendWhenForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, null,
+                appendConditionForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, null,
                         fullPropertyName, entityTypesSubTableAlias, true, DataType.DATE.toString());
             } else if (DataType.TIMESTAMP.toString().equals(casting))
             {
-                appendWhenForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
+                appendConditionForDateOrTimestampProperties(sqlBuilder, args, tableMapper, value, aliases, timeZone,
                         fullPropertyName, entityTypesSubTableAlias, bareDateValue,
                         DataType.TIMESTAMP.toString());
             } else
@@ -200,17 +202,15 @@ public class DateFieldSearchConditionTranslator implements IConditionTranslator<
                         fullPropertyName, DataType.DATE, DataType.TIMESTAMP));
             }
         }
-        sqlBuilder.append(SP).append(ELSE).append(SP).append(false).append(SP).append(END).append(RP);
+        sqlBuilder.append(RP);
     }
 
-    static void appendWhenForDateOrTimestampProperties(final StringBuilder sqlBuilder, final List<Object> args,
+    static void appendConditionForDateOrTimestampProperties(final StringBuilder sqlBuilder, final List<Object> args,
             final TableMapper tableMapper, final IDate value, final Map<String, JoinInformation> aliases,
             final ITimeZone timeZone, final String fullPropertyName,
             final String entityTypesSubTableAlias, final boolean castToDate,
             final String... dataTypeStrings)
     {
-        sqlBuilder.append(SP).append(WHEN).append(SP);
-
         if (fullPropertyName != null)
         {
             TranslatorUtils.appendInternalExternalConstraint(sqlBuilder, args, entityTypesSubTableAlias,
@@ -224,10 +224,9 @@ public class DateFieldSearchConditionTranslator implements IConditionTranslator<
 
         sqlBuilder.append(SP).append(aliases.get(TableNames.DATA_TYPES_TABLE).getSubTableAlias())
                 .append(PERIOD).append(ColumnNames.CODE_COLUMN).append(SP).append(IN).append(SP)
-                .append(SELECT_UNNEST);
-        args.add(dataTypeStrings);
+                .append(LP).append(SQ).append(String.join(SQ + COMMA + SP + SQ, dataTypeStrings)).append(SQ).append(RP);
 
-        sqlBuilder.append(SP).append(THEN).append(SP);
+        sqlBuilder.append(SP).append(AND).append(SP);
 
         if (castToDate)
         {
@@ -236,9 +235,9 @@ public class DateFieldSearchConditionTranslator implements IConditionTranslator<
 
         if (value != null)
         {
-            sqlBuilder.append(aliases.get(tableMapper.getValuesTable()).getSubTableAlias())
-                    .append(PERIOD).append(ColumnNames.VALUE_COLUMN).append(DOUBLE_COLON)
-                    .append(TIMESTAMP_WITH_TZ).append(SP);
+            sqlBuilder.append(SAFE_TIMESTAMP).append(LP)
+                    .append(aliases.get(tableMapper.getValuesTable()).getSubTableAlias())
+                    .append(PERIOD).append(ColumnNames.VALUE_COLUMN).append(RP).append(SP);
             TranslatorUtils.appendTimeZoneConversion(value, sqlBuilder, timeZone);
 
             if (castToDate)
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/NumberFieldSearchConditionTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/NumberFieldSearchConditionTranslator.java
index eab6f89eb76..03e742f13ee 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/NumberFieldSearchConditionTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/NumberFieldSearchConditionTranslator.java
@@ -38,7 +38,6 @@ import java.util.Set;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractNumberValue;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.NumberFieldSearchCriteria;
-import ch.ethz.sis.openbis.generic.server.asapi.v3.search.PSQLTypes;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.search.mapper.AttributesMapper;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.search.mapper.TableMapper;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.search.translator.SearchCriteriaTranslator;
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/StringFieldSearchConditionTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/StringFieldSearchConditionTranslator.java
index e50cabfbdd1..d390470e1be 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/StringFieldSearchConditionTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/translator/condition/StringFieldSearchConditionTranslator.java
@@ -179,11 +179,9 @@ public class StringFieldSearchConditionTranslator implements IConditionTranslato
                             ? DataType.TIMESTAMP : DataType.DATE;
                     final boolean bareDateValue = TranslatorUtils.isDateWithoutTime(value.getValue());
 
-                    sqlBuilder.append(CASE);
-                    DateFieldSearchConditionTranslator.appendWhenForDateOrTimestampProperties(sqlBuilder, args,
+                    DateFieldSearchConditionTranslator.appendConditionForDateOrTimestampProperties(sqlBuilder, args,
                             tableMapper, convertStringValueToDateValue(value), aliases, null, fullPropertyName,
                             entityTypesSubTableAlias, bareDateValue, dataType.toString());
-                    sqlBuilder.append(SP).append(END);
                     sqlBuilder.append(RP);
                     return;
                 }
diff --git a/openbis/source/sql/postgresql/188/function-188.sql b/openbis/source/sql/postgresql/188/function-188.sql
index 2529107aa79..6205ab0e5c8 100644
--- a/openbis/source/sql/postgresql/188/function-188.sql
+++ b/openbis/source/sql/postgresql/188/function-188.sql
@@ -3630,6 +3630,13 @@ CREATE TRIGGER material_properties_tsvector_document BEFORE INSERT OR UPDATE
 CREATE FUNCTION safe_double(s text) RETURNS double precision AS $$
 BEGIN
     RETURN s::double precision;
+EXCEPTION WHEN OTHERS THEN
+    RETURN NULL;
+END; $$ LANGUAGE plpgsql STRICT;
+
+CREATE FUNCTION safe_timestamp(s text) RETURNS timestamp with time zone AS $$
+BEGIN
+RETURN s::timestamp with time zone;
 EXCEPTION WHEN OTHERS THEN
     RETURN NULL;
 END; $$ LANGUAGE plpgsql STRICT;
\ No newline at end of file
diff --git a/openbis/source/sql/postgresql/migration/migration-187-188.sql b/openbis/source/sql/postgresql/migration/migration-187-188.sql
index cd224f51417..0c2a26c71ff 100644
--- a/openbis/source/sql/postgresql/migration/migration-187-188.sql
+++ b/openbis/source/sql/postgresql/migration/migration-187-188.sql
@@ -1,6 +1,13 @@
 CREATE FUNCTION safe_double(s text) RETURNS double precision AS $$
 BEGIN
 RETURN s::double precision;
+EXCEPTION WHEN OTHERS THEN
+    RETURN NULL;
+END; $$ LANGUAGE plpgsql STRICT;
+
+CREATE FUNCTION safe_timestamp(s text) RETURNS timestamp with time zone AS $$
+BEGIN
+RETURN s::timestamp with time zone;
 EXCEPTION WHEN OTHERS THEN
     RETURN NULL;
 END; $$ LANGUAGE plpgsql STRICT;
\ No newline at end of file
diff --git a/openbis/sourceTest/sql/postgresql/188/021=database_version_logs.tsv b/openbis/sourceTest/sql/postgresql/188/021=database_version_logs.tsv
index b92551b7f59..c065fc8c2ae 100644
--- a/openbis/sourceTest/sql/postgresql/188/021=database_version_logs.tsv
+++ b/openbis/sourceTest/sql/postgresql/188/021=database_version_logs.tsv
@@ -161,4 +161,4 @@
 185	source/sql/postgresql/migration/migration-184-185.sql	SUCCESS	2020-10-01 11:01:12.03	\\x696e7365727420696e746f20726f6c655f61737369676e6d656e74730a2869640a2c726f6c655f636f64650a2c706572735f69645f6772616e7465650a2c706572735f69645f72656769737465726572290a76616c7565730a286e65787476616c2827524f4c455f41535349474e4d454e545f49445f53455127290a2c2741444d494e270a2c2873656c6563742069642066726f6d20706572736f6e7320776865726520757365725f6964203d202773797374656d27290a2c2873656c6563742069642066726f6d20706572736f6e7320776865726520757365725f6964203d202773797374656d2729293b0a	\N
 186	source/sql/postgresql/migration/migration-185-186.sql	SUCCESS	2021-02-12 13:46:27.663	\\x2d2d204d6967726174696f6e2066726f6d2031383520746f203138360a0a435245415445205441424c45204556454e54535f53454152434820280a20202020494420544543485f4944204e4f54204e554c4c2c0a202020204556454e545f54595045204556454e545f54595045204e4f54204e554c4c2c0a20202020454e544954595f5459504520544558545f56414c5545204e4f54204e554c4c2c0a20202020454e544954595f535041434520544558545f56414c55452c0a20202020454e544954595f50524f4a45435420544558545f56414c55452c0a20202020454e544954595f5245474953544552455220544558545f56414c55452c0a20202020454e544954595f524547495354524154494f4e5f54494d455354414d502054494d455f5354414d502c0a202020204944454e54494649455220544558545f56414c5545204e4f54204e554c4c2c0a202020204445534352495054494f4e20544558545f56414c55452c0a20202020524541534f4e20544558545f56414c55452c0a20202020434f4e54454e5420544558545f56414c55452c0a20202020455841435f494420544543485f49442c0a20202020504552535f49445f5245474953544552455220544543485f4944204e4f54204e554c4c2c0a20202020524547495354524154494f4e5f54494d455354414d502054494d455f5354414d50204e4f54204e554c4c0a293b0a0a2d2d20706b0a414c544552205441424c45204556454e54535f5345415243482041444420434f4e53545241494e54204556454e54535f5345415243485f504b205052494d415259204b4559284944293b0a0a2d2d20666b0a414c544552205441424c45204556454e54535f5345415243482041444420434f4e53545241494e54204556454e54535f5345415243485f504552535f49445f524547495354455245525f464b20464f524549474e204b45592028504552535f49445f5245474953544552455229205245464552454e43455320504552534f4e53284944292044454645525241424c4520494e495449414c4c592044454645525245443b0a414c544552205441424c45204556454e54535f5345415243482041444420434f4e53545241494e54204556454e54535f5345415243485f455841435f49445f464b20464f524549474e204b45592028455841435f494429205245464552454e434553204154544143484d454e545f434f4e54454e5453284944293b0a0a2d2d20636f6e73747261696e740a414c544552205441424c45204556454e54535f5345415243482041444420434f4e53545241494e54204556454e54535f5345415243485f454e544954595f545950455f434b20434845434b0a0928454e544954595f5459504520494e2028274154544143484d454e54272c202744415441534554272c20274558504552494d454e54272c20275350414345272c20274d4154455249414c272c202750524f4a454354272c202750524f50455254595f54595045272c202753414d504c45272c2027564f434142554c415259272c2027415554484f52495a4154494f4e5f47524f5550272c20274d45544150524f4a4543542729293b0a0a2d2d20696e6465780a43524541544520494e444558204556454e54535f5345415243485f454e544954595f53504143455f49204f4e204556454e54535f5345415243482028454e544954595f5350414345293b0a43524541544520494e444558204556454e54535f5345415243485f454e544954595f50524f4a4543545f49204f4e204556454e54535f5345415243482028454e544954595f50524f4a454354293b0a43524541544520494e444558204556454e54535f5345415243485f454e544954595f524547495354455245525f49204f4e204556454e54535f5345415243482028454e544954595f52454749535445524552293b0a43524541544520494e444558204556454e54535f5345415243485f454e544954595f524547495354524154494f4e5f54494d455354414d505f49204f4e204556454e54535f5345415243482028454e544954595f524547495354524154494f4e5f54494d455354414d50293b0a43524541544520494e444558204556454e54535f5345415243485f504552535f49445f524547495354455245525f49204f4e204556454e54535f5345415243482028504552535f49445f52454749535445524552293b0a43524541544520494e444558204556454e54535f5345415243485f524547495354524154494f4e5f54494d455354414d505f49204f4e204556454e54535f5345415243482028524547495354524154494f4e5f54494d455354414d50293b0a43524541544520494e444558204556454e54535f5345415243485f455841435f49445f49204f4e204556454e54535f5345415243482028455841435f4944293b0a0a2d2d2073657175656e63650a4352454154452053455155454e4345204556454e54535f5345415243485f49445f5345513b0a0a2d2d206772616e74730a4752414e542053454c454354204f4e2053455155454e4345204556454e54535f5345415243485f49445f53455120544f2047524f5550204f50454e4249535f524541444f4e4c593b0a4752414e542053454c454354204f4e205441424c45204556454e54535f53454152434820544f2047524f5550204f50454e4249535f524541444f4e4c593b0a	\N
 187	source/sql/postgresql/migration/migration-186-187.sql	SUCCESS	2021-10-05 14:36:00.092	\\x2d2d2041646420636f6c756d6e20454e544954595f4b494e4420746f2072656c6174696f6e736869707320686973746f7279207461626c657320616e6420706f70756c6174652069742077697468206578697374696e6720646174612028696620706f737369626c65292e0a2d2d2041646420636f6c756d6e20454e544954595f4b494e4420746f20686973746f72792076696577730a0a414c544552205441424c4520444154415f5345545f52454c4154494f4e53484950535f484953544f52592041444420434f4c554d4e204946204e4f542045584953545320454e544954595f4b494e4420746578745f76616c75653b0a0a55504441544520444154415f5345545f52454c4154494f4e53484950535f484953544f52590a2020202053455420454e544954595f4b494e44203d2043415345205748454e20455850455f4944204953204e4f54204e554c4c205448454e20274558504552494d454e54270a2020202020202020202020202020202020202020202020202020205748454e2053414d505f4944204953204e4f54204e554c4c205448454e202753414d504c45270a2020202020202020202020202020202020202020202020202020205748454e20444154415f4944204953204e4f54204e554c4c205448454e202744415441205345542720454e443b0a0a44524f50205649455720646174615f7365745f686973746f72795f766965773b0a435245415445205649455720646174615f7365745f686973746f72795f7669657720415320280a202053454c4543540a20202020332a69642061732069642c0a202020206d61696e5f646174615f69642c0a2020202072656c6174696f6e5f747970652c0a202020206f7264696e616c2c0a20202020657870655f69642c0a2020202073616d705f69642c0a20202020646174615f69642c0a20202020656e746974795f6b696e642c0a20202020656e746974795f7065726d5f69642c0a202020206e756c6c2061732064737470745f69642c0a202020206e756c6c2061732076616c75652c0a202020206e756c6c20617320766f636162756c6172795f7465726d2c0a202020206e756c6c206173206d6174657269616c2c0a202020206e756c6c2061732073616d706c652c0a202020206e756c6c2061732065787465726e616c5f636f64652c0a202020206e756c6c20617320706174682c0a202020206e756c6c206173206769745f636f6d6d69745f686173682c0a202020206e756c6c206173206769745f7265706f7369746f72795f69642c0a202020206e756c6c3a3a544543485f49442061732065646d735f69642c0a202020206e756c6c2061732065646d735f636f64652c0a202020206e756c6c2061732065646d735f6c6162656c2c0a202020206e756c6c2061732065646d735f616464726573732c0a20202020706572735f69645f617574686f722c0a2020202076616c69645f66726f6d5f74696d657374616d702c0a2020202076616c69645f756e74696c5f74696d657374616d700a202046524f4d0a20202020646174615f7365745f72656c6174696f6e73686970735f686973746f72790a202057484552450a2020202076616c69645f756e74696c5f74696d657374616d70204953204e4f54204e554c4c290a554e494f4e0a202053454c4543540a20202020332a69642b312061732069642c0a2020202064735f6964206173206d61696e5f646174615f69642c0a202020206e756c6c2061732072656c6174696f6e5f747970652c0a202020206e756c6c206173206f7264696e616c2c0a202020206e756c6c20617320657870655f69642c0a202020206e756c6c2061732073616d705f69642c0a202020206e756c6c20617320646174615f69642c0a202020206e756c6c20617320656e746974795f6b696e642c0a202020206e756c6c20617320656e746974795f7065726d5f69642c0a2020202064737470745f69642c0a2020202076616c75652c0a20202020766f636162756c6172795f7465726d2c0a202020206d6174657269616c2c0a2020202073616d706c652c0a202020206e756c6c2061732065787465726e616c5f636f64652c0a202020206e756c6c20617320706174682c0a202020206e756c6c206173206769745f636f6d6d69745f686173682c0a202020206e756c6c206173206769745f7265706f7369746f72795f69642c0a202020206e756c6c2061732065646d735f69642c0a202020206e756c6c2061732065646d735f636f64652c0a202020206e756c6c2061732065646d735f6c6162656c2c0a202020206e756c6c2061732065646d735f616464726573732c0a20202020706572735f69645f617574686f722c0a2020202076616c69645f66726f6d5f74696d657374616d702c0a2020202076616c69645f756e74696c5f74696d657374616d700a202046524f4d0a20202020646174615f7365745f70726f706572746965735f686973746f72790a20554e494f4e0a20202853454c4543540a202020332a69642b322061732069642c0a20202020646174615f6964206173206d61696e5f646174615f69642c0a202020206e756c6c2061732072656c6174696f6e5f747970652c0a202020206e756c6c206173206f7264696e616c2c0a202020206e756c6c20617320657870655f69642c0a202020206e756c6c2061732073616d705f69642c0a202020206e756c6c20617320646174615f69642c0a202020206e756c6c20617320656e746974795f6b696e642c0a202020206e756c6c20617320656e746974795f7065726d5f69642c0a202020206e756c6c2061732064737470745f69642c0a202020206e756c6c2061732076616c75652c0a202020206e756c6c20617320766f636162756c6172795f7465726d2c0a202020206e756c6c206173206d6174657269616c2c0a202020206e756c6c2061732073616d706c652c0a2020202065787465726e616c5f636f64652c0a20202020706174682c0a202020206769745f636f6d6d69745f686173682c0a202020206769745f7265706f7369746f72795f69642c0a2020202065646d735f69642c0a2020202065646d735f636f64652c0a2020202065646d735f6c6162656c2c0a2020202065646d735f616464726573732c0a20202020706572735f69645f617574686f722c0a2020202076616c69645f66726f6d5f74696d657374616d702c0a2020202076616c69645f756e74696c5f74696d657374616d700a202046524f4d0a20202020646174615f7365745f636f706965735f686973746f72790a202057484552450a2020202076616c69645f756e74696c5f74696d657374616d70204953204e4f54204e554c4c293b0a0a0a414c544552205441424c45204558504552494d454e545f52454c4154494f4e53484950535f484953544f52592041444420434f4c554d4e204946204e4f542045584953545320454e544954595f4b494e4420746578745f76616c75653b0a0a555044415445204558504552494d454e545f52454c4154494f4e53484950535f484953544f52590a2020202053455420454e544954595f4b494e44203d2043415345205748454e2050524f4a5f4944204953204e4f54204e554c4c205448454e202750524f4a454354270a2020202020202020202020202020202020202020202020202020205748454e2053414d505f4944204953204e4f54204e554c4c205448454e202753414d504c45270a2020202020202020202020202020202020202020202020202020205748454e20444154415f4944204953204e4f54204e554c4c205448454e202744415441205345542720454e443b0a0a44524f502056494557206578706572696d656e745f686973746f72795f766965773b0a4352454154452056494557206578706572696d656e745f686973746f72795f7669657720415320280a202053454c4543540a20202020322a69642061732069642c0a202020206d61696e5f657870655f69642c0a2020202072656c6174696f6e5f747970652c0a2020202070726f6a5f69642c0a2020202073616d705f69642c0a20202020646174615f69642c0a20202020656e746974795f6b696e642c0a20202020656e746974795f7065726d5f69642c0a202020206e756c6c20617320657470745f69642c0a202020206e756c6c2061732076616c75652c0a202020206e756c6c20617320766f636162756c6172795f7465726d2c0a202020206e756c6c206173206d6174657269616c2c0a202020206e756c6c2061732073616d706c652c0a20202020706572735f69645f617574686f722c0a2020202076616c69645f66726f6d5f74696d657374616d702c0a2020202076616c69645f756e74696c5f74696d657374616d700a202046524f4d0a202020204558504552494d454e545f52454c4154494f4e53484950535f484953544f52590a202057484552452076616c69645f756e74696c5f74696d657374616d70204953204e4f54204e554c4c290a554e494f4e0a202053454c4543540a20202020322a69642b312061732069642c0a20202020657870655f6964206173206d61696e5f657870655f69642c0a202020206e756c6c2061732072656c6174696f6e5f747970652c0a202020206e756c6c2061732070726f6a5f69642c0a202020206e756c6c2061732073616d705f69642c0a202020206e756c6c20617320646174615f69642c0a202020206e756c6c20617320656e746974795f6b696e642c0a202020206e756c6c20617320656e746974795f7065726d5f69642c0a20202020657470745f69642c0a2020202076616c75652c0a20202020766f636162756c6172795f7465726d2c0a202020206d6174657269616c2c0a2020202073616d706c652c0a20202020706572735f69645f617574686f722c0a2020202076616c69645f66726f6d5f74696d657374616d702c0a2020202076616c69645f756e74696c5f74696d657374616d700a202046524f4d0a202020204558504552494d454e545f50524f504552544945535f484953544f52593b0a0a0a414c544552205441424c452050524f4a4543545f52454c4154494f4e53484950535f484953544f52592041444420434f4c554d4e204946204e4f542045584953545320454e544954595f4b494e4420746578745f76616c75653b0a414c544552205441424c452050524f4a4543545f52454c4154494f4e53484950535f484953544f52592041444420434f4c554d4e204946204e4f54204558495354532053414d505f494420746563685f69643b0a414c544552205441424c452050524f4a4543545f52454c4154494f4e53484950535f484953544f52592041444420434f4e53545241494e5420505252454c485f53414d505f464b20464f524549474e204b4559202853414d505f494429205245464552454e4345532053414d504c45535f414c4c28494429204f4e2044454c45544520534554204e554c4c3b0a43524541544520494e44455820505252454c485f4d41494e5f50524f4a5f464b5f53414d505f464b5f49204f4e2050524f4a4543545f52454c4154494f4e53484950535f484953544f525920284d41494e5f50524f4a5f49442c2053414d505f4944293b0a0a5550444154452050524f4a4543545f52454c4154494f4e53484950535f484953544f52590a2020202053455420454e544954595f4b494e44203d2043415345205748454e20455850455f4944204953204e4f54204e554c4c205448454e20274558504552494d454e54270a2020202020202020202020202020202020202020202020202020205748454e2053414d505f4944204953204e4f54204e554c4c205448454e202753414d504c45270a2020202020202020202020202020202020202020202020202020205748454e2053504143455f4944204953204e4f54204e554c4c205448454e202753504143452720454e443b0a0a0a414c544552205441424c452053414d504c455f52454c4154494f4e53484950535f484953544f52592041444420434f4c554d4e204946204e4f542045584953545320454e544954595f4b494e4420746578745f76616c75653b0a0a5550444154452053414d504c455f52454c4154494f4e53484950535f484953544f52590a2020202053455420454e544954595f4b494e44203d2043415345205748454e2050524f4a5f4944204953204e4f54204e554c4c205448454e202750524f4a454354270a2020202020202020202020202020202020202020202020202020205748454e20455850455f4944204953204e4f54204e554c4c205448454e20274558504552494d454e54270a2020202020202020202020202020202020202020202020202020205748454e2053414d505f4944204953204e4f54204e554c4c205448454e202753414d504c45270a2020202020202020202020202020202020202020202020202020205748454e20444154415f4944204953204e4f54204e554c4c205448454e20274441544120534554270a2020202020202020202020202020202020202020202020202020205748454e2053504143455f4944204953204e4f54204e554c4c205448454e202753504143452720454e443b0a0a44524f5020564945572073616d706c655f686973746f72795f766965773b0a43524541544520564945572073616d706c655f686973746f72795f7669657720415320280a202053454c4543540a20202020322a69642061732069642c0a202020206d61696e5f73616d705f69642c0a2020202072656c6174696f6e5f747970652c0a2020202073706163655f69642c0a20202020657870655f69642c0a2020202073616d705f69642c0a2020202070726f6a5f69642c0a20202020646174615f69642c0a20202020656e746974795f6b696e642c0a20202020656e746974795f7065726d5f69642c0a20202020616e6e6f746174696f6e732c0a202020206e756c6c20617320737470745f69642c0a202020206e756c6c2061732076616c75652c0a202020206e756c6c20617320766f636162756c6172795f7465726d2c0a202020206e756c6c206173206d6174657269616c2c0a202020206e756c6c2061732073616d706c652c0a20202020706572735f69645f617574686f722c0a2020202076616c69645f66726f6d5f74696d657374616d702c0a2020202076616c69645f756e74696c5f74696d657374616d700a202046524f4d0a2020202053414d504c455f52454c4154494f4e53484950535f484953544f52590a202057484552450a2020202076616c69645f756e74696c5f74696d657374616d70204953204e4f54204e554c4c290a554e494f4e0a202053454c4543540a20202020322a69642b312061732069642c0a2020202073616d705f6964206173206d61696e5f73616d705f69642c0a202020206e756c6c2061732072656c6174696f6e5f747970652c0a202020206e756c6c2061732073706163655f69642c0a202020206e756c6c20617320657870655f69642c0a202020206e756c6c2061732073616d705f69642c0a202020206e756c6c2061732070726f6a5f69642c0a202020206e756c6c20617320646174615f69642c0a202020206e756c6c20617320656e746974795f6b696e642c0a202020206e756c6c20617320656e746974795f7065726d5f69642c0a202020206e756c6c20617320616e6e6f746174696f6e732c0a20202020737470745f69642c0a2020202076616c75652c0a20202020766f636162756c6172795f7465726d2c0a202020206d6174657269616c2c0a2020202073616d706c652c0a20202020706572735f69645f617574686f722c0a2020202076616c69645f66726f6d5f74696d657374616d702c0a2020202076616c69645f756e74696c5f74696d657374616d700a202046524f4d0a2020202053414d504c455f50524f504552544945535f484953544f52593b0a0a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a2d2d2052756c657320666f722072656c6174696f6e736869707320686973746f72790a2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a2d2d2073616d706c65202d3e206578706572696d656e740a0a435245415445204f52205245504c4143452052554c452073616d706c655f6578706572696d656e745f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a20202020574845524520284f4c442e455850455f494420213d204e45572e455850455f4944204f52204f4c442e455850455f4944204953204e554c4c2920414e44204e45572e455850455f4944204953204e4f54204e554c4c0a20202020444f20414c534f20280a20202020202020555044415445204558504552494d454e545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f455850455f4944203d204f4c442e455850455f494420414e442053414d505f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f204558504552494d454e545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f455850455f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c28274558504552494d454e545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e455850455f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a2020202020202020202753414d504c45272c0a2020202020202020204e45572e5045524d5f49442c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e494420414e4420455850455f4944203d204f4c442e455850455f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020455850455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e455850455f49442c0a202020202020202020274558504552494d454e54272c0a2020202020202020202853454c454354205045524d5f49442046524f4d204558504552494d454e54535f414c4c205748455245204944203d204e45572e455850455f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f6578706572696d656e745f72656d6f76655f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a202020205748455245204f4c442e455850455f4944204953204e4f54204e554c4c20414e44204e45572e455850455f4944204953204e554c4c0a20202020444f20414c534f20280a20202020202020555044415445204558504552494d454e545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f455850455f4944203d204f4c442e455850455f494420414e442053414d505f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e494420414e4420455850455f4944203d204f4c442e455850455f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f6578706572696d656e745f696e736572742041530a202020204f4e20494e5345525420544f2073616d706c65735f616c6c0a202020205748455245204e45572e455850455f4944204953204e4f54204e554c4c0a20202020202020444f20414c534f20280a20202020202020494e5345525420494e544f204558504552494d454e545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f455850455f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c28274558504552494d454e545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e455850455f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a2020202020202020202753414d504c45272c0a2020202020202020204e45572e5045524d5f49442c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020455850455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e455850455f49442c0a202020202020202020274558504552494d454e54272c0a2020202020202020202853454c454354205045524d5f49442046524f4d204558504552494d454e54535f414c4c205748455245204944203d204e45572e455850455f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f6578706572696d656e745f64656c6574652041530a202020204f4e2044454c45544520544f2073616d706c65735f616c6c0a202020205748455245204f4c442e455850455f4944204953204e4f54204e554c4c0a20202020202020444f20414c534f0a20202020202020555044415445204558504552494d454e545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020205748455245204d41494e5f455850455f4944203d204f4c442e455850455f494420414e442053414d505f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a0a2d2d20636f6e7461696e65722073616d706c65730a0a435245415445204f52205245504c4143452052554c452073616d706c655f636f6e7461696e65725f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a20202020574845524520284f4c442e53414d505f49445f504152545f4f4620213d204e45572e53414d505f49445f504152545f4f46204f52204f4c442e53414d505f49445f504152545f4f46204953204e554c4c2920414e44204e45572e53414d505f49445f504152545f4f46204953204e4f54204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020574845524520284d41494e5f53414d505f4944203d204f4c442e53414d505f49445f504152545f4f4620414e442053414d505f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c20414e442052454c4154494f4e5f54595045203d2027434f4e5441494e455227290a20202020202020202020204f5220284d41494e5f53414d505f4944203d204f4c442e494420414e442053414d505f4944203d204f4c442e53414d505f49445f504152545f4f4620414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c20414e442052454c4154494f4e5f54595045203d2027434f4e5441494e454427293b0a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e53414d505f49445f504152545f4f462c0a20202020202020202027434f4e5441494e4552272c0a2020202020202020204e45572e49442c0a2020202020202020202753414d504c45272c0a2020202020202020204e45572e5045524d5f49442c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a20202020202020202027434f4e5441494e4544272c0a2020202020202020204e45572e53414d505f49445f504152545f4f462c0a2020202020202020202753414d504c45272c0a2020202020202020202853454c454354205045524d5f49442046524f4d2053414d504c45535f414c4c205748455245204944203d204e45572e53414d505f49445f504152545f4f46292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f636f6e7461696e65725f72656d6f76655f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a202020205748455245204f4c442e53414d505f49445f504152545f4f46204953204e4f54204e554c4c20414e44204e45572e53414d505f49445f504152545f4f46204953204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020574845524520284d41494e5f53414d505f4944203d204f4c442e53414d505f49445f504152545f4f4620414e442053414d505f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c20414e442052454c4154494f4e5f54595045203d2027434f4e5441494e455227290a20202020202020202020204f5220284d41494e5f53414d505f4944203d204f4c442e494420414e442053414d505f4944203d204f4c442e53414d505f49445f504152545f4f4620414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c20414e442052454c4154494f4e5f54595045203d2027434f4e5441494e454427293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f636f6e7461696e65725f696e736572742041530a202020204f4e20494e5345525420544f2073616d706c65735f616c6c0a202020205748455245204e45572e53414d505f49445f504152545f4f46204953204e4f54204e554c4c0a20202020202020444f20414c534f20280a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e53414d505f49445f504152545f4f462c0a20202020202020202027434f4e5441494e4552272c0a2020202020202020204e45572e49442c0a2020202020202020202753414d504c45272c0a2020202020202020204e45572e5045524d5f49442c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a20202020202020202027434f4e5441494e4544272c0a2020202020202020204e45572e53414d505f49445f504152545f4f462c0a2020202020202020202753414d504c45272c0a2020202020202020202853454c454354205045524d5f49442046524f4d2053414d504c45535f414c4c205748455245204944203d204e45572e53414d505f49445f504152545f4f46292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f636f6e7461696e65725f64656c6574652041530a202020204f4e2044454c45544520544f2073616d706c65735f616c6c0a202020205748455245204f4c442e53414d505f49445f504152545f4f46204953204e4f54204e554c4c0a20202020202020444f20414c534f0a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e53414d505f49445f504152545f4f4620414e442053414d505f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c20414e442052454c4154494f4e5f54595045203d2027434f4e5441494e4552273b0a0a2d2d2064617461736574202d3e2065706572696d656e740a0a435245415445204f52205245504c4143452052554c4520646174617365745f6578706572696d656e745f7570646174652041530a202020204f4e2055504441544520544f20646174615f616c6c0a20202020574845524520284f4c442e455850455f494420213d204e45572e455850455f4944204f52204f4c442e53414d505f4944204953204e4f54204e554c4c2920414e44204e45572e53414d505f4944204953204e554c4c0a20202020444f20414c534f20280a20202020202020555044415445204558504552494d454e545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f455850455f4944203d204f4c442e455850455f494420414e4420444154415f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f204558504552494d454e545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f455850455f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020444154415f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c28274558504552494d454e545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e455850455f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a202020202020202020274441544120534554272c0a2020202020202020204e45572e434f44452c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a2020202020202055504441544520444154415f5345545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020574845524520284d41494e5f444154415f4944203d204f4c442e494420414e4420455850455f4944203d204f4c442e455850455f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c293b0a20202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f444154415f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020455850455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e455850455f49442c0a202020202020202020274558504552494d454e54272c0a2020202020202020202853454c454354205045524d5f49442046524f4d204558504552494d454e54535f414c4c205748455245204944203d204e45572e455850455f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c4520646174617365745f6578706572696d656e745f72656d6f76655f7570646174652041530a202020204f4e2055504441544520544f20646174615f616c6c0a202020205748455245204f4c442e53414d505f4944204953204e554c4c20414e44204e45572e53414d505f4944204953204e4f54204e554c4c0a20202020444f20414c534f20280a20202020202020555044415445204558504552494d454e545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f455850455f4944203d204f4c442e455850455f494420414e4420444154415f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a2020202020202055504441544520444154415f5345545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f444154415f4944203d204f4c442e494420414e4420455850455f4944203d204f4c442e455850455f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020293b0a0a435245415445204f52205245504c4143452052554c4520646174617365745f6578706572696d656e745f696e736572742041530a202020204f4e20494e5345525420544f20646174615f616c6c0a202020205748455245204e45572e455850455f4944204953204e4f54204e554c4c20414e44204e45572e53414d505f4944204953204e554c4c0a20202020202020444f20414c534f20280a20202020202020494e5345525420494e544f204558504552494d454e545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f455850455f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020444154415f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c28274558504552494d454e545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e455850455f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a202020202020202020274441544120534554272c0a2020202020202020204e45572e434f44452c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f444154415f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020455850455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e455850455f49442c0a202020202020202020274558504552494d454e54272c0a2020202020202020202853454c454354205045524d5f49442046524f4d204558504552494d454e54535f414c4c205748455245204944203d204e45572e455850455f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020293b0a0a435245415445204f52205245504c4143452052554c4520646174617365745f6578706572696d656e745f64656c6574652041530a202020204f4e2044454c45544520544f20646174615f616c6c0a202020205748455245204f4c442e455850455f4944204953204e4f54204e554c4c20414e44204f4c442e53414d505f4944204953204e554c4c0a20202020202020444f20414c534f0a20202020202020555044415445204558504552494d454e545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020205748455245204d41494e5f455850455f4944203d204f4c442e455850455f494420414e4420444154415f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a0a2d2d2064617461736574202d3e2073616d706c650a0a435245415445204f52205245504c4143452052554c4520646174617365745f73616d706c655f7570646174652041530a202020204f4e2055504441544520544f20646174615f616c6c0a20202020574845524520284f4c442e53414d505f494420213d204e45572e53414d505f4944204f52204f4c442e53414d505f4944204953204e554c4c2920414e44204e45572e53414d505f4944204953204e4f54204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e53414d505f494420414e4420444154415f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020444154415f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e53414d505f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a202020202020202020274441544120534554272c0a2020202020202020204e45572e434f44452c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a2020202020202055504441544520444154415f5345545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020574845524520284d41494e5f444154415f4944203d204f4c442e494420414e442053414d505f4944203d204f4c442e53414d505f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c293b0a20202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f444154415f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e53414d505f49442c0a2020202020202020202753414d504c45272c0a2020202020202020202853454c454354205045524d5f49442046524f4d2053414d504c45535f414c4c205748455245204944203d204e45572e53414d505f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c4520646174617365745f73616d706c655f72656d6f76655f7570646174652041530a202020204f4e2055504441544520544f20646174615f616c6c0a202020205748455245204f4c442e53414d505f4944204953204e4f54204e554c4c20414e44204e45572e53414d505f4944204953204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e53414d505f494420414e4420444154415f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a2020202020202055504441544520444154415f5345545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f444154415f4944203d204f4c442e494420414e442053414d505f4944203d204f4c442e53414d505f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020293b0a0a435245415445204f52205245504c4143452052554c4520646174617365745f73616d706c655f696e736572742041530a202020204f4e20494e5345525420544f20646174615f616c6c0a202020205748455245204e45572e53414d505f4944204953204e4f54204e554c4c0a20202020202020444f20414c534f20280a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020444154415f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e53414d505f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a202020202020202020274441544120534554272c0a2020202020202020204e45572e434f44452c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f444154415f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e53414d505f49442c0a2020202020202020202753414d504c45272c0a2020202020202020202853454c454354205045524d5f49442046524f4d2053414d504c45535f414c4c205748455245204944203d204e45572e53414d505f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020293b0a0a435245415445204f52205245504c4143452052554c4520646174617365745f73616d706c655f64656c6574652041530a202020204f4e2044454c45544520544f20646174615f616c6c0a202020205748455245204f4c442e53414d505f4944204953204e4f54204e554c4c0a20202020202020444f20414c534f0a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e53414d505f494420414e4420444154415f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a0a2d2d2064617461207365742072656c6174696f6e736869700a0a435245415445204f52205245504c4143452052554c4520646174615f72656c6174696f6e736869705f696e736572742041530a202020204f4e20494e5345525420544f20646174615f7365745f72656c6174696f6e73686970735f616c6c0a202020205748455245204e45572e44454c5f4944204953204e554c4c0a20202020202020444f20414c534f20280a202020202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f444154415f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a2020202020202020202020444154415f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d502c0a20202020202020202020204f5244494e414c0a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e444154415f49445f504152454e542c0a20202020202020202020202853454c45435420555050455228504152454e545f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204e45572e52454c4154494f4e534849505f4944292c0a20202020202020202020204e45572e444154415f49445f4348494c442c0a2020202020202020202020274441544120534554272c0a20202020202020202020202853454c45435420434f44452046524f4d20646174615f616c6c205748455245204944203d204e45572e444154415f49445f4348494c44292c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d502c0a20202020202020202020204e45572e4f5244494e414c0a202020202020202020293b0a202020202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f444154415f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a2020202020202020202020444154415f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d502c0a20202020202020202020204f5244494e414c0a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e444154415f49445f4348494c442c0a20202020202020202020202853454c454354205550504552284348494c445f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204e45572e52454c4154494f4e534849505f4944292c0a20202020202020202020204e45572e444154415f49445f504152454e542c0a2020202020202020202020274441544120534554272c0a20202020202020202020202853454c45435420434f44452046524f4d20646174615f616c6c205748455245204944203d204e45572e444154415f49445f504152454e54292c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d502c0a20202020202020202020204e45572e4f5244494e414c0a202020202020202020293b0a20202020202020293b0a0a435245415445204f52205245504c4143452052554c4520646174615f72656c6174696f6e736869705f64656c6574652041530a202020204f4e2044454c45544520544f20646174615f7365745f72656c6174696f6e73686970735f616c6c0a202020205748455245204f4c442e44454c5f4944204953204e554c4c0a20202020202020444f20414c534f20280a20202020202020202055504441544520444154415f5345545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020202020574845524520284d41494e5f444154415f4944203d204f4c442e444154415f49445f504152454e540a202020202020202020202020202020202020414e4420444154415f4944203d204f4c442e444154415f49445f4348494c440a202020202020202020202020202020202020414e442052454c4154494f4e5f54595045203d202853454c45435420555050455228504152454e545f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204f4c442e52454c4154494f4e534849505f4944290a202020202020202020202020202020202020414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c290a202020202020202020202020204f5220284d41494e5f444154415f4944203d204f4c442e444154415f49445f4348494c440a2020202020202020202020202020202020414e4420444154415f4944203d204f4c442e444154415f49445f504152454e540a2020202020202020202020202020202020414e442052454c4154494f4e5f54595045203d202853454c454354205550504552284348494c445f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204f4c442e52454c4154494f4e534849505f4944290a2020202020202020202020202020202020414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c293b0a20202020202020293b0a0a435245415445204f52205245504c4143452052554c4520646174615f72656c6174696f6e736869705f7570646174652041530a202020204f4e2055504441544520544f20646174615f7365745f72656c6174696f6e73686970735f616c6c0a202020205748455245204e45572e44454c5f4944204953204e554c4c20414e44204f4c442e44454c5f4944204953204e554c4c0a20202020202020444f20414c534f20280a20202020202020202055504441544520444154415f5345545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020202020574845524520284d41494e5f444154415f4944203d204f4c442e444154415f49445f504152454e540a202020202020202020202020202020202020414e4420444154415f4944203d204f4c442e444154415f49445f4348494c440a202020202020202020202020202020202020414e442052454c4154494f4e5f54595045203d202853454c45435420555050455228504152454e545f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204f4c442e52454c4154494f4e534849505f4944290a202020202020202020202020202020202020414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c290a202020202020202020202020204f5220284d41494e5f444154415f4944203d204f4c442e444154415f49445f4348494c440a2020202020202020202020202020202020414e4420444154415f4944203d204f4c442e444154415f49445f504152454e540a2020202020202020202020202020202020414e442052454c4154494f4e5f54595045203d202853454c454354205550504552284348494c445f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204f4c442e52454c4154494f4e534849505f4944290a2020202020202020202020202020202020414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c293b0a202020202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f444154415f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a2020202020202020202020444154415f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d502c0a20202020202020202020204f5244494e414c0a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e444154415f49445f504152454e542c0a20202020202020202020202853454c45435420555050455228504152454e545f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204e45572e52454c4154494f4e534849505f4944292c0a20202020202020202020204e45572e444154415f49445f4348494c442c0a2020202020202020202020274441544120534554272c0a20202020202020202020202853454c45435420434f44452046524f4d20646174615f616c6c205748455245204944203d204e45572e444154415f49445f4348494c44292c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d502c0a20202020202020202020204e45572e4f5244494e414c0a202020202020202020293b0a202020202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f444154415f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a2020202020202020202020444154415f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d502c0a20202020202020202020204f5244494e414c0a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e444154415f49445f4348494c442c0a20202020202020202020202853454c454354205550504552284348494c445f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204e45572e52454c4154494f4e534849505f4944292c0a20202020202020202020204e45572e444154415f49445f504152454e542c0a2020202020202020202020274441544120534554272c0a20202020202020202020202853454c45435420434f44452046524f4d20646174615f616c6c205748455245204944203d204e45572e444154415f49445f504152454e54292c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d502c0a20202020202020202020204e45572e4f5244494e414c0a202020202020202020293b0a20202020202020293b0a0a435245415445204f52205245504c4143452052554c4520646174615f72656c6174696f6e736869705f74726173685f7570646174652041530a202020204f4e2055504441544520544f20646174615f7365745f72656c6174696f6e73686970735f616c6c0a202020205748455245204e45572e44454c5f4944204953204e4f54204e554c4c20414e44204f4c442e44454c5f4944204953204e554c4c0a20202020202020444f20414c534f20280a20202020202020202055504441544520444154415f5345545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020202020574845524520284d41494e5f444154415f4944203d204f4c442e444154415f49445f504152454e540a202020202020202020202020202020202020414e4420444154415f4944203d204f4c442e444154415f49445f4348494c440a202020202020202020202020202020202020414e442052454c4154494f4e5f54595045203d202853454c45435420555050455228504152454e545f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204f4c442e52454c4154494f4e534849505f4944290a202020202020202020202020202020202020414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c290a202020202020202020202020204f5220284d41494e5f444154415f4944203d204f4c442e444154415f49445f4348494c440a2020202020202020202020202020202020414e4420444154415f4944203d204f4c442e444154415f49445f504152454e540a2020202020202020202020202020202020414e442052454c4154494f4e5f54595045203d202853454c454354205550504552284348494c445f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204f4c442e52454c4154494f4e534849505f4944290a2020202020202020202020202020202020414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c293b0a20202020202020293b0a0a435245415445204f52205245504c4143452052554c4520646174615f72656c6174696f6e736869705f74726173685f7265766572745f7570646174652041530a202020204f4e2055504441544520544f20646174615f7365745f72656c6174696f6e73686970735f616c6c0a202020205748455245204f4c442e44454c5f4944204953204e4f54204e554c4c20414e44204e45572e44454c5f4944204953204e554c4c0a20202020202020444f20414c534f20280a202020202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f444154415f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a2020202020202020202020444154415f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d502c0a20202020202020202020204f5244494e414c0a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e444154415f49445f504152454e542c0a20202020202020202020202853454c45435420555050455228504152454e545f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204e45572e52454c4154494f4e534849505f4944292c0a20202020202020202020204e45572e444154415f49445f4348494c442c0a2020202020202020202020274441544120534554272c0a20202020202020202020202853454c45435420434f44452046524f4d20646174615f616c6c205748455245204944203d204e45572e444154415f49445f4348494c44292c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d502c0a20202020202020202020204e45572e4f5244494e414c0a202020202020202020293b0a202020202020202020494e5345525420494e544f20444154415f5345545f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f444154415f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a2020202020202020202020444154415f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d502c0a20202020202020202020204f5244494e414c0a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c2827444154415f5345545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e444154415f49445f4348494c442c0a20202020202020202020202853454c454354205550504552284348494c445f4c4142454c292046524f4d2052454c4154494f4e534849505f5459504553205748455245204944203d204e45572e52454c4154494f4e534849505f4944292c0a20202020202020202020204e45572e444154415f49445f504152454e542c0a2020202020202020202020274441544120534554272c0a20202020202020202020202853454c45435420434f44452046524f4d20646174615f616c6c205748455245204944203d204e45572e444154415f49445f504152454e54292c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d502c0a20202020202020202020204e45572e4f5244494e414c0a202020202020202020293b0a20202020202020293b0a0a0a0a2d2d2073616d706c657320706172656e742d6368696c642072656c6174696f6e736869700a0a435245415445204f52205245504c4143452052554c452073616d706c655f706172656e745f6368696c645f696e736572742041530a202020204f4e20494e5345525420544f2073616d706c655f72656c6174696f6e73686970735f616c6c0a202020205748455245204e45572e44454c5f4944204953204e554c4c0a20202020202020444f20414c534f20280a202020202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f53414d505f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a202020202020202020202053414d505f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020414e4e4f544154494f4e532c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d500a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e53414d504c455f49445f504152454e542c0a202020202020202020202027504152454e54272c0a20202020202020202020204e45572e53414d504c455f49445f4348494c442c0a20202020202020202020202753414d504c45272c0a20202020202020202020202853454c454354205045524d5f49442046524f4d2073616d706c65735f616c6c205748455245204944203d204e45572e53414d504c455f49445f4348494c44292c0a20202020202020202020204e45572e504152454e545f414e4e4f544154494f4e532c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020293b0a202020202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f53414d505f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a202020202020202020202053414d505f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020414e4e4f544154494f4e532c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d500a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e53414d504c455f49445f4348494c442c0a2020202020202020202020274348494c44272c0a20202020202020202020204e45572e53414d504c455f49445f504152454e542c0a20202020202020202020202753414d504c45272c0a20202020202020202020202853454c454354205045524d5f49442046524f4d2073616d706c65735f616c6c205748455245204944203d204e45572e53414d504c455f49445f504152454e54292c0a20202020202020202020204e45572e4348494c445f414e4e4f544154494f4e532c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020293b0a20202020202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f706172656e745f6368696c645f64656c6574652041530a202020204f4e2044454c45544520544f2073616d706c655f72656c6174696f6e73686970735f616c6c0a202020205748455245204f4c442e44454c5f4944204953204e554c4c0a20202020202020444f20414c534f20280a2020202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020202020574845524520284d41494e5f53414d505f4944203d204f4c442e53414d504c455f49445f504152454e5420414e442053414d505f4944203d204f4c442e53414d504c455f49445f4348494c4420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c290a202020202020202020202020204f5220284d41494e5f53414d505f4944203d204f4c442e53414d504c455f49445f4348494c4420414e442053414d505f4944203d204f4c442e53414d504c455f49445f504152454e5420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c293b0a20202020202020293b0a435245415445204f52205245504c4143452052554c452073616d706c655f6368696c645f616e6e6f746174696f6e735f7570646174652041530a202020204f4e2055504441544520544f2073616d706c655f72656c6174696f6e73686970735f616c6c0a202020205748455245204f4c442e44454c5f4944204953204e554c4c20414e44204e45572e44454c5f4944204953204e554c4c0a20202020202020202020414e44204f4c442e53414d504c455f49445f4348494c44203d204e45572e53414d504c455f49445f4348494c4420414e44204f4c442e53414d504c455f49445f504152454e54203d204e45572e53414d504c455f49445f504152454e540a20202020202020202020414e44204f4c442e4348494c445f414e4e4f544154494f4e53203c3e204e45572e4348494c445f414e4e4f544154494f4e530a20202020202020444f20414c534f20280a202020202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f53414d505f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a202020202020202020202053414d505f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020414e4e4f544154494f4e532c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d502c0a202020202020202020202056414c49445f554e54494c5f54494d455354414d500a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e53414d504c455f49445f4348494c442c0a2020202020202020202020274348494c44272c0a20202020202020202020204e45572e53414d504c455f49445f504152454e542c0a20202020202020202020202753414d504c45272c0a20202020202020202020202853454c454354205045524d5f49442046524f4d2073616d706c65735f616c6c205748455245204944203d204e45572e53414d504c455f49445f504152454e54292c0a20202020202020202020204f4c442e4348494c445f414e4e4f544154494f4e532c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204f4c442e4d4f44494649434154494f4e5f54494d455354414d502c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020293b0a20202020202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f706172656e745f616e6e6f746174696f6e735f7570646174652041530a202020204f4e2055504441544520544f2073616d706c655f72656c6174696f6e73686970735f616c6c0a202020205748455245204f4c442e44454c5f4944204953204e554c4c20414e44204e45572e44454c5f4944204953204e554c4c0a20202020202020202020414e44204f4c442e53414d504c455f49445f4348494c44203d204e45572e53414d504c455f49445f4348494c4420414e44204f4c442e53414d504c455f49445f504152454e54203d204e45572e53414d504c455f49445f504152454e540a20202020202020202020414e44204f4c442e504152454e545f414e4e4f544154494f4e53203c3e204e45572e504152454e545f414e4e4f544154494f4e530a20202020202020444f20414c534f20280a202020202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f53414d505f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a202020202020202020202053414d505f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020414e4e4f544154494f4e532c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d500a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e53414d504c455f49445f504152454e542c0a202020202020202020202027504152454e54272c0a20202020202020202020204e45572e53414d504c455f49445f4348494c442c0a20202020202020202020202753414d504c45272c0a20202020202020202020202853454c454354205045524d5f49442046524f4d2073616d706c65735f616c6c205748455245204944203d204e45572e53414d504c455f49445f4348494c44292c0a20202020202020202020204f4c442e504152454e545f414e4e4f544154494f4e532c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020293b0a20202020202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f706172656e745f6368696c645f7570646174652041530a202020204f4e2055504441544520544f2073616d706c655f72656c6174696f6e73686970735f616c6c0a202020205748455245204e45572e44454c5f4944204953204e4f54204e554c4c20414e44204f4c442e44454c5f4944204953204e554c4c0a20202020202020444f20414c534f20280a2020202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020202020574845524520284d41494e5f53414d505f4944203d204f4c442e53414d504c455f49445f504152454e5420414e442053414d505f4944203d204f4c442e53414d504c455f49445f4348494c4420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c290a202020202020202020202020204f5220284d41494e5f53414d505f4944203d204f4c442e53414d504c455f49445f4348494c4420414e442053414d505f4944203d204f4c442e53414d504c455f49445f504152454e5420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c293b0a20202020202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f706172656e745f6368696c645f7265766572745f7570646174652041530a202020204f4e2055504441544520544f2073616d706c655f72656c6174696f6e73686970735f616c6c0a202020205748455245204e45572e44454c5f4944204953204e554c4c20414e44204f4c442e44454c5f4944204953204e4f54204e554c4c0a20202020202020444f20414c534f20280a202020202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f53414d505f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a202020202020202020202053414d505f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020414e4e4f544154494f4e532c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d500a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e53414d504c455f49445f504152454e542c0a202020202020202020202027504152454e54272c0a20202020202020202020204e45572e53414d504c455f49445f4348494c442c0a20202020202020202020202753414d504c45272c0a20202020202020202020202853454c454354205045524d5f49442046524f4d2073616d706c65735f616c6c205748455245204944203d204e45572e53414d504c455f49445f4348494c44292c0a20202020202020202020204e45572e504152454e545f414e4e4f544154494f4e532c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020293b0a202020202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a202020202020202020202049442c0a20202020202020202020204d41494e5f53414d505f49442c0a202020202020202020202052454c4154494f4e5f545950452c0a202020202020202020202053414d505f49442c0a2020202020202020202020454e544954595f4b494e442c0a2020202020202020202020454e544954595f5045524d5f49442c0a2020202020202020202020414e4e4f544154494f4e532c0a2020202020202020202020504552535f49445f415554484f522c0a202020202020202020202056414c49445f46524f4d5f54494d455354414d500a202020202020202020292056414c55455320280a20202020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a20202020202020202020204e45572e53414d504c455f49445f4348494c442c0a2020202020202020202020274348494c44272c0a20202020202020202020204e45572e53414d504c455f49445f504152454e542c0a20202020202020202020202753414d504c45272c0a20202020202020202020202853454c454354205045524d5f49442046524f4d2073616d706c65735f616c6c205748455245204944203d204e45572e53414d504c455f49445f504152454e54292c0a20202020202020202020204e45572e4348494c445f414e4e4f544154494f4e532c0a20202020202020202020204e45572e504552535f49445f415554484f522c0a20202020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a202020202020202020293b0a20202020202020293b0a0a2d2d206578706572696d656e74202d3e2070726f6a6563740a0a435245415445204f52205245504c4143452052554c45206578706572696d656e745f70726f6a6563745f7570646174652041530a202020204f4e2055504441544520544f206578706572696d656e74735f616c6c0a20202020574845524520284f4c442e50524f4a5f494420213d204e45572e50524f4a5f4944204f52204f4c442e50524f4a5f4944204953204e554c4c2920414e44204e45572e50524f4a5f4944204953204e4f54204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452050524f4a4543545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f50524f4a5f4944203d204f4c442e50524f4a5f494420414e4420455850455f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f2050524f4a4543545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f50524f4a5f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020455850455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282750524f4a4543545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e50524f4a5f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a202020202020202020274558504552494d454e54272c0a2020202020202020204e45572e5045524d5f49442c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020202020555044415445204558504552494d454e545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f455850455f4944203d204f4c442e494420414e442050524f4a5f4944203d204f4c442e50524f4a5f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f204558504552494d454e545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f455850455f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202050524f4a5f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c28274558504552494d454e545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e50524f4a5f49442c0a2020202020202020202750524f4a454354272c0a2020202020202020202853454c454354207065726d5f69642046524f4d2050524f4a45435453205748455245204944203d204e45572e50524f4a5f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c45206578706572696d656e745f70726f6a6563745f72656d6f76655f7570646174652041530a202020204f4e2055504441544520544f206578706572696d656e74735f616c6c0a202020205748455245204f4c442e50524f4a5f4944204953204e4f54204e554c4c20414e44204e45572e50524f4a5f4944204953204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452050524f4a4543545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f50524f4a5f4944203d204f4c442e50524f4a5f494420414e4420455850455f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020555044415445204558504552494d454e545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f455850455f4944203d204f4c442e494420414e442050524f4a5f4944203d204f4c442e50524f4a5f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020293b0a0a435245415445204f52205245504c4143452052554c45206578706572696d656e745f70726f6a6563745f696e736572742041530a202020204f4e20494e5345525420544f206578706572696d656e74735f616c6c0a202020205748455245204e45572e50524f4a5f4944204953204e4f54204e554c4c0a20202020202020444f20414c534f20280a20202020202020494e5345525420494e544f2050524f4a4543545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f50524f4a5f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020455850455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282750524f4a4543545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e50524f4a5f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a202020202020202020274558504552494d454e54272c0a2020202020202020204e45572e5045524d5f49442c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020202020494e5345525420494e544f204558504552494d454e545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f455850455f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202050524f4a5f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c28274558504552494d454e545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e50524f4a5f49442c0a2020202020202020202750524f4a454354272c0a2020202020202020202853454c454354207065726d5f69642046524f4d2050524f4a45435453205748455245204944203d204e45572e50524f4a5f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020293b0a0a435245415445204f52205245504c4143452052554c45206578706572696d656e745f70726f6a6563745f64656c6574652041530a202020204f4e2044454c45544520544f206578706572696d656e74735f616c6c0a202020205748455245204f4c442e50524f4a5f4944204953204e4f54204e554c4c0a20202020202020444f20414c534f0a202020202020205550444154452050524f4a4543545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d2063757272656e745f74696d657374616d700a2020202020202020205748455245204d41494e5f50524f4a5f4944203d204f4c442e50524f4a5f494420414e4420455850455f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a0a2d2d2070726f6a656374202d3e2073706163650a0a435245415445204f52205245504c4143452052554c452070726f6a6563745f73706163655f7570646174652041530a202020204f4e2055504441544520544f2070726f6a656374730a20202020574845524520284f4c442e53504143455f494420213d204e45572e53504143455f4944204f52204f4c442e53504143455f4944204953204e554c4c2920414e44204e45572e53504143455f4944204953204e4f54204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452050524f4a4543545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f50524f4a5f4944203d204f4c442e494420414e442053504143455f4944203d204f4c442e53504143455f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f2050524f4a4543545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f50524f4a5f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053504143455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282750524f4a4543545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e53504143455f49442c0a202020202020202020275350414345272c0a2020202020202020202853454c45435420434f44452046524f4d20535041434553205748455245204944203d204e45572e53504143455f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452070726f6a6563745f73706163655f72656d6f76655f7570646174652041530a202020204f4e2055504441544520544f2070726f6a656374730a202020205748455245204f4c442e53504143455f4944204953204e4f54204e554c4c20414e44204e45572e53504143455f4944204953204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452050524f4a4543545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f50524f4a5f4944203d204f4c442e494420414e442053504143455f4944203d204f4c442e53504143455f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452070726f6a6563745f73706163655f696e736572742041530a202020204f4e20494e5345525420544f2070726f6a656374730a202020205748455245204e45572e53504143455f4944204953204e4f54204e554c4c0a20202020202020444f20414c534f20280a20202020202020494e5345525420494e544f2050524f4a4543545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f50524f4a5f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053504143455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282750524f4a4543545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e53504143455f49442c0a202020202020202020275350414345272c0a2020202020202020202853454c45435420434f44452046524f4d20535041434553205748455245204944203d204e45572e53504143455f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020293b0a0a2d2d2073616d706c65202d3e2070726f6a6563740a0a435245415445204f52205245504c4143452052554c452073616d706c655f70726f6a6563745f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a20202020574845524520284f4c442e50524f4a5f494420213d204e45572e50524f4a5f4944204f52204f4c442e50524f4a5f4944204953204e554c4c204f52204f4c442e455850455f4944204953204e4f54204e554c4c2920414e44204e45572e50524f4a5f4944204953204e4f54204e554c4c20414e44204e45572e455850455f4944204953204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452050524f4a4543545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f50524f4a5f4944203d204f4c442e50524f4a5f494420414e442053414d505f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f2050524f4a4543545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f50524f4a5f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282750524f4a4543545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e50524f4a5f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a2020202020202020202753414d504c45272c0a2020202020202020204e45572e5045524d5f49442c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e494420414e442050524f4a5f4944203d204f4c442e50524f4a5f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202050524f4a5f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e50524f4a5f49442c0a2020202020202020202750524f4a454354272c0a2020202020202020202853454c454354205045524d5f49442046524f4d2050524f4a45435453205748455245204944203d204e45572e50524f4a5f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f70726f6a6563745f72656d6f76655f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a202020205748455245204f4c442e50524f4a5f4944204953204e4f54204e554c4c20414e4420284e45572e50524f4a5f4944204953204e554c4c204f5220284f4c442e455850455f4944204953204e554c4c20414e44204e45572e455850455f4944204953204e4f54204e554c4c29290a20202020444f20414c534f20280a202020202020205550444154452050524f4a4543545f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f50524f4a5f4944203d204f4c442e50524f4a5f494420414e442053414d505f4944203d204f4c442e494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e494420414e442050524f4a5f4944203d204f4c442e50524f4a5f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f70726f6a6563745f696e736572742041530a202020204f4e20494e5345525420544f2073616d706c65735f616c6c0a202020205748455245204e45572e455850455f4944204953204e554c4c20414e44204e45572e50524f4a5f4944204953204e4f54204e554c4c0a20202020444f20414c534f20280a20202020202020494e5345525420494e544f2050524f4a4543545f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f50524f4a5f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053414d505f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282750524f4a4543545f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e50524f4a5f49442c0a202020202020202020274f574e4552272c0a2020202020202020204e45572e49442c0a2020202020202020202753414d504c45272c0a2020202020202020204e45572e5045524d5f49442c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202050524f4a5f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e50524f4a5f49442c0a2020202020202020202750524f4a454354272c0a2020202020202020202853454c454354205045524d5f49442046524f4d2050524f4a45435453205748455245204944203d204e45572e50524f4a5f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020293b0a0a2d2d2073616d706c65202d3e2070726f6a6563740a0a435245415445204f52205245504c4143452052554c452073616d706c655f73706163655f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a20202020574845524520284f4c442e53504143455f494420213d204e45572e53504143455f4944204f52204f4c442e53504143455f4944204953204e554c4c204f52204f4c442e455850455f4944204953204e4f54204e554c4c204f52204f4c442e50524f4a5f4944204953204e4f54204e554c4c2920414e44204e45572e53504143455f4944204953204e4f54204e554c4c20414e44204e45572e455850455f4944204953204e554c4c20414e44204e45572e50524f4a5f4944204953204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e494420414e442053504143455f4944203d204f4c442e53504143455f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053504143455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e53504143455f49442c0a202020202020202020275350414345272c0a2020202020202020202853454c45435420434f44452046524f4d20535041434553205748455245204944203d204e45572e53504143455f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f73706163655f72656d6f76655f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a202020205748455245204f4c442e53504143455f4944204953204e4f54204e554c4c20414e4420284e45572e53504143455f4944204953204e554c4c204f5220284f4c442e455850455f4944204953204e554c4c20414e44204e45572e455850455f4944204953204e4f54204e554c4c29204f5220284f4c442e50524f4a5f4944204953204e554c4c20414e44204e45572e50524f4a5f4944204953204e4f54204e554c4c29290a20202020444f20414c534f20280a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e494420414e442053504143455f4944203d204f4c442e53504143455f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f73706163655f696e736572742041530a202020204f4e20494e5345525420544f2073616d706c65735f616c6c0a202020205748455245204e45572e455850455f4944204953204e554c4c20414e44204e45572e53504143455f4944204953204e4f54204e554c4c20414e44204e45572e50524f4a5f4944204953204e554c4c0a20202020444f20414c534f20280a202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053504143455f49442c0a202020202020202020454e544954595f4b494e442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e53504143455f49442c0a202020202020202020275350414345272c0a2020202020202020202853454c45435420434f44452046524f4d20535041434553205748455245204944203d204e45572e53504143455f4944292c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020293b0a0a2d2d2072756c657320666f72207368617265642073616d706c65730a0a435245415445204f52205245504c4143452052554c452073616d706c655f7368617265645f696e736572742041530a202020204f4e20494e5345525420544f2073616d706c65735f616c6c0a202020205748455245204e45572e53504143455f4944204953204e554c4c0a20202020202020444f20414c534f20280a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a202020202020202020455850455f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e455850455f49442c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f7368617265645f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a202020205748455245204f4c442e53504143455f4944204953204e4f54204e554c4c20414e44204e45572e53504143455f4944204953204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e494420414e442053504143455f4944203d204f4c442e53504143455f494420414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020202020494e5345525420494e544f2053414d504c455f52454c4154494f4e53484950535f484953544f525920280a20202020202020202049442c0a2020202020202020204d41494e5f53414d505f49442c0a20202020202020202052454c4154494f4e5f545950452c0a20202020202020202053504143455f49442c0a202020202020202020454e544954595f5045524d5f49442c0a202020202020202020504552535f49445f415554484f522c0a20202020202020202056414c49445f46524f4d5f54494d455354414d500a20202020202020292056414c55455320280a2020202020202020206e65787476616c282753414d504c455f52454c4154494f4e53484950535f484953544f52595f49445f53455127292c0a2020202020202020204e45572e49442c0a202020202020202020274f574e4544272c0a2020202020202020204e45572e53504143455f49442c0a2020202020202020204e554c4c2c0a2020202020202020204e45572e504552535f49445f4d4f4449464945522c0a2020202020202020204e45572e4d4f44494649434154494f4e5f54494d455354414d500a20202020202020293b0a20202020293b0a0a435245415445204f52205245504c4143452052554c452073616d706c655f7368617265645f72656d6f76655f7570646174652041530a202020204f4e2055504441544520544f2073616d706c65735f616c6c0a202020205748455245204f4c442e53504143455f4944204953204e554c4c20414e44204e45572e53504143455f4944204953204e4f54204e554c4c0a20202020444f20414c534f20280a202020202020205550444154452053414d504c455f52454c4154494f4e53484950535f484953544f5259205345542056414c49445f554e54494c5f54494d455354414d50203d204e45572e4d4f44494649434154494f4e5f54494d455354414d500a2020202020202020205748455245204d41494e5f53414d505f4944203d204f4c442e494420414e442053504143455f4944204953204e554c4c20414e4420454e544954595f5045524d5f4944204953204e554c4c20414e442050524f4a5f4944204953204e554c4c0a202020202020202020202020202020414e4420455850455f4944204953204e554c4c20414e442056414c49445f554e54494c5f54494d455354414d50204953204e554c4c3b0a20202020293b0a	\N
-188	source/sql/postgresql/migration/migration-187-188.sql	SUCCESS	2022-05-20 15:11:03.326	\\x4352454154452046554e4354494f4e20736166655f646f75626c6528732074657874292052455455524e5320646f75626c6520707265636973696f6e2041532024240a424547494e0a52455455524e20733a3a646f75626c6520707265636973696f6e3b0a455843455054494f4e205748454e204f5448455253205448454e0a2020202052455455524e204e554c4c3b0a454e443b202424204c414e475541474520706c706773716c205354524943543b0a	\N
+188	source/sql/postgresql/migration/migration-187-188.sql	SUCCESS	2022-05-24 11:54:37.522	\\x4352454154452046554e4354494f4e20736166655f646f75626c6528732074657874292052455455524e5320646f75626c6520707265636973696f6e2041532024240a424547494e0a52455455524e20733a3a646f75626c6520707265636973696f6e3b0a455843455054494f4e205748454e204f5448455253205448454e0a2020202052455455524e204e554c4c3b0a454e443b202424204c414e475541474520706c706773716c205354524943543b0a0a4352454154452046554e4354494f4e20736166655f74696d657374616d7028732074657874292052455455524e532074696d657374616d7020776974682074696d65207a6f6e652041532024240a424547494e0a52455455524e20733a3a74696d657374616d7020776974682074696d65207a6f6e653b0a455843455054494f4e205748454e204f5448455253205448454e0a2020202052455455524e204e554c4c3b0a454e443b202424204c414e475541474520706c706773716c205354524943543b0a	\N
diff --git a/openbis/sourceTest/sql/postgresql/188/schema-188.sql b/openbis/sourceTest/sql/postgresql/188/schema-188.sql
index e779c8100c8..450f7afbc66 100644
--- a/openbis/sourceTest/sql/postgresql/188/schema-188.sql
+++ b/openbis/sourceTest/sql/postgresql/188/schema-188.sql
@@ -877,6 +877,14 @@ RETURN s::double precision;
 EXCEPTION WHEN OTHERS THEN
     RETURN NULL;
 END; $$;
+CREATE FUNCTION safe_timestamp(s text) RETURNS timestamp with time zone
+    LANGUAGE plpgsql STRICT
+    AS $$
+BEGIN
+RETURN s::timestamp with time zone;
+EXCEPTION WHEN OTHERS THEN
+    RETURN NULL;
+END; $$;
 CREATE FUNCTION sample_fill_code_unique_check() RETURNS trigger
     LANGUAGE plpgsql
     AS $$
-- 
GitLab