# HG changeset patch
# User fraserofthenight
# Date 1246892788 25200
# Node ID 3425707ddbf627bd4d077e193cd37b66d8a87a3f
Initial import (hopefully this mercurial stuff works...)
diff -r 000000000000 -r 3425707ddbf6 .classpath
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.classpath Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff -r 000000000000 -r 3425707ddbf6 .hgignore
diff -r 000000000000 -r 3425707ddbf6 .project
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.project Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,17 @@
+
+
+ hoofbaby
+
+
+
+
+
+ descent.core.dbuilder
+
+
+
+
+
+ descent.core.dnature
+
+
diff -r 000000000000 -r 3425707ddbf6 .settings/Hoofbaby - Debug.launch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.settings/Hoofbaby - Debug.launch Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff -r 000000000000 -r 3425707ddbf6 .settings/Hoofbaby - Release.launch
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.settings/Hoofbaby - Release.launch Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff -r 000000000000 -r 3425707ddbf6 .settings/descent.core.prefs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.settings/descent.core.prefs Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,331 @@
+#Sun Jun 21 09:02:00 PDT 2009
+descent.core.compiler.allowDeprecated=enabled
+descent.core.compiler.debugIdentifiers=AVBuffer
+descent.core.compiler.debugLevel=1
+descent.core.compiler.enableSemanticErrorReporting=0
+descent.core.compiler.enableWarnings=enabled
+descent.core.compiler.source=1
+descent.core.compiler.taskCaseSensitive=enabled
+descent.core.compiler.taskPriorities=NORMAL,LOW,HIGH,HIGH,LOW,HIGH,LOW,LOW,LOW,HIGH
+descent.core.compiler.taskTags=TODO,PERHAPS,BUG,WTF,NEXTVERSION,WORKAREA,OPTIMIZE,CBUG,PORT,IMPORTANT
+descent.core.compiler.versionIdentifiers=DigitalMars, Windows, Win32, X86, LittleEndian, D_InlineAsm, D_InlineAsm_X86, all, Tango, Descent
+descent.core.compiler.versionLevel=0
+descent.core.formatter.alignment_for_array_literals=0
+descent.core.formatter.alignment_for_base_class_lists=0
+descent.core.formatter.alignment_for_function_declaration_parameters=0
+descent.core.formatter.alignment_for_function_invocation_arguments=0
+descent.core.formatter.alignment_for_multiple_variable_declarations=0
+descent.core.formatter.alignment_for_selective_imports=0
+descent.core.formatter.alignment_for_struct_initializer=0
+descent.core.formatter.alignment_for_template_declaration_parameters=0
+descent.core.formatter.alignment_for_template_invocation_arguments=0
+descent.core.formatter.blank_lines_after_module=1
+descent.core.formatter.blank_lines_before_module=0
+descent.core.formatter.brace_position_for_align_declaration=end_of_line
+descent.core.formatter.brace_position_for_anonymous_type=next_line
+descent.core.formatter.brace_position_for_conditional_declaration=next_line
+descent.core.formatter.brace_position_for_conditional_statement=next_line
+descent.core.formatter.brace_position_for_enum_declaration=next_line
+descent.core.formatter.brace_position_for_function_declaration=next_line
+descent.core.formatter.brace_position_for_function_literal=next_line
+descent.core.formatter.brace_position_for_loop_statement=next_line
+descent.core.formatter.brace_position_for_modifiers=next_line
+descent.core.formatter.brace_position_for_postblit_declaration=next_line
+descent.core.formatter.brace_position_for_pragmas=next_line
+descent.core.formatter.brace_position_for_scope_statement=next_line
+descent.core.formatter.brace_position_for_switch_case=next_line
+descent.core.formatter.brace_position_for_switch_statement=next_line
+descent.core.formatter.brace_position_for_synchronized_statement=next_line
+descent.core.formatter.brace_position_for_template_declaration=next_line
+descent.core.formatter.brace_position_for_try_catch_finally=next_line
+descent.core.formatter.brace_position_for_type_declaration=next_line
+descent.core.formatter.brace_position_for_with_statement=next_line
+descent.core.formatter.continuation_indentation=2
+descent.core.formatter.indent_body_declarations_compare_to_align_header=true
+descent.core.formatter.indent_body_declarations_compare_to_pragma_header=true
+descent.core.formatter.indent_body_declarations_compare_to_template_header=true
+descent.core.formatter.indent_body_declarations_compare_to_type_header=true
+descent.core.formatter.indent_break_compare_to_switch=false
+descent.core.formatter.indent_cases_compare_to_switch=true
+descent.core.formatter.indent_empty_lines=false
+descent.core.formatter.indent_enum_members_compare_to_enum_header=true
+descent.core.formatter.indent_in_out_body_compare_to_function_header=false
+descent.core.formatter.indent_statements_compare_to_case=true
+descent.core.formatter.indent_statements_compare_to_function_body_header=true
+descent.core.formatter.indent_statements_compare_to_function_header=true
+descent.core.formatter.indent_statements_compare_to_function_in_header=true
+descent.core.formatter.indent_statements_compare_to_function_out_header=true
+descent.core.formatter.indentation_size=4
+descent.core.formatter.indentation_style_compare_to_modifier_header=indent_normal
+descent.core.formatter.insert_new_line_after_case_or_default_statement=true
+descent.core.formatter.insert_new_line_after_label=true
+descent.core.formatter.insert_new_line_at_end_of_file_if_missing=false
+descent.core.formatter.insert_new_line_before_catch=true
+descent.core.formatter.insert_new_line_before_else_declaration=true
+descent.core.formatter.insert_new_line_before_else_statement=true
+descent.core.formatter.insert_new_line_before_finally=true
+descent.core.formatter.insert_new_line_before_while_in_do_statement=false
+descent.core.formatter.insert_space_after_assignment_operator=true
+descent.core.formatter.insert_space_after_closing_paren_in_casts=true
+descent.core.formatter.insert_space_after_colon_in_array_initializer=true
+descent.core.formatter.insert_space_after_colon_in_base_class_lists=true
+descent.core.formatter.insert_space_after_colon_in_case_default_statement=true
+descent.core.formatter.insert_space_after_colon_in_conditional_expressions=true
+descent.core.formatter.insert_space_after_colon_in_selective_imports=true
+descent.core.formatter.insert_space_after_colon_in_statement_labels=true
+descent.core.formatter.insert_space_after_colon_in_struct_initializer=true
+descent.core.formatter.insert_space_after_colon_in_template_specific_type=true
+descent.core.formatter.insert_space_after_comma_in_aggregate_template_parameters=true
+descent.core.formatter.insert_space_after_comma_in_array_access=true
+descent.core.formatter.insert_space_after_comma_in_array_literal=true
+descent.core.formatter.insert_space_after_comma_in_assert_statements=true
+descent.core.formatter.insert_space_after_comma_in_base_class_lists=true
+descent.core.formatter.insert_space_after_comma_in_delegates=true
+descent.core.formatter.insert_space_after_comma_in_foreach_statement=true
+descent.core.formatter.insert_space_after_comma_in_function_declaration_parameters=true
+descent.core.formatter.insert_space_after_comma_in_function_invocation_arguments=true
+descent.core.formatter.insert_space_after_comma_in_function_template_parameters=true
+descent.core.formatter.insert_space_after_comma_in_multiple_field_declarations=true
+descent.core.formatter.insert_space_after_comma_in_multiple_imports=true
+descent.core.formatter.insert_space_after_comma_in_new_arguments=true
+descent.core.formatter.insert_space_after_comma_in_pragmas=true
+descent.core.formatter.insert_space_after_comma_in_selective_imports=true
+descent.core.formatter.insert_space_after_comma_in_struct_initializer=true
+descent.core.formatter.insert_space_after_comma_in_template_declaration=true
+descent.core.formatter.insert_space_after_comma_in_template_invocation=true
+descent.core.formatter.insert_space_after_comma_in_traits_expression=true
+descent.core.formatter.insert_space_after_dot_in_qualified_names=false
+descent.core.formatter.insert_space_after_dot_in_type_dot_identifier_expressions=false
+descent.core.formatter.insert_space_after_elipsis_in_function_varargs=false
+descent.core.formatter.insert_space_after_elipsis_in_tuples=false
+descent.core.formatter.insert_space_after_equals_in_default_function_arguments=true
+descent.core.formatter.insert_space_after_equals_in_default_template_arguments=true
+descent.core.formatter.insert_space_after_equals_in_enum_constants=true
+descent.core.formatter.insert_space_after_equals_in_renamed_imports=true
+descent.core.formatter.insert_space_after_equals_in_variable_inits=true
+descent.core.formatter.insert_space_after_equals_in_version_debug_assignment=true
+descent.core.formatter.insert_space_after_exclamation_point_in_template_invocation=false
+descent.core.formatter.insert_space_after_infix_operator=true
+descent.core.formatter.insert_space_after_opening_bracket_in_array_access=false
+descent.core.formatter.insert_space_after_opening_bracket_in_array_constructors=false
+descent.core.formatter.insert_space_after_opening_bracket_in_array_literals=false
+descent.core.formatter.insert_space_after_opening_bracket_in_associative_arrays=false
+descent.core.formatter.insert_space_after_opening_bracket_in_slices=false
+descent.core.formatter.insert_space_after_opening_bracket_in_static_arrays=false
+descent.core.formatter.insert_space_after_opening_paren_in_align_declarations=false
+descent.core.formatter.insert_space_after_opening_paren_in_assert_statements=false
+descent.core.formatter.insert_space_after_opening_paren_in_c_style_fp=false
+descent.core.formatter.insert_space_after_opening_paren_in_casts=false
+descent.core.formatter.insert_space_after_opening_paren_in_catch=false
+descent.core.formatter.insert_space_after_opening_paren_in_class_template_params=false
+descent.core.formatter.insert_space_after_opening_paren_in_delegate=false
+descent.core.formatter.insert_space_after_opening_paren_in_extern_declarations=false
+descent.core.formatter.insert_space_after_opening_paren_in_file_imports=false
+descent.core.formatter.insert_space_after_opening_paren_in_for_loops=false
+descent.core.formatter.insert_space_after_opening_paren_in_foreach_loops=false
+descent.core.formatter.insert_space_after_opening_paren_in_function_declaration_parameters=false
+descent.core.formatter.insert_space_after_opening_paren_in_function_invocation=false
+descent.core.formatter.insert_space_after_opening_paren_in_function_template_args=false
+descent.core.formatter.insert_space_after_opening_paren_in_if_statements=false
+descent.core.formatter.insert_space_after_opening_paren_in_is_expressions=false
+descent.core.formatter.insert_space_after_opening_paren_in_mixins=false
+descent.core.formatter.insert_space_after_opening_paren_in_modified_type=false
+descent.core.formatter.insert_space_after_opening_paren_in_new_arguments=false
+descent.core.formatter.insert_space_after_opening_paren_in_out_declaration=false
+descent.core.formatter.insert_space_after_opening_paren_in_parenthesized_expressions=false
+descent.core.formatter.insert_space_after_opening_paren_in_pragmas=false
+descent.core.formatter.insert_space_after_opening_paren_in_scope_statements=false
+descent.core.formatter.insert_space_after_opening_paren_in_switch_statements=false
+descent.core.formatter.insert_space_after_opening_paren_in_synchronized_statement=false
+descent.core.formatter.insert_space_after_opening_paren_in_template_declarations=false
+descent.core.formatter.insert_space_after_opening_paren_in_template_invocation=false
+descent.core.formatter.insert_space_after_opening_paren_in_traits_expression=false
+descent.core.formatter.insert_space_after_opening_paren_in_type_dot_identifier_expression=false
+descent.core.formatter.insert_space_after_opening_paren_in_typeid_statements=false
+descent.core.formatter.insert_space_after_opening_paren_in_typeof_statements=false
+descent.core.formatter.insert_space_after_opening_paren_in_version_debug=false
+descent.core.formatter.insert_space_after_opening_paren_in_while_loops=false
+descent.core.formatter.insert_space_after_opening_paren_in_with_statements=false
+descent.core.formatter.insert_space_after_postfix_operator=false
+descent.core.formatter.insert_space_after_prefix_operator=false
+descent.core.formatter.insert_space_after_question_mark_in_conditional_expressions=true
+descent.core.formatter.insert_space_after_semicolon_in_for_statement=true
+descent.core.formatter.insert_space_after_semicolon_in_foreach_statement=true
+descent.core.formatter.insert_space_after_slice_operator=true
+descent.core.formatter.insert_space_after_slice_operator_in_foreach_range_statement=true
+descent.core.formatter.insert_space_after_star_in_c_style_fp=false
+descent.core.formatter.insert_space_after_trailing_comma_in_array_initializer=true
+descent.core.formatter.insert_space_before_assignment_operator=true
+descent.core.formatter.insert_space_before_asterisk_for_pointer_types=false
+descent.core.formatter.insert_space_before_closing_bracket_in_array_access=false
+descent.core.formatter.insert_space_before_closing_bracket_in_array_constructors=false
+descent.core.formatter.insert_space_before_closing_bracket_in_array_literals=false
+descent.core.formatter.insert_space_before_closing_bracket_in_associative_arrays=false
+descent.core.formatter.insert_space_before_closing_bracket_in_slices=false
+descent.core.formatter.insert_space_before_closing_bracket_in_static_arrays=false
+descent.core.formatter.insert_space_before_closing_paren_in_align_declarations=false
+descent.core.formatter.insert_space_before_closing_paren_in_assert_statements=false
+descent.core.formatter.insert_space_before_closing_paren_in_c_style_fp=false
+descent.core.formatter.insert_space_before_closing_paren_in_casts=false
+descent.core.formatter.insert_space_before_closing_paren_in_catch=false
+descent.core.formatter.insert_space_before_closing_paren_in_class_template_params=false
+descent.core.formatter.insert_space_before_closing_paren_in_delegate=false
+descent.core.formatter.insert_space_before_closing_paren_in_extern_declarations=false
+descent.core.formatter.insert_space_before_closing_paren_in_file_imports=false
+descent.core.formatter.insert_space_before_closing_paren_in_for_loops=false
+descent.core.formatter.insert_space_before_closing_paren_in_foreach_loops=false
+descent.core.formatter.insert_space_before_closing_paren_in_function_declaration_parameters=false
+descent.core.formatter.insert_space_before_closing_paren_in_function_invocation=false
+descent.core.formatter.insert_space_before_closing_paren_in_function_template_args=false
+descent.core.formatter.insert_space_before_closing_paren_in_if_statements=false
+descent.core.formatter.insert_space_before_closing_paren_in_is_expressions=false
+descent.core.formatter.insert_space_before_closing_paren_in_mixins=false
+descent.core.formatter.insert_space_before_closing_paren_in_modified_type=false
+descent.core.formatter.insert_space_before_closing_paren_in_new_arguments=false
+descent.core.formatter.insert_space_before_closing_paren_in_out_declaration=false
+descent.core.formatter.insert_space_before_closing_paren_in_parenthesized_expressions=false
+descent.core.formatter.insert_space_before_closing_paren_in_pragmas=false
+descent.core.formatter.insert_space_before_closing_paren_in_scope_statements=false
+descent.core.formatter.insert_space_before_closing_paren_in_switch_statements=false
+descent.core.formatter.insert_space_before_closing_paren_in_synchronized_statement=false
+descent.core.formatter.insert_space_before_closing_paren_in_template_declarations=false
+descent.core.formatter.insert_space_before_closing_paren_in_template_invocation=false
+descent.core.formatter.insert_space_before_closing_paren_in_traits_expression=false
+descent.core.formatter.insert_space_before_closing_paren_in_type_dot_identifier_expression=false
+descent.core.formatter.insert_space_before_closing_paren_in_typeid_statements=false
+descent.core.formatter.insert_space_before_closing_paren_in_typeof_statements=false
+descent.core.formatter.insert_space_before_closing_paren_in_version_debug=false
+descent.core.formatter.insert_space_before_closing_paren_in_while_loops=false
+descent.core.formatter.insert_space_before_closing_paren_in_with_statements=false
+descent.core.formatter.insert_space_before_colon_in_array_initializer=false
+descent.core.formatter.insert_space_before_colon_in_base_class_lists=true
+descent.core.formatter.insert_space_before_colon_in_case_default_statement=false
+descent.core.formatter.insert_space_before_colon_in_conditional_expressions=true
+descent.core.formatter.insert_space_before_colon_in_modifiers=false
+descent.core.formatter.insert_space_before_colon_in_selective_imports=false
+descent.core.formatter.insert_space_before_colon_in_statement_labels=false
+descent.core.formatter.insert_space_before_colon_in_struct_initializer=false
+descent.core.formatter.insert_space_before_colon_in_template_specific_type=false
+descent.core.formatter.insert_space_before_comma_in_aggregate_template_parameters=false
+descent.core.formatter.insert_space_before_comma_in_array_access=false
+descent.core.formatter.insert_space_before_comma_in_array_literal=false
+descent.core.formatter.insert_space_before_comma_in_assert_statements=false
+descent.core.formatter.insert_space_before_comma_in_base_class_lists=false
+descent.core.formatter.insert_space_before_comma_in_delegates=false
+descent.core.formatter.insert_space_before_comma_in_enum_member_lists=false
+descent.core.formatter.insert_space_before_comma_in_foreach_statement=false
+descent.core.formatter.insert_space_before_comma_in_function_declaration_parameters=false
+descent.core.formatter.insert_space_before_comma_in_function_invocation_arguments=false
+descent.core.formatter.insert_space_before_comma_in_function_template_parameters=false
+descent.core.formatter.insert_space_before_comma_in_multiple_field_declarations=false
+descent.core.formatter.insert_space_before_comma_in_multiple_imports=false
+descent.core.formatter.insert_space_before_comma_in_new_arguments=false
+descent.core.formatter.insert_space_before_comma_in_pragmas=false
+descent.core.formatter.insert_space_before_comma_in_selective_imports=false
+descent.core.formatter.insert_space_before_comma_in_struct_initializer=false
+descent.core.formatter.insert_space_before_comma_in_template_declaration=false
+descent.core.formatter.insert_space_before_comma_in_template_invocation=false
+descent.core.formatter.insert_space_before_comma_in_traits_expression=false
+descent.core.formatter.insert_space_before_dot_in_qualified_names=false
+descent.core.formatter.insert_space_before_dot_in_type_dot_identifier_expressions=false
+descent.core.formatter.insert_space_before_elipsis_in_function_varargs=false
+descent.core.formatter.insert_space_before_elipsis_in_tuples=false
+descent.core.formatter.insert_space_before_equals_in_default_function_arguments=true
+descent.core.formatter.insert_space_before_equals_in_default_template_arguments=true
+descent.core.formatter.insert_space_before_equals_in_enum_constants=true
+descent.core.formatter.insert_space_before_equals_in_renamed_imports=true
+descent.core.formatter.insert_space_before_equals_in_variable_inits=true
+descent.core.formatter.insert_space_before_equals_in_version_debug_assignment=true
+descent.core.formatter.insert_space_before_exclamation_point_in_template_invocation=false
+descent.core.formatter.insert_space_before_infix_operator=true
+descent.core.formatter.insert_space_before_opening_bracket_in_array_access=false
+descent.core.formatter.insert_space_before_opening_bracket_in_array_constructors=false
+descent.core.formatter.insert_space_before_opening_bracket_in_associative_arrays=false
+descent.core.formatter.insert_space_before_opening_bracket_in_dynamic_arrays=false
+descent.core.formatter.insert_space_before_opening_bracket_in_slices=false
+descent.core.formatter.insert_space_before_opening_bracket_in_static_arrays=false
+descent.core.formatter.insert_space_before_opening_paren_in_align_declarations=false
+descent.core.formatter.insert_space_before_opening_paren_in_assert_statements=false
+descent.core.formatter.insert_space_before_opening_paren_in_c_style_fp=true
+descent.core.formatter.insert_space_before_opening_paren_in_casts=false
+descent.core.formatter.insert_space_before_opening_paren_in_catch=false
+descent.core.formatter.insert_space_before_opening_paren_in_class_invariants=false
+descent.core.formatter.insert_space_before_opening_paren_in_class_template_params=false
+descent.core.formatter.insert_space_before_opening_paren_in_delegate=false
+descent.core.formatter.insert_space_before_opening_paren_in_extern_declarations=false
+descent.core.formatter.insert_space_before_opening_paren_in_file_imports=false
+descent.core.formatter.insert_space_before_opening_paren_in_for_loops=false
+descent.core.formatter.insert_space_before_opening_paren_in_foreach_loops=false
+descent.core.formatter.insert_space_before_opening_paren_in_function_declaration_parameters=false
+descent.core.formatter.insert_space_before_opening_paren_in_function_invocation=false
+descent.core.formatter.insert_space_before_opening_paren_in_function_template_args=false
+descent.core.formatter.insert_space_before_opening_paren_in_if_statements=false
+descent.core.formatter.insert_space_before_opening_paren_in_is_expressions=false
+descent.core.formatter.insert_space_before_opening_paren_in_mixins=false
+descent.core.formatter.insert_space_before_opening_paren_in_modified_type=false
+descent.core.formatter.insert_space_before_opening_paren_in_new_arguments=false
+descent.core.formatter.insert_space_before_opening_paren_in_out_declaration=false
+descent.core.formatter.insert_space_before_opening_paren_in_parenthesized_expressions=false
+descent.core.formatter.insert_space_before_opening_paren_in_pragmas=false
+descent.core.formatter.insert_space_before_opening_paren_in_scope_statements=false
+descent.core.formatter.insert_space_before_opening_paren_in_switch_statements=false
+descent.core.formatter.insert_space_before_opening_paren_in_synchronized_statement=false
+descent.core.formatter.insert_space_before_opening_paren_in_template_declarations=false
+descent.core.formatter.insert_space_before_opening_paren_in_traits_expression=false
+descent.core.formatter.insert_space_before_opening_paren_in_type_dot_identifier_expression=false
+descent.core.formatter.insert_space_before_opening_paren_in_typeid_statements=false
+descent.core.formatter.insert_space_before_opening_paren_in_typeof_statements=false
+descent.core.formatter.insert_space_before_opening_paren_in_version_debug=false
+descent.core.formatter.insert_space_before_opening_paren_in_while_loops=false
+descent.core.formatter.insert_space_before_opening_paren_in_with_statements=false
+descent.core.formatter.insert_space_before_postfix_operator=false
+descent.core.formatter.insert_space_before_prefix_operator=false
+descent.core.formatter.insert_space_before_question_mark_in_conditional_expressions=true
+descent.core.formatter.insert_space_before_semicolon=false
+descent.core.formatter.insert_space_before_semicolon_in_for_statement=false
+descent.core.formatter.insert_space_before_semicolon_in_foreach_statement=false
+descent.core.formatter.insert_space_before_slice_operator=true
+descent.core.formatter.insert_space_before_slice_operator_in_foreach_range_statement=true
+descent.core.formatter.insert_space_before_trailing_comma_in_array_initializer=false
+descent.core.formatter.insert_space_between_adjacent_brackets_in_multidimensional_arrays=false
+descent.core.formatter.insert_space_between_empty_brackets_in_dynamic_array_type=false
+descent.core.formatter.insert_space_between_empty_brackets_in_slice=false
+descent.core.formatter.insert_space_between_empty_parens_in_class_invariants=false
+descent.core.formatter.insert_space_between_empty_parens_in_class_template_params=false
+descent.core.formatter.insert_space_between_empty_parens_in_delegate=false
+descent.core.formatter.insert_space_between_empty_parens_in_extern_declarations=false
+descent.core.formatter.insert_space_between_empty_parens_in_function_declaration_parameters=false
+descent.core.formatter.insert_space_between_empty_parens_in_function_invocation=false
+descent.core.formatter.insert_space_between_empty_parens_in_function_template_args=false
+descent.core.formatter.insert_space_between_empty_parens_in_new_arguments=false
+descent.core.formatter.insert_space_between_empty_parens_in_out_declaration=false
+descent.core.formatter.insert_space_between_empty_parens_in_template_declarations=false
+descent.core.formatter.insert_space_between_empty_parens_in_template_invocation=false
+descent.core.formatter.insert_space_between_name_and_args_in_c_style_fp=false
+descent.core.formatter.insert_space_between_succesive_opcalls=false
+descent.core.formatter.insert_space_between_template_and_arg_parens_in_function_declaration=false
+descent.core.formatter.insert_space_between_template_args_and_function_args=false
+descent.core.formatter.keep_else_conditional_on_one_line=true
+descent.core.formatter.keep_else_version_debug_on_one_line=true
+descent.core.formatter.keep_functions_with_no_statement_in_one_line=true
+descent.core.formatter.keep_functions_with_one_statement_in_one_line=true
+descent.core.formatter.keep_simple_catch_statement_on_same_line=false
+descent.core.formatter.keep_simple_else_declaration_on_same_line=true
+descent.core.formatter.keep_simple_else_statement_on_same_line=false
+descent.core.formatter.keep_simple_finally_statement_on_same_line=false
+descent.core.formatter.keep_simple_loop_statement_on_same_line=false
+descent.core.formatter.keep_simple_scope_statement_on_same_line=true
+descent.core.formatter.keep_simple_synchronized_statement_on_same_line=true
+descent.core.formatter.keep_simple_then_declaration_on_same_line=true
+descent.core.formatter.keep_simple_then_statement_on_same_line=false
+descent.core.formatter.keep_simple_try_statement_on_same_line=false
+descent.core.formatter.keep_simple_with_statement_on_same_line=false
+descent.core.formatter.line_split=80
+descent.core.formatter.never_indent_block_comments_on_first_column=false
+descent.core.formatter.never_indent_line_comments_on_first_column=false
+descent.core.formatter.number_of_empty_lines_to_preserve=1
+descent.core.formatter.page_width=80
+descent.core.formatter.tab_char=tab
+descent.core.formatter.tab_size=4
+descent.core.formatter.use_tabs_only_for_leading_indentations=false
+eclipse.preferences.version=1
diff -r 000000000000 -r 3425707ddbf6 .settings/descent.ui.prefs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.settings/descent.ui.prefs Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,6 @@
+#Sun Jun 21 09:02:00 PDT 2009
+descent.ui.text.custom_code_templates=
+eclipse.preferences.version=1
+formatter_profile=_hoofbaby
+formatter_settings_version=1
+internal.default.compliance=user
diff -r 000000000000 -r 3425707ddbf6 .settings/org.eclipse.core.resources.prefs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.settings/org.eclipse.core.resources.prefs Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,3 @@
+#Wed May 27 17:45:01 PDT 2009
+eclipse.preferences.version=1
+encoding/=UTF-8
diff -r 000000000000 -r 3425707ddbf6 .settings/org.eclipse.core.runtime.prefs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.settings/org.eclipse.core.runtime.prefs Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,3 @@
+#Wed Apr 01 04:51:49 PDT 2009
+eclipse.preferences.version=1
+line.separator=\r\n
diff -r 000000000000 -r 3425707ddbf6 LICENSE.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE.txt Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff -r 000000000000 -r 3425707ddbf6 Platinum.sln.bat
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Platinum.sln.bat Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,1 @@
+start deps\Platinum\Build\Targets\x86-microsoft-win32-vs2008\Platinum.sln
\ No newline at end of file
diff -r 000000000000 -r 3425707ddbf6 bin/build.bat
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/build.bat Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,4 @@
+@echo off
+cd /d %~dp0
+build\rebuild.exe -offrankenbuild.exe -oqobjs/build ../src/build/frankenbuild.d
+frankenbuild.exe %*
\ No newline at end of file
diff -r 000000000000 -r 3425707ddbf6 bin/build/mcpp.exe
Binary file bin/build/mcpp.exe has changed
diff -r 000000000000 -r 3425707ddbf6 bin/build/rebuild.conf/default
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/build/rebuild.conf/default Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,1 @@
+profile=dmd-win-tango
diff -r 000000000000 -r 3425707ddbf6 bin/build/rebuild.conf/dmd-win-tango
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/build/rebuild.conf/dmd-win-tango Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,72 @@
+profile=tango
+
+compiler=dmd
+inifile=sc.ini
+
+exeext=.exe
+objext=obj
+objmodsep=-
+
+
+version=DigitalMars
+noversion=GNU
+noversion=linux
+noversion=Unix
+noversion=Posix
+version=Windows
+testversion=Win32
+testversion=Win64
+version=X86
+noversion=PPC
+noversion=X86_64
+version=D_InlineAsm
+version=D_InlineAsm_X86
+noversion=D_InlineAsm_PPC
+noversion=D_InlineAsm_X86_64
+version=LittleEndian
+noversion=BigEndian
+version=Tango
+
+
+[compile]
+cmd=dmd -version=Tango -c $i
+response=@
+
+flag=$i
+incdir=-I$i
+libdir=-L-L$i
+optimize=-O
+version=-version=$i
+
+
+[link]
+oneatatime=yes
+cmd=dmd $i -of$o
+response=@
+
+libdir=-L+$i\
+lib=-L+$i.lib
+flag=-L$i
+gui=-L/subsystem:windows
+
+
+[liblink]
+safe=yes
+oneatatime=yes
+cmd=lib -c -p512 $o $i
+response=@
+
+libdir=
+lib=
+flag=
+
+
+[postliblink]
+cmd=echo $i
+
+
+[shliblink]
+shlibs=no
+
+[dyliblink]
+dylibs=no
diff -r 000000000000 -r 3425707ddbf6 bin/build/rebuild.conf/tango
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/build/rebuild.conf/tango Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,1 @@
+ignore=gcc. object
diff -r 000000000000 -r 3425707ddbf6 bin/build/rebuild.exe
Binary file bin/build/rebuild.exe has changed
diff -r 000000000000 -r 3425707ddbf6 bin/build/touch.exe
Binary file bin/build/touch.exe has changed
diff -r 000000000000 -r 3425707ddbf6 bin/build/upx.exe
Binary file bin/build/upx.exe has changed
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Build/Targets/x86-microsoft-win32-vs2008/Platinum.ncb
Binary file deps/Platinum/Build/Targets/x86-microsoft-win32-vs2008/Platinum.ncb has changed
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Build/Targets/x86-microsoft-win32-vs2008/Platinum.sln
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Build/Targets/x86-microsoft-win32-vs2008/Platinum.sln Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,35 @@
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Platinum", "Platinum\Platinum.vcproj", "{568611D3-AFA7-4294-99C1-E9AED0D8057E}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Neptune", "..\..\..\ThirdParty\Neptune\Build\Targets\x86-microsoft-win32-vs2008\Neptune\Neptune.vcproj", "{12AFF2E5-6D95-4809-9728-9551677C078A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "platif", "..\..\..\..\..\src\platif\platif.vcproj", "{7D9FD95C-249A-4026-BEA1-BF21738D91A7}"
+ ProjectSection(ProjectDependencies) = postProject
+ {568611D3-AFA7-4294-99C1-E9AED0D8057E} = {568611D3-AFA7-4294-99C1-E9AED0D8057E}
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {568611D3-AFA7-4294-99C1-E9AED0D8057E}.Debug|Win32.ActiveCfg = Debug|Win32
+ {568611D3-AFA7-4294-99C1-E9AED0D8057E}.Debug|Win32.Build.0 = Debug|Win32
+ {568611D3-AFA7-4294-99C1-E9AED0D8057E}.Release|Win32.ActiveCfg = Release|Win32
+ {568611D3-AFA7-4294-99C1-E9AED0D8057E}.Release|Win32.Build.0 = Release|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Debug|Win32.Build.0 = Debug|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Release|Win32.ActiveCfg = Release|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Release|Win32.Build.0 = Release|Win32
+ {7D9FD95C-249A-4026-BEA1-BF21738D91A7}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7D9FD95C-249A-4026-BEA1-BF21738D91A7}.Debug|Win32.Build.0 = Debug|Win32
+ {7D9FD95C-249A-4026-BEA1-BF21738D91A7}.Release|Win32.ActiveCfg = Release|Win32
+ {7D9FD95C-249A-4026-BEA1-BF21738D91A7}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Build/Targets/x86-microsoft-win32-vs2008/Platinum/Platinum.vcproj
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Build/Targets/x86-microsoft-win32-vs2008/Platinum/Platinum.vcproj Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,558 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/CHANGELOG.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/CHANGELOG.txt Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,309 @@
+Platinum 0.4.9
+--------------
+added: PlatinumiPhone target to Platinum.xcodeproj
+changed: PlatinumApps.xcodeproj now depends on Platinum.xcodeproj
+changed: PLT_MediaBrowser and PLT_MediaController now asks delegate before subscribing to events to let a chance to decide if device is worth listening to events
+changed: renamed PLT_MediaBrowserListener to PLT_MediaBrowserDelegate and PLT_MediaControllerListener to PLT_MediaControllerDelegate
+changed: check for new event to notify every 100ms instead of 10ms, also reduce link list modifications to reduce allocatio/free
+added: can now specify custom user-agent and server http header
+fixed: missing didl resource if no protection attribute was set
+fixed: can now stop/restart devices without restarting entire upnp stack
+changed: honor Connection header from response if keep-alive is true
+fixed: more PS3 support
+added: now can specify initial port can be ignored if failed and try again with a random port
+added: support for resolution in didl, can now prevent certain files from being advertised in didl, better mimetype support in FileServer
+fixed: now aborts properly client socket tasks
+removed: null/null in array, uses NPT_ARRAY_SIZE instead
+removed: NPT_ERROR_INTERNAL result when closing a socket while still reading on it, now returns NPT_ERROR_EOS
+added: support for icons (MediaConnect sample for PS3)
+added: PLT_HttpRequestContext can hold a request and a context now
+changed: better dlna support, can now use request information to decide what to return (important to support xbox 360, ps3, etc..)
+fixed: XBox 360 not finding us anymore, don't hardcode same guid! and fix mp4 playback on 360
+
+Platinum 0.4.8
+--------------
+fixed: XBox 360 and PS3 video playback
+added: removed some FATAL logs, can pass path to MediaConnect cmd line
+changed: changes to http server to support path without a query
+added: frame streamer example (mjpeg live stream advertised via upnp)
+changed: verified that content-length was indeed set on the entity before writing it, to avoid writing 0 when the length wasn't known (multipart)
+
+Platinum 0.4.7
+--------------
+fixed: listener being called multiple times with same device when appearing or disapearing
+added: dc:date support in didl
+added: better dlna support for videos
+changed: don't cache empty results in media cache
+fixed: WMP 11 crash when unsubscribing
+fixed: crash after 15 min due to not cleaning up properly interface list before reusing it
+changed: allow for services with no actions (although not upnp compliant)
+fixed: lock media cache before access
+changed: switching to native eol
+changed: fixed xcode proj, add delay to get description/scpd for Rhapsody to be happy
+changed: uses HTTP 1.1 in server with keep-alive. Greatly improves performance
+updated: license is now GPLv2 or later
+changed: do not search, announce or respond on localhost anymore
+
+Platinum 0.4.6
+--------------
+changed: upnp server now uses same port for upnp and serving files (helps with firewall)
+added: upnp support for embedded devices
+changed: upnp device description can now be modified according to request (user agent header)
+fixed: better upnp eventing mechanism, can now pause eventing to set multiple state variables, and send update in a batch
+changed: detect xbox and change description to pretend to be WMP
+fixed: artist role attribute is not supposed to be in upnp namespace
+updated: Neptune to support Unicode filenames
+added: Sonos support! XBMC server can now be browsed by Sonos Desktop Controller and music can be played on multiple Sonos ZonePlayers all synchronously and streamed from XBMC. Sweeeeeeeeeeet!
+fixed: deadlock on subscribe
+fixed: crach on subscription cancellation
+fixed: first event notification was sent to early and could be missed
+fixed: UPnP Renderer Intel Validity Tool tests
+
+Platinum 0.4.5
+--------------
+fixed: better embedded devices support
+fixed: Unicode support on Win32 platforms
+changed: now can pause eventing to set multiple state variables and resume eventing then
+
+Platinum 0.4.3
+--------------
+fixed: vs2008 solution
+fixed: mp3 invalid protocol
+
+Platinum 0.4.2
+--------------
+changed: don't set an entity on request if no body is expected
+added: support for PS3 (basic dlna support)
+changed: MediaCrawler now derives from MediaConnect so that it's seen by XBox 360
+fixed: now passes the proper reachable interface when subscribing to events by keeping track of which interface was used when retrieving a device description
+fixed: gcc 4.2.3 errors (Ubuntu 8.04)
+changed: removed all NPT_Integer references
+fixed: didl parsing of resource with size > 2GB
+changed: didl resource duration is now unsigned
+added: support for SCons 1.0 (0.98.5)
+fixed: support for files > 4GB
+fixed: SIGPIPE errors on both Ubuntu and MacOSX
+fixed: potential memory leaks reported by valgrind
+changed: updated to use Neptune 1.0.1
+
+Platinum 0.4.1
+--------------
+fixed: crash caused by typo when fixing gcc warnings, was adding the wrong http handler
+changed: don't use an outside lock for requests in PltHttpClientTask which can cause delay and hang out when queuing requests in a row like when updating state (Thanks Andy B.!)
+added: copyright 2008
+
+Platinum 0.4.0
+--------------
+added: new PlatinumApps project for XCode
+added: apple iphone target
+fixed: fixing scons build, automatic stripping in release mode now
+fixed: potential crash due to trying to use connector of a client that didn't exist anymore
+added: support for Vs2008
+fixed: leopard support with both 10.4 and 10.5 sdk installed
+fixed: gcc 4 warnings
+changed: renamed fopen_s to fopen_wrapper
+fixed: Fix for unbuffered file streams on OSX (was callign setvbuf after seek)
+added: Support for SO_REUSEPORT on OSX
+added: Set NOSIGPIPE flag
+
+Platinum 0.3.9
+--------------
+added: Xbox360 support!
+fixed: warning appearing with gcc4 on macosx
+fixed: leaks when getting ip addresses
+added: new ring buffer stream and tests
+changed: Browse to pass a flag instead of UPnP browse text flag
+changed: Browse prototype
+changed: switched to static crt
+added: can now pass http port to FileMediaServerTest
+added: more mediatypes (avi, divx) support
+fixed: content-type not being set properly if file extension was uppercase
+fixed: MediaCrawler prototypes due to changes to Browse signature
+added: MediaConnect project
+added: arm-unknown-linux config (iphone support)
+added: RingBufferStream class
+fixed: NPT_Xml now writes the xml header
+changed: listen task now passed to Start/Stop function to have ctrlpoint, device remove themselves from it
+changed: working on better subscriber support in ctrlpoints (switching to references)
+removed: embedded devices support until we have a better idea on how to support it (is it DLNA compliant anyway?)
+added: a PresentationUrl element to description only if present otherwise Intel UPnP DeviceSpy is confused!
+added: avi & divx extension support to content-type
+added: custom http chunk decoder even though we don't support HTTP 1.1 yet
+fixed: server not reading socket info properly when receiving datagrams which would cause a device to respond to M-SEARCH requests on the wrong udp port (and Xbox360s to not discover our server!)
+fixed: Http Server handlers seem to trigger only on the path of a url NOT including the query which means that SCPD Urls with queries currently don't work! For now we switch to not use queries in SCPD urls
+changed: now announce and respond to search requests on loopback adapter
+fixed: Task manager thread was not sleeping enough! now 100ms
+added: ContentDirectorywSearchSCPD.xml SCPD (Xbox 360 needs Search !)
+updated: latest Neptune
+added: jpg content-type
+fixed: now don't allow to start if specified port for server is in use already
+added: more mimetype to class support
+added: can now pass a port for the file server of PLT_FileMediaServer
+changed: Device host and ctrl points now get their own task manager so that when they stop, all tasks stop so there's no need to keep track of running tasks
+changed: ctrl point now issue a search at least on localhost if no interfaces were found
+fixed: UPnP devices and ctrl points are now freed when stopped (removed)
+fixed: UPnP devices and ctrl points can be restarted (reused) now
+added: better support for icons
+fixed: EventSubscribers now have their own task and try to reuse the socket (Connection Keep-Alive) when possible
+changed: Service uses NPT_List instead of NPT_Arrays to improve manipulation of state vars
+added: Can now use Connection keep-alive with HTTP/1.0 clients
+added: State variables can now be moderated. Service has a task that monitors if vars have changed and send updates if it's time (according to moderation)
+added: Service now supports the "LastChange" state variable
+changed: PLT_SsdpInitMulticastIterator joins group on any interface
+fixed: possible lock when stopping all tasks (lock, notify tasks to stop, unlock then wait for list to be empty)
+added: some dlna support
+changed: moved File Media server from PLT_MediaServer to PLT_FileMediaServer
+added: placeholder for Search in PLT_MediaServer
+changed: removed MediaRenderer and MediaServer projects, now all is in Platinum project
+changed: moved MediaConnect source in Source/Devices
+fixed: build to not include ../ in path.. hopefully fixing gcc 3.3.5 errors
+added: MediaServer now sets variable rate
+fixed: bug where subscribers were deleted all the time after first notification
+fixed: eventing of moderated state variable changes
+fixed: temporary hack for XBMC support of Xbox360, we urlencoded the ? to that the 360 doesn't strip out the query and then the query ends being parsed as part of the path
+changed: didl now forces an empty upnp:artist
+added: Search action to look for ContainerID instead of ObjectId in xml since that's what the xbox 360 sends!
+changed: refactored to use NPT_HttpRequestContext instead of NPT_SocketInfo
+added: new macosx target (universal)
+fixed: use of NPT_CONFIG_THREAD_STACK_SIZE for xbox
+added: can now reset the connector of a NPT_HttpClient
+changed: Updates missing headers only if they're really missing (user_agent, connection, ..)
+changed: Updated NPT_MessageQueue to reflect new blocking way
+changed: Neptune Http server now uses reuse_address when binding
+fixed: single quote in urls
+changed: now can abort NPT_HttpServer
+fixed: If a request is forwarded, don't try to send the body if there's no content length...
+fixed: UPnP Renderer now receives moderated events properly
+fixed: Platinum scons Build, added MediaConnect target
+improved: HttpClientSocketTask now uses keep-alive so if the server is 1.1 or 1.0 with Connection: Keep-alive, it reuses the socket, useful for eventing
+added: Split up MediaConnect support and services into separate class, now CUPnPServer derives from PLT_MediaConnect.
+refactored: move httpserver in start/stop so that it actually stops and cleans up when the device is stopped
+fixed: now starts a thread only when there's a need to event state variable changes to subscribers instead of in the ctor. Useful since the class is also used by ctrl points and they don't need to notify.
+fixed: check that the body stream of a request is rewindable before trying to send a request on a keep-alive socket. If it fails, we wouldn't be able to resend it, so instead, we close the socket and reopen a new one.
+added: new downloader class
+fixed: potential deadlock when stopping upnp while devices are running
+changed: made file server port public in PLT_FileMediaServer so that we can update/query it without recreating a new class (no need for setter/getter)
+
+Platinum 0.3.8
+---------------
+
+fixed: crash in MicroMediaController (ctrlpoint really) when devices go away and a new one reappear. The control point was not removing subscribers from its list for the removed device.
+added: Visual Studio 2005 project files
+changed: switched to using new Neptune Logging system
+changed: PLT_DeviceHost now appends the ip address to friendly name if asked
+
+Platinum 0.3.7
+---------------
+changed: removed projects in the works from solution
+changed: dont restrict an interface to have the MULTICAST flag to send multicast data. If it's not multicast, it just won't send it. Cygwin doesn't report MULTICAST flag properly on interfaces that are multicast so that's why.
+fixed: clear SyncMediaBrowser cache for a device when it disappears
+changed: put back interface matching in proxy using netmask
+fixed: linux build
+fixed: workaround Windows Media Player bug that replaces back slashes to forward slashes in a url query !
+fixed: duplicate headers in crawler response
+changed: fileserver now defaults to serving root "/" with all children so that crawler can use /foo.wma
+changed: made ProcessFileRequest overridable for Crawler
+changed: Mega update:
+ - revamped to use http handlers from Neptune
+ - extensive switch to using address instead of pointers for NPT_HttpRequest & NPT_HttpResponse
+ - using eventhandlers now in devicehost (static for desc & scpds + dynamic for control/event) and controlpoint (event notifications)
+ - fixed host advertising twice byebye on exit
+ - Moved DeviceHost and Ctrlpoint Start/Stop into protected. It's PLT_UPnP now that starts and stop a device (via Add/Remove..)
+ - Created templated PLT_HttpRequestHandler
+fixed: 10 secs to get a M-SEARCH response is fine
+fixed: make it possible to pass an address to send the response back from a search, this is necessary when the udp.connect didn't actually find out which local interface to use
+fixed: now advertises on all interfaces even in broadcast
+fixed: setting MX to 1 in proxy, setting extra header to make sure we don't loop more
+changed: new ssdp proxy using broadcast instead of unicast, no need to keep track of unicasters anymore
+changed: when using broadcast mode, try to use interface broadcast address instead of 255.255.255.255
+changed: made presentation url public (so it can be overridden from the outside)
+hacked: device icons
+changed: better advertising in broadcast mode (less verbose)
+fixed: crash when a device disappears while trying to unsubscribe
+fixed: subscribers being added twice
+fixed: no need to set random seed in task, must be done in threads instead (using thread id)
+changed: added a media cache to cache data responses from servers to speed up
+fixed: better event support (fixed a couple of bugs), unsubscribe on device remove, still need to implement subscription renewal
+changed: improved NPT_Directory to read size & type with 1 call
+fixed: assuming forward unix style delimiters in resource urls was wrong, we want to keep whatever we're passed, it may matter
+changed: now can specify to keep file extension in item title
+changed: can now put a list of UUIDs to ignore in a ctrl point
+changed: now sends a search on localhost if no valid interfaces were found
+changed: now supports broadcast announcements for devices (mainly used by XBOX)
+fixed: changed callbackurls list to be NPT_List instead of NPT_List for event subscribers to fix a weird crash
+fixed: SsdpListenTask takes a true UdpSocket if broadcast mode set
+changed: adding support of NPT_StringFinder for NPT_List containers
+changed: using a HttpUrl for base urls instead of string
+changed: StreamHandler interface, now passing socket info to ModifyResource
+
+Platinum 0.3.6
+---------------
+- fixed list of devices not being cleared when ctrl point is stopped
+- fixed setting bad content length when serving a file with a byte-range request causing
+- filemediaserver now exposes one resource per network interface and put the proper one first (one the browse request was received on)
+- start listening for ssdp when upnp starts and stops when it stops
+- reversing back adding the Search method to ContentDirectory service
+- rewrite of action processing after finding a major flaw due to parallel processing of multiple calls to the same action. Now each invocation of an action gets its own sets of arguments (in and out).
+
+Platinum 0.3.5
+---------------
+Fixes/Changes:
+- updated directory structure so that everything falls under Build/Targets (even scons based stuff)
+- Fixing ip address being 0.0.0.0 in media resources under cygwin in some cases
+- switching to using HTTP/1.0 for http responses
+- scons build output to Targets top level folder now
+- fixed bug where files with no extensions were not advertised (linux)
+- now strips the executables in Targets folder only in release build
+- Fixed cygwin bug where devices wouldn't be detected when started after a Control Point. Was advertising on disconnected interfaces.
+- Fixed logging wrong ip address, now defaults to 127.0.0.1 if no valid one found
+- fixed bug in server socket task
+- added back HttpClientTests to solution
+- fixed bug in client socket task
+- switch to using NPT_StringOutputStream instead of PLT_OutputStringStream
+- improved PLT_Downloader
+- started working on a SQLite abstraction layer for a better Media Server (work in progress)
+
+Platinum 0.3.2
+---------------
+Fixes/Changes:
+- Tasks and TaskManager rewrote. No more housekeeping thread to cleanup tasks. Tasks are automatically cleaned up when done.
+- Stopping a ControlPoint will also stop the SSDP search tasks.
+- HttpServer can limit the number of connections (threads) it can handle at once.
+- Didl processing rewrote. Didl objects are more C++ oriented now.
+- Some progress in regards to DLNA validation. HTTP Server is 1.0 only (connections are closed immediately once all data has been sent. No more keep-alive support).
+- Started working on Ozone (Sqlite3 abstraction layer)
+
+Platinum 0.3.1
+---------------
+Fixes/Changes:
+- Fixed LightSample Test
+- Fixed MediaRenderer Test
+- Removed old source and project files to avoid confusion
+
+Platinum 0.3.00
+---------------
+Fixes/Changes:
+- Added MacOSX support.
+- Fixed socket abortion problem on Linux (using a pipe).
+- Complete rewrite to use threads instead of interrupt driven round-robin. The benefit is that throughput is now greatly improved (for streaming especially).
+- Addded a new App: MediaCrawler
+- Split up AV MediaServer code. Now the FileMediaServer is one implementation of the AV MediaServer. More to follow.
+- Added README, CHANGELOG, LICENSE files
+
+Known issues:
+- AV MediaServer Search not implemented yet.
+- Http server does not use a thread pool. This can be a problem with hungry ControlPoints like the Intel Tools AV MediaController.
+
+Platinum 0.2.00
+---------------
+Fixes/Changes:
+- Added support for Linux, Xbox, cygwin platforms (using Scons http://scons.org)
+- Now using timeouts on sockets. Fixed search not being repeatly sent.
+- Moved Neptune under ThirdParty folder
+
+Known issues:
+- Aborting on some platforms (linux/xbox) is not immediate. Sockets cannot be easily aborted by simply calling closesocket.
+
+Platinum 0.1.00
+---------------
+Initial Release
\ No newline at end of file
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/LICENSE.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/LICENSE.txt Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,372 @@
+Platinum UPnP SDK
+-----------------
+This software is provided under the following license:
+
+Plutinosoft, LLC provides its Platinum UPnP SDK under a dual
+license model designed to meet the development and distribution
+needs of both commercial distributors (such as OEMs, ISVs and VARs)
+and open source projects.
+
+For OEMs, ISVs, VARs and Other Distributors of Commercial Applications:
+OEMs, ISVs, VARs and other distributors that combine and distribute
+commercially licensed software with Platinum software and do not wish
+to distribute the source code for the commercially licensed software
+under version 2, or (at your option) any later version, of the GNU
+General Public License (the "GPL") must enter into a commercial
+license agreement with Plutinosoft, LLC.
+
+For developers of Free Open Source Software ("FOSS") applications
+under the GPL that want to combine and distribute those FOSS
+applications with Platinum software, Plutinosoft's Platinum
+open source software licensed under the GPL version 2, or (at your option)
+any later version, is the best option.
+
+Note that Platinum SDK links with Neptune C++ Runtime
+(http://sourceforge.net/projects/neptune), which is licensed under the
+terms of the BSD license. This license is compatible with the GNU GPL.
+
+Platinum is copyrighted by Plutinosoft, LLC.
+http://www.plutinosoft.com
+
+-------------------------------------------------------------------------
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
+
+-------------------------------------------------------------------------
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/README.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/README.txt Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,74 @@
+Platinum UPnP SDK
+=================
+
+This toolkit consists of 2 modules:
+* Neptune : a C++ Runtime Library
+* Platinum: a modular UPnP Framework [Platinum uses Neptune]
+
+Unless you intend to use Neptune independently from Platinum, it is recommended that you build binaries directly from the "Build" tree of Platinum. All the dependent binaries will be rebuilt automatically (including Neptune).
+
+---------------------------------------------
+BUILDING SDK & SAMPLE APPLICATIONS
+
+* Windows:
+Open the Visual Studio 2005 solution located @ Build\Targets\x86-microsoft-win32-vs2005\Platinum.sln
+Open the Visual Studio 2008 solution located @ Build\Targets\x86-microsoft-win32-vs2008\Platinum.sln
+
+* XBox:
+Open the Visual Studio .NET 2003 solution located @ Build\Targets\x86-microsoft-xbox-vs2003\Platinum.sln
+
+* MacOSX:
+Open the XCode project file located @ Build\Targets\universal-apple-macosx\PlatinumApps.xcodeproj
+To include Platinum to your XCode projects, simply add the project file located @ Build\Targets\universal-apple-macosx\Platinum.xcodeproj.
+
+* Linux, Cygwin, MacOSX
+Open a shell, go to the Platinum root directory and type 'scons' (http://scons.org).
+The output of the scons build will be found under Platinum/Build/Targets/{TARGET}/{Debug|Release}.
+Additionally, the output is copied under Platinum/Targets/{TARGET}/{Debug|Release} for convenience.
+
+---------------------------------------------
+RUNNING SAMPLE APPLICATIONS
+
+* FileMediaServerTest
+This is an example of a UPnP MediaServer. Given a path, it allows a UPnP ControlPoint to browse the content of the directory and its sub-directories. Additionally, files can be streamed (Note that only files with known mimetypes are advertised).
+
+usage: FileMediaServerTest [-f ]
+ -f : optional upnp server friendly name
+ : local path to serve
+
+Once started, type 'q' to quit.
+
+* MediaRendererTest
+This is an example shell of a UPnP MediaRenderer. It is to be contolled by a UPnP ControlPoint. This is just a SHELL, this won't play anything. You need to hook up the playback functionality yourself.
+
+usage: MediaRendererTest [-f ]
+ -f : optional upnp server friendly name
+
+Once started, type 'q' to quit.
+
+* MediaCrawler
+This is a combo UPnP MediaServer + ControlPoint. It browses content from other MediaServers it finds on the network and present them under one single aggregated view. This is useful for some devices that need to select one single MediaServer at boot time (i.e. Roku).
+
+Once started, type 'q' to quit.
+
+* MicroMediaController
+This is a ControlPoint (synchronous) that lets you browse any MediaServer using a shell-like interface. Once started, a command prompt lets you enter commands such as:
+ quit - shutdown
+ exit - same as quit
+ setms - select a media server to become the active media server
+ getms - print the friendly name of the active media server
+ ls - list the contents of the current directory on the active
+ media server
+ cd - traverse down one level in the content tree on the active
+ media server
+ cd .. - traverse up one level in the content tree on the active
+ media server
+ pwd - print the path from the root to your current position in the
+ content tree on the active media server
+
+Experimental MediaRenderer commands (not yet full implemented):
+ setmr - select a media renderer to become the active media renderer
+ getmr - print the friendly name of the active media renderer
+ open - set the uri on the active media renderer
+ play - play the active uri on the active media renderer
+ stop - stop the active uri on the active media renderer
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/Platinum.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/Platinum.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,33 @@
+/*****************************************************************
+|
+| Platinum
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/Platinum.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/Platinum.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,52 @@
+/*****************************************************************
+|
+| Platinum - Top Level Include
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+ ****************************************************************/
+
+#ifndef _PLATINUM_H_
+#define _PLATINUM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltCtrlPoint.h"
+#include "PltDeviceData.h"
+#include "PltHttpServer.h"
+
+#ifdef PLT_DEVICE_HEADERS_INCLUDE
+#include "PltMediaServer.h"
+#include "PltMediaBrowser.h"
+#include "PltMediaRenderer.h"
+#include "PltMediaController.h"
+#endif
+
+#endif /* _PLATINUM_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltAction.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltAction.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,464 @@
+/*****************************************************************
+|
+| Platinum - Service Action
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltAction.h"
+#include "PltService.h"
+#include "PltXmlHelper.h"
+
+#define REMOVE_WMP_DATATYPE_EXTENSION
+
+NPT_SET_LOCAL_LOGGER("platinum.core.action")
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::PLT_ActionDesc
++---------------------------------------------------------------------*/
+PLT_ActionDesc::PLT_ActionDesc(const char* name, PLT_Service* service) :
+ m_Name(name),
+ m_Service(service)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::~PLT_ActionDesc
++---------------------------------------------------------------------*/
+PLT_ActionDesc::~PLT_ActionDesc()
+{
+ m_ArgumentDescs.Apply(NPT_ObjectDeleter());
+}
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::GetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ActionDesc::GetSCPDXML(NPT_XmlElementNode* node)
+{
+ NPT_XmlElementNode* action = new NPT_XmlElementNode("action");
+ NPT_CHECK_SEVERE(node->AddChild(action));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(action, "name", m_Name));
+
+ NPT_XmlElementNode* argumentList = new NPT_XmlElementNode("argumentList");
+ NPT_CHECK_SEVERE(action->AddChild(argumentList));
+
+ // no arguments is ok
+ if (!m_ArgumentDescs.GetItemCount()) return NPT_SUCCESS;
+
+ return m_ArgumentDescs.ApplyUntil(
+ PLT_GetSCPDXMLIterator(argumentList),
+ NPT_UntilResultNotEquals(NPT_SUCCESS));
+}
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::GetService
++---------------------------------------------------------------------*/
+PLT_Service*
+PLT_ActionDesc::GetService()
+{
+ return m_Service;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc::GetArgumentDesc
++---------------------------------------------------------------------*/
+PLT_ArgumentDesc*
+PLT_ActionDesc::GetArgumentDesc(const char* name)
+{
+ PLT_ArgumentDesc* arg_desc = NULL;
+ NPT_ContainerFind(m_ArgumentDescs, PLT_ArgumentDescNameFinder(name), arg_desc);
+ return arg_desc;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::PLT_Action
++---------------------------------------------------------------------*/
+PLT_Action::PLT_Action(PLT_ActionDesc* action_desc) :
+ m_ActionDesc(action_desc),
+ m_ErrorCode(0)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::~PLT_Action
++---------------------------------------------------------------------*/
+PLT_Action::~PLT_Action()
+{
+ m_Arguments.Apply(NPT_ObjectDeleter());
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::GetArgumentValue(const char* name, NPT_String& value)
+{
+ PLT_Argument* arg = GetArgument(name);
+ if (arg == NULL) {
+ return NPT_FAILURE;
+ }
+ value = arg->GetValue();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::GetArgumentValue(const char* name, NPT_UInt32& value)
+{
+ NPT_String tmp_value;
+ NPT_CHECK_WARNING(GetArgumentValue(name, tmp_value));
+ return tmp_value.ToInteger(value);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::GetArgumentValue(const char* name, NPT_Int32& value)
+{
+ NPT_String tmp_value;
+ NPT_CHECK_WARNING(GetArgumentValue(name, tmp_value));
+ return tmp_value.ToInteger(value);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetArgument
++---------------------------------------------------------------------*/
+PLT_Argument*
+PLT_Action::GetArgument(const char* name)
+{
+ PLT_Argument* argument = NULL;
+ NPT_ContainerFind(m_Arguments, PLT_ArgumentNameFinder(name), argument);
+ return argument;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetArgumentValue(const char* name,
+ const char* value)
+{
+ PLT_Argument* arg = NULL;
+
+ // look for this argument in our argument list
+ // and replace the value if we found it
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Arguments, PLT_ArgumentNameFinder(name), arg))) {
+ return arg->SetValue(value);
+ }
+
+ // since we didn't find it, create a clone
+ // from the action arguments
+ PLT_ArgumentDesc* arg_desc = m_ActionDesc->GetArgumentDesc(name);
+ if (arg_desc == NULL) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+ arg = new PLT_Argument(arg_desc);
+
+ NPT_Result res = arg->SetValue(value);
+ if (NPT_FAILED(res)) {
+ delete arg;
+ return res;
+ }
+
+ m_Arguments.Add(arg);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::VerifyArgumentValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::VerifyArgumentValue(const char* name, const char* value)
+{
+ NPT_String str;
+ NPT_CHECK_SEVERE(GetArgumentValue(name, str));
+
+ return str.Compare(value, true)?NPT_FAILURE:NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::VerifyArguments
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::VerifyArguments(bool input)
+{
+ NPT_Cardinal count = 0;
+
+ // Check we have all the required parameters (in or out)
+ for(unsigned int i=0; iGetArgumentDescs().GetItemCount(); i++) {
+ PLT_ArgumentDesc* arg_desc = m_ActionDesc->GetArgumentDescs()[i];
+
+ // only input arguments are needed
+ if (arg_desc->GetDirection().Compare(input?"in":"out", true))
+ continue;
+
+ // look for this argument in the list we received
+ PLT_Argument* arg = NULL;
+ if (NPT_FAILED(NPT_ContainerFind(m_Arguments, PLT_ArgumentNameFinder(arg_desc->GetName()), arg))) {
+ return NPT_FAILURE;
+ }
+ ++count;
+ }
+
+ SetError(0, "");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetArgumentOutFromStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetArgumentOutFromStateVariable(PLT_ArgumentDesc* arg_desc)
+{
+ // only output arguments can use a state variable
+ if (arg_desc->GetDirection().Compare("out", true)) {
+ return NPT_FAILURE;
+ }
+
+ PLT_StateVariable* variable = arg_desc->GetRelatedStateVariable();
+ if (!variable) return NPT_FAILURE;
+
+ // assign the value to an argument
+ NPT_CHECK_SEVERE(SetArgumentValue(arg_desc->GetName(), variable->GetValue()));
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetArgumentOutFromStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetArgumentOutFromStateVariable(const char* name)
+{
+ // look for this argument in the action list of arguments
+ PLT_ArgumentDesc* arg_desc = NULL;
+ NPT_CHECK_SEVERE(NPT_ContainerFind(m_ActionDesc->GetArgumentDescs(),
+ PLT_ArgumentDescNameFinder(name), arg_desc));
+
+ return SetArgumentOutFromStateVariable(arg_desc);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetArgumentsOutFromStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetArgumentsOutFromStateVariable()
+{
+ // go through the list of the action output arguments
+ for(unsigned int i=0; iGetArgumentDescs().GetItemCount(); i++) {
+ PLT_ArgumentDesc* arg_desc = m_ActionDesc->GetArgumentDescs()[i];
+
+ // only output arguments are needed
+ if (arg_desc->GetDirection().Compare("out", true))
+ continue;
+
+ NPT_CHECK_SEVERE(SetArgumentOutFromStateVariable(arg_desc));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::SetError
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::SetError(unsigned int code, const char* description)
+{
+ m_ErrorCode = code;
+ m_ErrorDescription = description;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetError
++---------------------------------------------------------------------*/
+const char*
+PLT_Action::GetError(unsigned int& code)
+{
+ code = m_ErrorCode;
+ return m_ErrorDescription;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::GetErrorCode
++---------------------------------------------------------------------*/
+unsigned int
+PLT_Action::GetErrorCode()
+{
+ return m_ErrorCode;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::FormatSoapRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::FormatSoapRequest(NPT_OutputStream& stream)
+{
+ NPT_String str;
+ NPT_Result res;
+ NPT_XmlElementNode* body = NULL;
+ NPT_XmlElementNode* request = NULL;
+ NPT_XmlElementNode* envelope = new NPT_XmlElementNode("s", "Envelope");
+
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetNamespaceUri("s", "http://schemas.xmlsoap.org/soap/envelope/"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetAttribute("s", "encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/"), cleanup);
+
+ body = new NPT_XmlElementNode("s", "Body");
+ NPT_CHECK_LABEL_SEVERE(res = envelope->AddChild(body), cleanup);
+
+ request = new NPT_XmlElementNode("u", m_ActionDesc->GetName());
+ NPT_CHECK_LABEL_SEVERE(res = request->SetNamespaceUri("u", m_ActionDesc->GetService()->GetServiceType()), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = body->AddChild(request), cleanup);
+
+ for(unsigned int i=0; iGetDesc()->GetDirection().Compare("in", true) == 0) {
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(
+ request,
+ argument->GetDesc()->GetName(),
+ argument->GetValue()), cleanup);
+ }
+ }
+
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::Serialize(*envelope, str), cleanup);
+ delete envelope;
+
+ return stream.Write((const char*)str, str.GetLength());
+
+cleanup:
+ delete envelope;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::FormatSoapResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::FormatSoapResponse(NPT_OutputStream& stream)
+{
+ if (m_ErrorCode) {
+ return FormatSoapError(m_ErrorCode, m_ErrorDescription, stream);
+ }
+
+ NPT_String str;
+ NPT_Result res;
+ NPT_XmlElementNode* body = NULL;
+ NPT_XmlElementNode* response = NULL;
+ NPT_XmlElementNode* node = NULL;
+ NPT_XmlElementNode* envelope = new NPT_XmlElementNode("s", "Envelope");
+
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetNamespaceUri("s", "http://schemas.xmlsoap.org/soap/envelope/"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetAttribute("s", "encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/"), cleanup);
+
+ body = new NPT_XmlElementNode("s", "Body");
+ NPT_CHECK_LABEL_SEVERE(res = envelope->AddChild(body), cleanup);
+
+ response = new NPT_XmlElementNode("u", m_ActionDesc->GetName() + "Response");
+ NPT_CHECK_LABEL_SEVERE(response->SetNamespaceUri("u", m_ActionDesc->GetService()->GetServiceType()), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = body->AddChild(response), cleanup);
+
+ for(unsigned int i=0; iGetDesc()->GetDirection().Compare("out", true) == 0) {
+ node = new NPT_XmlElementNode(argument->GetDesc()->GetName());
+ NPT_CHECK_LABEL_SEVERE(res = node->AddText(argument->GetValue()), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = response->AddChild(node), cleanup);
+
+#ifndef REMOVE_WMP_DATATYPE_EXTENSION
+ PLT_StateVariable* var = argument->GetDesc()->GetRelatedStateVariable();
+ if (var) {
+ node->SetNamespaceUri("dt", "urn:schemas-microsoft-com:datatypes");
+ node->SetAttribute("dt", "dt", var->GetDataType());
+ }
+#endif
+ }
+ }
+
+ // this will xmlescape any values that contain xml characters
+ NPT_CHECK_LABEL_SEVERE(PLT_XmlHelper::Serialize(*envelope, str), cleanup);
+ delete envelope;
+
+ return stream.Write((const char*)str, str.GetLength());
+
+cleanup:
+ delete envelope;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Action::FormatSoapError
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Action::FormatSoapError(unsigned int code, NPT_String desc, NPT_OutputStream& stream)
+{
+ NPT_String str;
+ NPT_Result res;
+ NPT_XmlElementNode* body = NULL;
+ NPT_XmlElementNode* fault = NULL;
+ NPT_XmlElementNode* detail = NULL;
+ NPT_XmlElementNode* UPnPError = NULL;
+ NPT_XmlElementNode* envelope = new NPT_XmlElementNode("s", "Envelope");
+
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetNamespaceUri("s", "http://schemas.xmlsoap.org/soap/envelope/"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = envelope->SetAttribute("s", "encodingStyle", "http://schemas.xmlsoap.org/soap/encoding/"), cleanup);
+
+ body = new NPT_XmlElementNode("s", "Body");
+ NPT_CHECK_LABEL_SEVERE(res = envelope->AddChild(body), cleanup);
+
+ fault = new NPT_XmlElementNode("s", "Fault");
+ NPT_CHECK_LABEL_SEVERE(res = body->AddChild(fault), cleanup);
+
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(fault, "faultCode", "s:Client"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(fault, "faultString", "UPnPError"), cleanup);
+
+ detail = new NPT_XmlElementNode("detail");
+ NPT_CHECK_LABEL_SEVERE(res = fault->AddChild(detail), cleanup);
+
+ UPnPError = new NPT_XmlElementNode("UPnPError");
+ NPT_CHECK_LABEL_SEVERE(res = UPnPError->SetNamespaceUri("", "urn:schemas-upnp-org:control-1-0"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = detail->AddChild(UPnPError), cleanup);
+
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(UPnPError, "errorCode", NPT_String::FromInteger(code)), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(UPnPError, "errorDescription", desc), cleanup);
+
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::Serialize(*envelope, str), cleanup);
+ delete envelope;
+
+ return stream.Write((const char*)str, str.GetLength());
+
+cleanup:
+ delete envelope;
+ return res;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltAction.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltAction.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,157 @@
+/*****************************************************************
+|
+| Platinum - Service Action
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_ACTION_H_
+#define _PLT_ACTION_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltArgument.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Service;
+
+/*----------------------------------------------------------------------
+| PLT_ActionDesc
++---------------------------------------------------------------------*/
+class PLT_ActionDesc
+{
+public:
+ PLT_ActionDesc(const char* name, PLT_Service* service);
+ ~PLT_ActionDesc();
+
+ NPT_Array& GetArgumentDescs() {
+ return m_ArgumentDescs;
+ }
+
+ const NPT_String& GetName() const { return m_Name;}
+ PLT_ArgumentDesc* GetArgumentDesc(const char* name);
+ NPT_Result GetSCPDXML(NPT_XmlElementNode* node);
+ PLT_Service* GetService();
+
+protected:
+ //members
+ NPT_String m_Name;
+ PLT_Service* m_Service;
+ NPT_Array m_ArgumentDescs;
+};
+
+/*----------------------------------------------------------------------
+| PLT_Action
++---------------------------------------------------------------------*/
+class PLT_Action
+{
+public:
+ PLT_Action(PLT_ActionDesc* action_desc);
+ ~PLT_Action();
+
+ PLT_ActionDesc* GetActionDesc() { return m_ActionDesc; }
+
+ NPT_Result GetArgumentValue(const char* name, NPT_String& value);
+ NPT_Result GetArgumentValue(const char* name, NPT_UInt32& value);
+ NPT_Result GetArgumentValue(const char* name, NPT_Int32& value);
+ NPT_Result VerifyArgumentValue(const char* name, const char* value);
+ NPT_Result VerifyArguments(bool input);
+ NPT_Result SetArgumentOutFromStateVariable(const char* name);
+ NPT_Result SetArgumentsOutFromStateVariable();
+ NPT_Result SetArgumentValue(const char* name, const char* value);
+
+ NPT_Result SetError(unsigned int code, const char* description);
+ const char* GetError(unsigned int& code);
+ unsigned int GetErrorCode();
+
+ NPT_Result FormatSoapRequest(NPT_OutputStream& stream);
+ NPT_Result FormatSoapResponse(NPT_OutputStream& stream);
+
+ static NPT_Result FormatSoapError(unsigned int code,
+ NPT_String desc,
+ NPT_OutputStream& stream);
+
+private:
+ NPT_Result SetArgumentOutFromStateVariable(PLT_ArgumentDesc* arg_desc);
+ PLT_Argument* GetArgument(const char* name);
+
+protected:
+ // members
+ PLT_ActionDesc* m_ActionDesc;
+ PLT_Arguments m_Arguments;
+ unsigned int m_ErrorCode;
+ NPT_String m_ErrorDescription;
+};
+
+typedef NPT_Reference PLT_ActionReference;
+
+/*----------------------------------------------------------------------
+| PLT_GetSCPDXMLIterator
++---------------------------------------------------------------------*/
+template
+class PLT_GetSCPDXMLIterator
+{
+public:
+ PLT_GetSCPDXMLIterator(NPT_XmlElementNode* node) :
+ m_Node(node) {}
+
+ NPT_Result operator()(T* const & data) const {
+ return data->GetSCPDXML(m_Node);
+ }
+
+private:
+ NPT_XmlElementNode* m_Node;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ActionDescNameFinder
++---------------------------------------------------------------------*/
+class PLT_ActionDescNameFinder
+{
+public:
+ // methods
+ PLT_ActionDescNameFinder(PLT_Service* service, const char* name) :
+ m_Service(service), m_Name(name) {}
+ virtual ~PLT_ActionDescNameFinder() {}
+
+ bool operator()(const PLT_ActionDesc* const & action_desc) const {
+ return action_desc->GetName().Compare(m_Name, true) ? false : true;
+ }
+
+private:
+ // members
+ PLT_Service* m_Service;
+ NPT_String m_Name;
+};
+
+#endif /* _PLT_ACTION_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltArgument.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltArgument.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,142 @@
+/*****************************************************************
+|
+| Platinum - Action Argument
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltArgument.h"
+#include "PltStateVariable.h"
+#include "PltXmlHelper.h"
+#include "PltAction.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.argument")
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentDesc::PLT_ArgumentDesc
++---------------------------------------------------------------------*/
+PLT_ArgumentDesc::PLT_ArgumentDesc(const char* name,
+ const char* dir,
+ PLT_StateVariable* variable,
+ bool has_ret) :
+ m_Name(name),
+ m_Direction(dir),
+ m_RelatedStateVariable(variable),
+ m_HasReturnValue(has_ret)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentDesc::GetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ArgumentDesc::GetSCPDXML(NPT_XmlElementNode* node)
+{
+ NPT_XmlElementNode* argument = new NPT_XmlElementNode("argument");
+ NPT_CHECK_SEVERE(node->AddChild(argument));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(argument, "name", m_Name));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(argument, "direction", m_Direction));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(argument, "relatedStateVariable", m_RelatedStateVariable->GetName()));
+
+ if (m_HasReturnValue) {
+ NPT_CHECK_SEVERE(argument->AddChild(new NPT_XmlElementNode("retval")));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::CreateArgument
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Argument::CreateArgument(PLT_ActionDesc* action_desc,
+ const char* name,
+ const char* value,
+ PLT_Argument*& arg)
+{
+ // reset output params first
+ arg = NULL;
+
+ PLT_ArgumentDesc* arg_desc = action_desc->GetArgumentDesc(name);
+ if (!arg_desc) return NPT_ERROR_INVALID_PARAMETERS;
+
+ PLT_Argument* new_arg = new PLT_Argument(arg_desc);
+ if (NPT_FAILED(new_arg->SetValue(value))) {
+ delete new_arg;
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ arg = new_arg;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::PLT_Argument
++---------------------------------------------------------------------*/
+PLT_Argument::PLT_Argument(PLT_ArgumentDesc* arg_desc) :
+ m_ArgDesc(arg_desc)
+{
+
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::SetValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Argument::SetValue(const char* value)
+{
+ NPT_CHECK_SEVERE(ValidateValue(value));
+
+ m_Value = value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::GetValue
++---------------------------------------------------------------------*/
+const NPT_String&
+PLT_Argument::GetValue()
+{
+ return m_Value;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Argument::ValidateValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Argument::ValidateValue(const char* value)
+{
+ if (m_ArgDesc->GetRelatedStateVariable()) {
+ return m_ArgDesc->GetRelatedStateVariable()->ValidateValue(value);
+ }
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltArgument.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltArgument.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,138 @@
+/*****************************************************************
+|
+| Platinum - Action Argument
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_ARGUMENT_H_
+#define _PLT_ARGUMENT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_StateVariable;
+class PLT_Argument;
+class PLT_ActionDesc;
+typedef NPT_Array PLT_Arguments;
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentDesc
++---------------------------------------------------------------------*/
+class PLT_ArgumentDesc
+{
+public:
+ PLT_ArgumentDesc(const char* name,
+ const char* dir = "in",
+ PLT_StateVariable* variable = NULL,
+ bool has_ret = false);
+
+ // accessor methods
+ NPT_Result GetSCPDXML(NPT_XmlElementNode* node);
+ const NPT_String& GetName() const {return m_Name;}
+ const NPT_String& GetDirection() const {return m_Direction;}
+ PLT_StateVariable* GetRelatedStateVariable() {return m_RelatedStateVariable;}
+ bool HasRetValue() {return m_HasReturnValue;}
+
+protected:
+ NPT_String m_Name;
+ NPT_String m_Direction;
+ PLT_StateVariable* m_RelatedStateVariable;
+ bool m_HasReturnValue;
+};
+
+/*----------------------------------------------------------------------
+| PLT_Argument
++---------------------------------------------------------------------*/
+class PLT_Argument
+{
+public:
+ PLT_Argument(PLT_ArgumentDesc* arg_desc);
+
+ // class methods
+ static NPT_Result CreateArgument(PLT_ActionDesc* action_desc,
+ const char* arg_name,
+ const char* arg_value,
+ PLT_Argument*& arg);
+
+ // accessor methods
+ PLT_ArgumentDesc* GetDesc() { return m_ArgDesc; }
+ NPT_Result SetValue(const char* value);
+ const NPT_String& GetValue();
+
+private:
+ NPT_Result ValidateValue(const char* value);
+
+protected:
+ PLT_ArgumentDesc* m_ArgDesc;
+ NPT_String m_Value;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentNameFinder
++---------------------------------------------------------------------*/
+class PLT_ArgumentNameFinder
+{
+public:
+ // methods
+ PLT_ArgumentNameFinder(const char* name) : m_Name(name) {}
+
+ bool operator()(PLT_Argument* const & argument) const {
+ return argument->GetDesc()->GetName().Compare(m_Name, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Name;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ArgumentDescNameFinder
++---------------------------------------------------------------------*/
+class PLT_ArgumentDescNameFinder
+{
+public:
+ // methods
+ PLT_ArgumentDescNameFinder(const char* name) : m_Name(name) {}
+
+ bool operator()(PLT_ArgumentDesc* const & arg_desc) const {
+ return arg_desc->GetName().Compare(m_Name, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Name;
+};
+
+#endif /* _PLT_ARGUMENT_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltCtrlPoint.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltCtrlPoint.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,1396 @@
+/*****************************************************************
+|
+| Platinum - Control Point
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltCtrlPoint.h"
+#include "PltUPnP.h"
+#include "PltDeviceData.h"
+#include "PltXmlHelper.h"
+#include "PltCtrlPointTask.h"
+#include "PltSsdp.h"
+#include "PltHttpServer.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.ctrlpoint")
+
+/*----------------------------------------------------------------------
+| typedef
++---------------------------------------------------------------------*/
+typedef PLT_HttpRequestHandler PLT_HttpCtrlPointRequestHandler;
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListenerOnDeviceAddedIterator class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointListenerOnDeviceAddedIterator
+{
+public:
+ PLT_CtrlPointListenerOnDeviceAddedIterator(PLT_DeviceDataReference& device) :
+ m_Device(device) {}
+
+ NPT_Result operator()(PLT_CtrlPointListener*& listener) const {
+ return listener->OnDeviceAdded(m_Device);
+ }
+
+private:
+ PLT_DeviceDataReference& m_Device;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListenerOnDeviceRemovedIterator class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointListenerOnDeviceRemovedIterator
+{
+public:
+ PLT_CtrlPointListenerOnDeviceRemovedIterator(PLT_DeviceDataReference& device) :
+ m_Device(device) {}
+
+ NPT_Result operator()(PLT_CtrlPointListener*& listener) const {
+ return listener->OnDeviceRemoved(m_Device);
+ }
+
+private:
+ PLT_DeviceDataReference& m_Device;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListenerOnActionResponseIterator class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointListenerOnActionResponseIterator
+{
+public:
+ PLT_CtrlPointListenerOnActionResponseIterator(NPT_Result res,
+ PLT_ActionReference& action,
+ void* userdata) :
+ m_Res(res), m_Action(action), m_Userdata(userdata) {}
+
+ NPT_Result operator()(PLT_CtrlPointListener*& listener) const {
+ return listener->OnActionResponse(m_Res, m_Action, m_Userdata);
+ }
+
+private:
+ NPT_Result m_Res;
+ PLT_ActionReference& m_Action;
+ void* m_Userdata;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListenerOnEventNotifyIterator class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointListenerOnEventNotifyIterator
+{
+public:
+ PLT_CtrlPointListenerOnEventNotifyIterator(PLT_Service* service,
+ NPT_List* vars) :
+ m_Service(service), m_Vars(vars) {}
+
+ NPT_Result operator()(PLT_CtrlPointListener*& listener) const {
+ return listener->OnEventNotify(m_Service, m_Vars);
+ }
+
+private:
+ PLT_Service* m_Service;
+ NPT_List* m_Vars;
+};
+
+/*----------------------------------------------------------------------
+| PLT_AddGetSCPDRequestIterator class
++---------------------------------------------------------------------*/
+class PLT_AddGetSCPDRequestIterator
+{
+public:
+ PLT_AddGetSCPDRequestIterator(PLT_TaskManager* task_manager,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_DeviceDataReference& device) :
+ m_TaskManager(task_manager),
+ m_CtrlPoint(ctrl_point),
+ m_Device(device) {}
+
+ NPT_Result operator()(PLT_Service*& service) const {
+ // look for the host and port of the device
+ PLT_DeviceData* device = service->GetDevice();
+ NPT_String scpd_url = service->GetSCPDURL();
+
+ NPT_LOG_INFO_2("Fetching SCPD for service \"%s\" of device \"%s\"",
+ (const char*)service->GetServiceID(),
+ (const char*)device->GetFriendlyName());
+
+ // if the SCPD Url starts with a "/", this means we should not append it to the base URI
+ // but instead go there directly
+ if (!scpd_url.StartsWith("/")) {
+ scpd_url = device->GetURLBase().GetPath() + scpd_url;
+ }
+
+ NPT_HttpUrl url(device->GetURLBase().GetHost(),
+ device->GetURLBase().GetPort(),
+ scpd_url);
+
+ // Add a delay, some devices need it (aka Rhapsody)
+ NPT_TimeInterval delay(0.1f);
+ return m_TaskManager->StartTask(
+ new PLT_CtrlPointGetSCPDTask(url,
+ m_CtrlPoint,
+ (PLT_DeviceDataReference&)m_Device),
+ &delay);
+ }
+
+private:
+ PLT_TaskManager* m_TaskManager;
+ PLT_CtrlPoint* m_CtrlPoint;
+ PLT_DeviceDataReference m_Device;
+};
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberRemoverIterator class
++---------------------------------------------------------------------*/
+class PLT_EventSubscriberRemoverIterator
+{
+public:
+ PLT_EventSubscriberRemoverIterator(PLT_CtrlPoint* ctrl_point) :
+ m_CtrlPoint(ctrl_point) {
+ m_CtrlPoint->m_Subscribers.Lock();
+ }
+ ~PLT_EventSubscriberRemoverIterator() {
+ m_CtrlPoint->m_Subscribers.Unlock();
+ }
+
+ NPT_Result operator()(PLT_Service*& service) const {
+ PLT_EventSubscriber* sub = NULL;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_CtrlPoint->m_Subscribers,
+ PLT_EventSubscriberFinderByService(service), sub))) {
+ m_CtrlPoint->m_Subscribers.Remove(sub);
+ delete sub;
+ }
+
+ return NPT_SUCCESS;
+ }
+
+private:
+ PLT_CtrlPoint* m_CtrlPoint;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceReadyIterator class
++---------------------------------------------------------------------*/
+class PLT_ServiceReadyIterator
+{
+public:
+ PLT_ServiceReadyIterator() {}
+
+ NPT_Result operator()(PLT_Service*& service) const {
+ return service->IsInitted()?NPT_SUCCESS:NPT_FAILURE;
+ }
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceReadyIterator class
++---------------------------------------------------------------------*/
+class PLT_DeviceReadyIterator
+{
+public:
+ PLT_DeviceReadyIterator() {}
+ NPT_Result operator()(PLT_DeviceDataReference& device) const {
+ NPT_CHECK(device->m_Services.ApplyUntil(
+ PLT_ServiceReadyIterator(),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)));
+
+ NPT_CHECK(device->m_EmbeddedDevices.ApplyUntil(
+ PLT_DeviceReadyIterator(),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)));
+
+ // a device must have at least one service or embedded device
+ // otherwise it's not ready
+ if (device->m_Services.GetItemCount() == 0 &&
+ device->m_EmbeddedDevices.GetItemCount() == 0) {
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+ }
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::PLT_CtrlPoint
++---------------------------------------------------------------------*/
+PLT_CtrlPoint::PLT_CtrlPoint(const char* autosearch /* = "upnp:rootdevice" */) :
+ m_EventHttpServer(new PLT_HttpServer()),
+ m_AutoSearch(autosearch)
+{
+ m_EventHttpServerHandler = new PLT_HttpCtrlPointRequestHandler(this);
+ m_EventHttpServer->AddRequestHandler(m_EventHttpServerHandler, "/", true);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::~PLT_CtrlPoint
++---------------------------------------------------------------------*/
+PLT_CtrlPoint::~PLT_CtrlPoint()
+{
+ delete m_EventHttpServer;
+ delete m_EventHttpServerHandler;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::IgnoreUUID
++---------------------------------------------------------------------*/
+void
+PLT_CtrlPoint::IgnoreUUID(const char* uuid)
+{
+ if (!m_UUIDsToIgnore.Find(NPT_StringFinder(uuid))) {
+ m_UUIDsToIgnore.Add(uuid);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Start(PLT_SsdpListenTask* task)
+{
+ m_EventHttpServer->Start();
+
+ // house keeping task
+ m_TaskManager.StartTask(new PLT_CtrlPointHouseKeepingTask(this));
+
+ task->AddListener(this);
+ return m_AutoSearch.GetLength()?Search(NPT_HttpUrl("239.255.255.250", 1900, "*"), m_AutoSearch):NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Stop(PLT_SsdpListenTask* task)
+{
+ task->RemoveListener(this);
+
+ m_TaskManager.StopAllTasks();
+ m_EventHttpServer->Stop();
+
+ // we can safely clear everything without a lock
+ // as there are no more tasks pending
+ m_Devices.Clear();
+
+ m_Subscribers.Apply(NPT_ObjectDeleter());
+ m_Subscribers.Clear();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::AddListener
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::AddListener(PLT_CtrlPointListener* listener)
+{
+ NPT_AutoLock lock(m_ListenerList);
+ if (!m_ListenerList.Contains(listener)) {
+ m_ListenerList.Add(listener);
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::RemoveListener
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::RemoveListener(PLT_CtrlPointListener* listener)
+{
+ NPT_AutoLock lock(m_ListenerList);
+ m_ListenerList.Remove(listener);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::CreateSearchTask
++---------------------------------------------------------------------*/
+PLT_SsdpSearchTask*
+PLT_CtrlPoint::CreateSearchTask(const NPT_HttpUrl& url,
+ const char* target,
+ NPT_Cardinal mx,
+ const NPT_IpAddress& address)
+{
+ // make sure mx is at least 1
+ if (mx<1) mx=1;
+
+ // create socket
+ NPT_UdpMulticastSocket* socket = new NPT_UdpMulticastSocket();
+ socket->SetInterface(address);
+ socket->SetTimeToLive(4);
+
+ // create request
+ NPT_HttpRequest* request = new NPT_HttpRequest(url, "M-SEARCH", NPT_HTTP_PROTOCOL_1_1);
+ PLT_UPnPMessageHelper::SetMX(*request, mx);
+ PLT_UPnPMessageHelper::SetST(*request, target);
+ PLT_UPnPMessageHelper::SetMAN(*request, "\"ssdp:discover\"");
+ request->GetHeaders().SetHeader(NPT_HTTP_HEADER_USER_AGENT, NPT_HttpClient::m_UserAgentHeader);
+
+ // create task
+ PLT_SsdpSearchTask* task = new PLT_SsdpSearchTask(
+ socket,
+ this,
+ request,
+ mx*10000);
+ return task;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Search
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Search(const NPT_HttpUrl& url,
+ const char* target,
+ NPT_Cardinal mx /* = 5 */)
+{
+ NPT_List if_list;
+ NPT_List::Iterator net_if;
+ NPT_List::Iterator net_if_addr;
+
+ NPT_CHECK_SEVERE(PLT_UPnPMessageHelper::GetNetworkInterfaces(if_list));
+
+ for (net_if = if_list.GetFirstItem(); net_if; net_if++) {
+ // make sure the interface is at least broadcast or multicast
+ if (!((*net_if)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_MULTICAST) &&
+ !((*net_if)->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_BROADCAST)) {
+ continue;
+ }
+
+ for (net_if_addr = (*net_if)->GetAddresses().GetFirstItem(); net_if_addr; net_if_addr++) {
+ // create task
+ PLT_SsdpSearchTask* task = CreateSearchTask(url,
+ target,
+ mx,
+ (*net_if_addr).GetPrimaryAddress());
+ m_TaskManager.StartTask(task);
+ }
+ }
+
+// {
+// // create task on 127.0.0.1
+// NPT_IpAddress address;
+// address.ResolveName("127.0.0.1");
+//
+// PLT_ThreadTask* task = CreateSearchTask(url,
+// target,
+// mx,
+// address);
+// m_TaskManager.StartTask(task);
+// }
+
+ if_list.Apply(NPT_ObjectDeleter());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Discover
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Discover(const NPT_HttpUrl& url,
+ const char* target,
+ NPT_Cardinal mx /* = 5 */,
+ NPT_Timeout repeat /* = 50000 */)
+{
+ // make sure mx is at least 1
+ if (mx<1) mx = 1;
+
+ // create socket
+ NPT_UdpSocket* socket = new NPT_UdpSocket();
+
+ // create request
+ NPT_HttpRequest* request = new NPT_HttpRequest(url, "M-SEARCH", NPT_HTTP_PROTOCOL_1_1);
+ PLT_UPnPMessageHelper::SetMX(*request, mx);
+ PLT_UPnPMessageHelper::SetST(*request, target);
+ PLT_UPnPMessageHelper::SetMAN(*request, "\"ssdp:discover\"");
+ request->GetHeaders().SetHeader(NPT_HTTP_HEADER_USER_AGENT, NPT_HttpClient::m_UserAgentHeader);
+
+ // force HOST to be the regular multicast address:port
+ // Some servers do care (like WMC) otherwise they won't respond to us
+ request->GetHeaders().SetHeader(NPT_HTTP_HEADER_HOST, "239.255.255.250:1900");
+
+ // create task
+ PLT_ThreadTask* task = new PLT_SsdpSearchTask(
+ socket,
+ this,
+ request,
+ repeat<(NPT_Timeout)mx*5000?(NPT_Timeout)mx*5000:repeat); /* repeat no less than every 5 secs */
+ return m_TaskManager.StartTask(task);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::DoHouseKeeping
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::DoHouseKeeping()
+{
+ NPT_AutoLock lock_devices(m_Devices);
+ NPT_TimeStamp now;
+ int count = m_Devices.GetItemCount();
+ NPT_System::GetCurrentTimeStamp(now);
+
+ PLT_DeviceDataReference device;
+ while (count--) {
+ NPT_Result res = m_Devices.PopHead(device);
+ if (NPT_SUCCEEDED(res)) {
+ NPT_TimeStamp last_update = device->GetLeaseTimeLastUpdate();
+ NPT_TimeInterval lease_time = device->GetLeaseTime();
+
+ // check if device lease time has expired
+ if (now > last_update + NPT_TimeInterval((unsigned long)(((float)lease_time)*2), 0)) {
+ RemoveDevice(device);
+ } else {
+ // add the device back to our list since it is still alive
+ m_Devices.Add(device);
+ }
+ } else {
+ NPT_LOG_SEVERE("DoHouseKeeping failure!");
+ return NPT_FAILURE;
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::FindDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::FindDevice(const char* uuid,
+ PLT_DeviceDataReference& device)
+{
+ NPT_AutoLock lock(m_Devices);
+ return NPT_ContainerFind(m_Devices, PLT_DeviceDataFinder(uuid), device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessHttpRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(context);
+ if (!request.GetMethod().Compare("NOTIFY")) {
+ return ProcessHttpNotify(request, context, response);
+ }
+
+ NPT_LOG_SEVERE("CtrlPoint received bad http request\r\n");
+ response.SetStatus(412, "Precondition Failed");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessHttpNotify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessHttpNotify(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_List vars;
+ PLT_EventSubscriber* sub = NULL;
+ NPT_String str;
+ NPT_XmlElementNode* xml = NULL;
+ NPT_String callback_uri;
+ NPT_String uuid;
+ NPT_String service_id;
+ NPT_UInt32 seq = 0;
+ PLT_Service* service = NULL;
+ PLT_DeviceData* device = NULL;
+ NPT_String content_type;
+
+ NPT_String method = request.GetMethod();
+ NPT_String uri = request.GetUrl().GetPath();
+
+// NPT_LOG_FINE_3("CtrlPoint received %s request from %s:%d\r\n",
+// request.GetMethod(),
+// client_info.remote_address.GetIpAddress(),
+// client_info.remote_address.GetPort());
+//
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINER, &request);
+
+ const NPT_String* sid = PLT_UPnPMessageHelper::GetSID(request);
+ const NPT_String* nt = PLT_UPnPMessageHelper::GetNT(request);
+ const NPT_String* nts = PLT_UPnPMessageHelper::GetNTS(request);
+ PLT_HttpHelper::GetContentType(request, content_type);
+
+ {
+ NPT_AutoLock lock_subs(m_Subscribers);
+
+ // look for the subscriber with that subscription url
+ if (!sid || NPT_FAILED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderBySID(*sid),
+ sub))) {
+ NPT_LOG_FINE_1("Subscriber %s not found\n", (const char*)sid);
+ goto bad_request;
+ }
+
+ // verify the request is syntactically correct
+ service = sub->GetService();
+ device = service->GetDevice();
+
+ uuid = device->GetUUID();
+ service_id = service->GetServiceID();
+
+ // callback uri for this sub
+ callback_uri = "/" + uuid + "/" + service_id;
+
+ if (uri.Compare(callback_uri, true) ||
+ !nt || nt->Compare("upnp:event", true) ||
+ !nts || nts->Compare("upnp:propchange", true)) {
+ goto bad_request;
+ }
+
+ // if the sequence number is less than our current one, we got it out of order
+ // so we disregard it
+ PLT_UPnPMessageHelper::GetSeq(request, seq);
+ if (sub->GetEventKey() && seq <= sub->GetEventKey()) {
+ goto bad_request;
+ }
+
+ // parse body
+ if (NPT_FAILED(PLT_HttpHelper::ParseBody(request, xml))) {
+ goto bad_request;
+ }
+
+ // check envelope
+ if (xml->GetTag().Compare("propertyset", true))
+ goto bad_request;
+
+ // check namespace
+ // xml.GetAttrValue("xmlns:e", str);
+ // if (str.Compare("urn:schemas-upnp-org:event-1-0"))
+ // goto bad_request;
+
+ // check property set
+ // keep a vector of the state variables that changed
+ NPT_XmlElementNode* property;
+ PLT_StateVariable* var;
+ for (NPT_List::Iterator children = xml->GetChildren().GetFirstItem(); children; children++) {
+ NPT_XmlElementNode* child = (*children)->AsElementNode();
+ if (!child) continue;
+
+ // check property
+ if (child->GetTag().Compare("property", true))
+ goto bad_request;
+
+ if (NPT_FAILED(PLT_XmlHelper::GetChild(child, property))) {
+ goto bad_request;
+ }
+
+ var = service->FindStateVariable(property->GetTag());
+ if (var == NULL) {
+ goto bad_request;
+ }
+
+ if (NPT_FAILED(var->SetValue(property->GetText()?*property->GetText():""))) {
+ goto bad_request;
+ }
+ vars.Add(var);
+ }
+
+ // update sequence
+ sub->SetEventKey(seq);
+ }
+
+ // notify listener we got an update
+ if (vars.GetItemCount()) {
+ NPT_AutoLock lock(m_ListenerList);
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnEventNotifyIterator(service, &vars));
+ }
+
+ delete xml;
+ return NPT_SUCCESS;
+
+bad_request:
+ NPT_LOG_SEVERE("CtrlPoint received bad request\r\n");
+ response.SetStatus(412, "Precondition Failed");
+ delete xml;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessSsdpSearchResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessSsdpSearchResponse(NPT_Result res,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_CHECK_SEVERE(res);
+ NPT_CHECK_POINTER_SEVERE(response);
+
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String protocol = response->GetProtocol();
+
+ NPT_LOG_FINE_2("CtrlPoint received SSDP search response from %s:%d",
+ (const char*)context.GetRemoteAddress().GetIpAddress().ToString() ,
+ context.GetRemoteAddress().GetPort());
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, response);
+
+ if (response->GetStatusCode() == 200) {
+ const NPT_String* st = response->GetHeaders().GetHeaderValue("st");
+ const NPT_String* usn = response->GetHeaders().GetHeaderValue("usn");
+ const NPT_String* ext = response->GetHeaders().GetHeaderValue("ext");
+ NPT_CHECK_POINTER_SEVERE(st);
+ NPT_CHECK_POINTER_SEVERE(usn);
+ NPT_CHECK_POINTER_SEVERE(ext);
+
+ NPT_String uuid;
+ // if we get an advertisement other than uuid
+ // verify it's formatted properly
+ if (usn != st) {
+ char tmp_uuid[200];
+ char tmp_st[200];
+ int ret;
+ // FIXME: We can't use sscanf directly!
+ ret = sscanf(((const char*)*usn)+5, "%[^::]::%s",
+ tmp_uuid,
+ tmp_st);
+ if (ret != 2)
+ return NPT_FAILURE;
+
+ if (st->Compare(tmp_st, true))
+ return NPT_FAILURE;
+
+ uuid = tmp_uuid;
+ } else {
+ uuid = ((const char*)*usn)+5;
+ }
+
+ if (m_UUIDsToIgnore.Find(NPT_StringFinder(uuid))) {
+ NPT_LOG_FINE_1("CtrlPoint received a search response from ourselves (%s)\n", (const char*)uuid);
+ return NPT_SUCCESS;
+ }
+
+ return ProcessSsdpMessage(response, context, uuid);
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::OnSsdpPacket
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::OnSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ return ProcessSsdpNotify(request, context);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessSsdpNotify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessSsdpNotify(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ // get the address of who sent us some data back
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String uri = (const char*)request.GetUrl().GetPath();
+ NPT_String protocol = request.GetProtocol();
+
+ if (method.Compare("NOTIFY") == 0) {
+ NPT_LOG_INFO_2("Received SSDP NOTIFY from %s:%d",
+ context.GetRemoteAddress().GetIpAddress().ToString().GetChars(),
+ context.GetRemoteAddress().GetPort());
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, &request);
+
+ if ((uri.Compare("*") != 0) || (protocol.Compare("HTTP/1.1") != 0))
+ return NPT_FAILURE;
+
+ const NPT_String* nts = PLT_UPnPMessageHelper::GetNTS(request);
+ const NPT_String* nt = PLT_UPnPMessageHelper::GetNT(request);
+ const NPT_String* usn = PLT_UPnPMessageHelper::GetUSN(request);
+ NPT_CHECK_POINTER_SEVERE(nts);
+ NPT_CHECK_POINTER_SEVERE(nt);
+ NPT_CHECK_POINTER_SEVERE(usn);
+
+ NPT_String uuid;
+ // if we get an advertisement other than uuid
+ // verify it's formatted properly
+ if (*usn != *nt) {
+ char tmp_uuid[200];
+ char tmp_nt[200];
+ int ret;
+ //FIXME: no sscanf!
+ ret = sscanf(((const char*)*usn)+5, "%[^::]::%s",
+ tmp_uuid,
+ tmp_nt);
+ if (ret != 2)
+ return NPT_FAILURE;
+
+ if (nt->Compare(tmp_nt, true))
+ return NPT_FAILURE;
+
+ uuid = tmp_uuid;
+ } else {
+ uuid = ((const char*)*usn)+5;
+ }
+
+ if (m_UUIDsToIgnore.Find(NPT_StringFinder(uuid))) {
+ NPT_LOG_FINE_1("Received a NOTIFY request from ourselves (%s)\n", (const char*)uuid);
+ return NPT_SUCCESS;
+ }
+
+ // if it's a byebye, remove the device and return right away
+ if (nts->Compare("ssdp:byebye", true) == 0) {
+ NPT_LOG_INFO_1("Received a byebye NOTIFY request from %s\n", (const char*)uuid);
+
+ PLT_DeviceDataReference data;
+ if (NPT_SUCCEEDED(FindDevice(uuid, data))) {
+ NPT_AutoLock lock_devices(m_Devices);
+ RemoveDevice(data);
+ }
+
+ return NPT_SUCCESS;
+ }
+
+ return ProcessSsdpMessage(&request, context, uuid);
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::RemoveDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::RemoveDevice(PLT_DeviceDataReference& data)
+{
+ NPT_LOG_INFO_1("Removing %s from device list\n", (const char*)data->GetUUID());
+
+ /* recursively remove embedded devices */
+ NPT_Array embedded_devices =
+ data->GetEmbeddedDevices();
+ for(NPT_Cardinal i=0;i>embedded_devices.GetItemCount();i++) {
+ RemoveDevice(embedded_devices[i]);
+ }
+
+ /* remove from list */
+ m_Devices.Remove(data);
+
+ /* unsubscribe from services */
+ data->m_Services.Apply(PLT_EventSubscriberRemoverIterator(this));
+
+ /* notify listeners */
+ {
+ NPT_AutoLock lock(m_ListenerList);
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnDeviceRemovedIterator(data));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessSsdpMessage
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessSsdpMessage(NPT_HttpMessage* message,
+ const NPT_HttpRequestContext& context,
+ NPT_String& uuid)
+{
+ NPT_COMPILER_UNUSED(context);
+ NPT_CHECK_POINTER_SEVERE(message);
+
+ if (m_UUIDsToIgnore.Find(NPT_StringFinder(uuid))) return NPT_SUCCESS;
+
+ const NPT_String* location = PLT_UPnPMessageHelper::GetLocation(*message);
+ NPT_CHECK_POINTER_SEVERE(location);
+
+ // be nice and assume a default lease time if not found
+ NPT_Timeout leasetime;
+ if (NPT_FAILED(PLT_UPnPMessageHelper::GetLeaseTime(*message, leasetime))) {
+ leasetime = 1800;
+ }
+
+ return InspectDevice(*location, uuid, leasetime);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::InspectDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::InspectDevice(const char* location,
+ const char* uuid,
+ NPT_Timeout leasetime)
+{
+ NPT_HttpUrl url(location);
+ if (!url.IsValid()) return NPT_FAILURE;
+
+ // is it a new device?
+ PLT_DeviceDataReference data;
+ if (NPT_FAILED(FindDevice(uuid, data))) {
+ NPT_AutoLock lock(m_Devices);
+
+ NPT_LOG_INFO_2("New device \"%s\" detected @ %s", uuid, location);
+
+ data = new PLT_DeviceData(url, uuid, NPT_TimeInterval(leasetime, 0));
+ m_Devices.Add(data);
+
+ // Start a task to retrieve the description
+ PLT_CtrlPointGetDescriptionTask* task = new PLT_CtrlPointGetDescriptionTask(
+ url,
+ this,
+ data);
+ // Add a delay, some devices need it (aka Rhapsody)
+ NPT_TimeInterval delay(0.2f);
+ m_TaskManager.StartTask(task, &delay);
+
+ return NPT_SUCCESS;
+ }
+
+ // in case we missed the byebye and the device description has changed (ip or port)
+ // reset base and assumes device is the same (same number of services and SCPDs)
+ // FIXME: The right way is to remove the device and rescan it though
+ PLT_DeviceReadyIterator device_tester;
+ if (NPT_SUCCEEDED(device_tester(data)) &&
+ data->GetDescriptionUrl().Compare(location, true)) {
+ NPT_LOG_INFO_2("Old device \"%s\" detected @ new location %s",
+ (const char*)data->GetFriendlyName(),
+ location);
+ data->SetURLBase(url);
+ }
+
+ // renew expiration time
+ data->SetLeaseTime(NPT_TimeInterval(leasetime, 0));
+ NPT_LOG_FINE_1("Device (%s) expiration time renewed..", (const char*)uuid);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessGetDescriptionResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessGetDescriptionResponse(NPT_Result res,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response,
+ PLT_DeviceDataReference& device)
+{
+ NPT_LOG_INFO_2("Received device description for %s (result = %d)",
+ (const char*)device->GetUUID(),
+ res);
+
+ NPT_CHECK_FATAL(res);
+ NPT_CHECK_POINTER_FATAL(response);
+
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINER, response);
+
+ // make sure we have seen this device before
+ PLT_DeviceDataReference root_device;
+ res = FindDevice(device->GetUUID(), root_device);
+ NPT_CHECK_WARNING(res);
+
+ // get body
+ NPT_String desc;
+ res = PLT_HttpHelper::GetBody(*response, desc);
+ NPT_CHECK_LABEL_SEVERE(res, bad_response);
+
+ // set the device description
+ res = root_device->SetDescription(desc, context.GetLocalAddress().GetIpAddress());
+ NPT_CHECK_LABEL_SEVERE(res, bad_response);
+
+ NPT_LOG_INFO_2("Device \"%s\" is now known as \"%s\"",
+ (const char*)device->GetUUID(),
+ (const char*)device->GetFriendlyName());
+
+ // add embedded devices to list of devices
+ // and fetch their services scpd
+ for (NPT_Cardinal i = 0;
+ im_EmbeddedDevices.GetItemCount();
+ i++) {
+
+ PLT_DeviceDataReference embedded_device = root_device->m_EmbeddedDevices[i];
+ PLT_DeviceDataReference data;
+ if (NPT_FAILED(FindDevice(embedded_device->GetUUID(), data))) {
+ NPT_AutoLock lock(m_Devices);
+ m_Devices.Add(embedded_device);
+ }
+
+ res = embedded_device->m_Services.Apply(PLT_AddGetSCPDRequestIterator(
+ &m_TaskManager,
+ this,
+ embedded_device));
+ NPT_CHECK_LABEL_SEVERE(res, bad_response);
+ }
+
+ // Get SCPD of root device services now
+ res = root_device->m_Services.Apply(PLT_AddGetSCPDRequestIterator(
+ &m_TaskManager,
+ this,
+ root_device));
+ NPT_CHECK_LABEL_SEVERE(res, bad_response);
+
+ return NPT_SUCCESS;
+
+bad_response:
+ NPT_LOG_SEVERE_2("Bad Description response for device \"%s\": %s",
+ (const char*)device->GetUUID(),
+ (const char*)desc);
+
+ if (!root_device.IsNull()) {
+ NPT_AutoLock lock(m_Devices);
+ RemoveDevice(root_device);
+ }
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessGetSCPDResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessGetSCPDResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ NPT_HttpResponse* response,
+ PLT_DeviceDataReference& device)
+{
+ PLT_DeviceReadyIterator device_tester;
+ PLT_Service* service = NULL;
+
+ NPT_LOG_INFO_2("Received SCPD response for %s (result = %d)",
+ (const char*)device->GetUUID(),
+ res);
+
+ NPT_CHECK_FATAL(res);
+ NPT_CHECK_POINTER_FATAL(request);
+ NPT_CHECK_POINTER_FATAL(response);
+
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINER, response);
+
+ PLT_DeviceDataReference data;
+ NPT_CHECK_WARNING(FindDevice(device->GetUUID(), data));
+
+ // get body
+ NPT_String scpd;
+ res = PLT_HttpHelper::GetBody(*response, scpd);
+ NPT_CHECK_LABEL_FATAL(res, bad_response);
+
+ // look for the service based on the SCPD uri
+ res = data->FindServiceByDescriptionURI(request->GetUrl().GetPath(), service);
+ NPT_CHECK_LABEL_FATAL(res, bad_response);
+
+ {
+ // lock using listener list before testing
+ // to make sure an scpd is not getting set while we test
+ NPT_AutoLock lock(m_ListenerList);
+
+ // set the service scpd
+ res = service->SetSCPDXML(scpd);
+ NPT_CHECK_LABEL_FATAL(res, bad_response);
+
+ if (NPT_SUCCEEDED(device_tester(data))) {
+ // notify that the device is ready to use
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnDeviceAddedIterator(data));
+ }
+
+ // if device is not root, notify listeners now if parent is ready
+ if (!data->GetParentUUID().IsEmpty()) {
+ PLT_DeviceDataReference parent;
+ NPT_CHECK_WARNING(FindDevice(data->GetParentUUID(), parent));
+
+ // lock using listener list before testing
+ // to make sure an scpd is not getting set while we test
+ if (NPT_SUCCEEDED(device_tester(parent))) {
+ // notify that the root device is ready to use
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnDeviceAddedIterator(parent));
+ }
+ }
+ }
+
+ return NPT_SUCCESS;
+
+bad_response:
+ NPT_LOG_SEVERE_2("Bad SCPD response for device \"%s\":%s",
+ (const char*)device->GetFriendlyName(),
+ (const char*)scpd);
+
+ if (!data.IsNull()) {
+ NPT_AutoLock lock(m_Devices);
+ RemoveDevice(data);
+ }
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::Subscribe
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::Subscribe(PLT_Service* service, bool cancel, void* userdata)
+{
+ NPT_AutoLock lock(m_Subscribers);
+
+ if (!service->IsSubscribable()) return NPT_FAILURE;
+
+ // look for the host and port of the device
+ PLT_DeviceData* device = service->GetDevice();
+
+ // get the relative event subscription url
+ // if URL starts with '/', it's not to be appended to base URL
+ NPT_String event_sub_url = service->GetEventSubURL();
+ if (!event_sub_url.StartsWith("/")) {
+ event_sub_url = device->GetURLBase().GetPath() + event_sub_url;
+ }
+
+ NPT_HttpUrl url(device->GetURLBase().GetHost(),
+ device->GetURLBase().GetPort(),
+ event_sub_url);
+
+ // look for the subscriber with that service to decide if it's a renewal or not
+ PLT_EventSubscriber* sub = NULL;
+ NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderByService(service),
+ sub);
+
+ // create the request
+ NPT_HttpRequest* request = NULL;
+
+ if (cancel == false) {
+ // renewal?
+ if (sub) {
+ NPT_LOG_FINE_3("Renewing subscriber \"%s\" for service \"%s\" of device \"%s\"",
+ (const char*)sub->GetSID(),
+ (const char*)service->GetServiceID(),
+ (const char*)device->GetFriendlyName());
+
+ // create the request
+ request = new NPT_HttpRequest(url, "SUBSCRIBE");
+
+ PLT_UPnPMessageHelper::SetSID(*request, sub->GetSID());
+ PLT_UPnPMessageHelper::SetTimeOut(*request, 1800);
+ } else {
+ NPT_LOG_INFO_2("Subscribing to service \"%s\" of device \"%s\"",
+ (const char*)service->GetServiceID(),
+ (const char*)service->GetDevice()->GetFriendlyName());
+
+ // prepare the callback url
+ NPT_String uuid = device->GetUUID();
+ NPT_String service_id = service->GetServiceID();
+ NPT_String callback_uri = "/" + uuid + "/" + service_id;
+
+ // create the request
+ request = new NPT_HttpRequest(url, "SUBSCRIBE");
+ // specify callback url using ip of interface used when
+ // retrieving device description
+ NPT_HttpUrl callbackUrl(device->m_LocalIfaceIp.ToString(),
+ m_EventHttpServer->GetPort(),
+ callback_uri);
+
+ // set the required headers for a new subscription
+ PLT_UPnPMessageHelper::SetNT(*request, "upnp:event");
+ PLT_UPnPMessageHelper::SetCallbacks(*request,
+ "<" + callbackUrl.ToString() + ">");
+ PLT_UPnPMessageHelper::SetTimeOut(*request, 1800);
+ }
+ } else {
+ NPT_LOG_INFO_3("Unsubscribing subscriber \"%s\" for service \"%s\" of device \"%s\"",
+ (const char*)(sub?sub->GetSID().GetChars():"unknown"),
+ (const char*)service->GetServiceID(),
+ (const char*)service->GetDevice()->GetFriendlyName());
+
+ // cancellation
+ if (!sub)return NPT_FAILURE;
+
+ // create the request
+ request = new NPT_HttpRequest(url, "UNSUBSCRIBE");
+ PLT_UPnPMessageHelper::SetSID(*request, sub->GetSID());
+
+ // remove from list now
+ m_Subscribers.Remove(sub, true);
+ delete sub;
+ }
+
+ NPT_CHECK_POINTER_FATAL(request);
+
+ // Prepare the request
+ // create a task to post the request
+ PLT_ThreadTask* task = new PLT_CtrlPointSubscribeEventTask(
+ request,
+ this,
+ service,
+ userdata);
+ m_TaskManager.StartTask(task);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessSubscribeResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessSubscribeResponse(NPT_Result res,
+ NPT_HttpResponse* response,
+ PLT_Service* service,
+ void* /* userdata */)
+{
+ const NPT_String* sid = NULL;
+ NPT_Int32 timeout;
+ PLT_EventSubscriber* sub = NULL;
+
+ NPT_AutoLock lock(m_Subscribers);
+
+ NPT_LOG_INFO_2("Received subscription response for service \"%s\" (result = %d)",
+ (const char*)service->GetServiceID(),
+ res);
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINER, response);
+
+ // if there's a failure or it's a response to a cancellation
+ // we get out
+ if (NPT_FAILED(res) || response == NULL || response->GetStatusCode() != 200) {
+ NPT_CHECK_LABEL_SEVERE(NPT_FAILED(res)?res:NPT_FAILURE, failure);
+ }
+
+ if (!(sid = PLT_UPnPMessageHelper::GetSID(*response)) ||
+ NPT_FAILED(PLT_UPnPMessageHelper::GetTimeOut(*response, timeout))) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // look for the subscriber with that sid
+ if (NPT_FAILED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderBySID(*sid),
+ sub))) {
+ NPT_LOG_INFO_3("Creating new subscriber \"%s\" for service \"%s\" of device \"%s\"",
+ (const char*)*sid,
+ (const char*)service->GetServiceID(),
+ (const char*)service->GetDevice()->GetFriendlyName());
+
+ sub = new PLT_EventSubscriber(&m_TaskManager, service, *sid);
+ m_Subscribers.Add(sub);
+ }
+
+ sub->SetTimeout(timeout);
+ return NPT_SUCCESS;
+
+failure:
+ NPT_LOG_SEVERE_3("(un)subscription failed of sub \"%s\" for service \"%s\" of device \"%s\"",
+ (const char*)(sid?*sid:"?"),
+ (const char*)service->GetServiceID(),
+ (const char*)service->GetDevice()->GetFriendlyName());
+
+ // in case it was a renewal look for the subscriber with that service and remove it from the list
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderByService(service),
+ sub))) {
+ m_Subscribers.Remove(sub);
+ delete sub;
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::InvokeAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::InvokeAction(PLT_ActionReference& action,
+ void* userdata)
+{
+ PLT_Service* service = action->GetActionDesc()->GetService();
+ PLT_DeviceData* device = service->GetDevice();
+
+ // look for the service control url
+ NPT_String control_url = service->GetControlURL();
+
+ // if URL starts with a "/", it's not to be appended to base URL
+ if (!control_url.StartsWith("/")) {
+ control_url = device->GetURLBase().GetPath() + control_url;
+ }
+
+ // create the request
+ // FIXME: hack use HTTP/1.0 for now because of WMC that returning 100 Continue when using HTTP/1.1
+ // and this screws up the http processing right now
+ NPT_HttpUrl url(device->GetURLBase().GetHost(), device->GetURLBase().GetPort(), control_url);
+ NPT_HttpRequest* request = new NPT_HttpRequest(url, "POST", NPT_HTTP_PROTOCOL_1_0);
+
+ // create a memory stream for our request body
+ NPT_MemoryStreamReference stream(new NPT_MemoryStream);
+ action->FormatSoapRequest(*stream);
+
+ // set the request body
+ NPT_InputStreamReference input = stream;
+ PLT_HttpHelper::SetBody(*request, input);
+
+ PLT_HttpHelper::SetContentType(*request, "text/xml; charset=\"utf-8\"");
+ NPT_String service_type = service->GetServiceType();
+ NPT_String action_name = action->GetActionDesc()->GetName();
+ request->GetHeaders().SetHeader("SOAPAction", "\"" + service_type + "#" + action_name + "\"");
+
+ // create a task to post the request
+ PLT_CtrlPointInvokeActionTask* task = new PLT_CtrlPointInvokeActionTask(
+ request,
+ this,
+ action,
+ userdata);
+
+ // queue the request
+ m_TaskManager.StartTask(task);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ProcessActionResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ProcessActionResponse(NPT_Result res,
+ NPT_HttpResponse* response,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String service_type;
+ NPT_String str;
+ NPT_XmlElementNode* xml = NULL;
+ NPT_String name;
+ NPT_String soap_action_name;
+ NPT_XmlElementNode* soap_action_response;
+ NPT_XmlElementNode* soap_body;
+ NPT_XmlElementNode* fault;
+ const NPT_String* attr = NULL;
+ PLT_ActionDesc* action_desc = action->GetActionDesc();
+
+ // reset the error code and desc
+ action->SetError(0, "");
+
+ // check context validity
+ if (NPT_FAILED(res) || response == NULL) {
+ goto failure;
+ }
+
+ NPT_LOG_FINE("Received Action Response:");
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, response);
+
+ NPT_LOG_FINER("Reading/Parsing Action Response Body...");
+ if (NPT_FAILED(PLT_HttpHelper::ParseBody(*response, xml))) {
+ goto failure;
+ }
+
+ NPT_LOG_FINER("Analyzing Action Response Body...");
+
+ // read envelope
+ if (xml->GetTag().Compare("Envelope", true))
+ goto failure;
+
+ // check namespace
+ if (!xml->GetNamespace() || xml->GetNamespace()->Compare("http://schemas.xmlsoap.org/soap/envelope/"))
+ goto failure;
+
+ // check encoding
+ attr = xml->GetAttribute("encodingStyle", "http://schemas.xmlsoap.org/soap/envelope/");
+ if (!attr || attr->Compare("http://schemas.xmlsoap.org/soap/encoding/"))
+ goto failure;
+
+ // read action
+ soap_body = PLT_XmlHelper::GetChild(xml, "Body");
+ if (soap_body == NULL)
+ goto failure;
+
+ // check if an error occurred
+ fault = PLT_XmlHelper::GetChild(soap_body, "Fault");
+ if (fault != NULL) {
+ // we have an error
+ ParseFault(action, fault);
+ goto failure;
+ }
+
+ if (NPT_FAILED(PLT_XmlHelper::GetChild(soap_body, soap_action_response)))
+ goto failure;
+
+ // verify action name is identical to SOAPACTION header
+ if (soap_action_response->GetTag().Compare(action_desc->GetName() + "Response", true))
+ goto failure;
+
+ // verify namespace
+ if (!soap_action_response->GetNamespace() ||
+ soap_action_response->GetNamespace()->Compare(action_desc->GetService()->GetServiceType()))
+ goto failure;
+
+ // read all the arguments if any
+ for (NPT_List::Iterator args = soap_action_response->GetChildren().GetFirstItem(); args; args++) {
+ NPT_XmlElementNode* child = (*args)->AsElementNode();
+ if (!child) continue;
+
+ action->SetArgumentValue(child->GetTag(), child->GetText()?*child->GetText():"");
+ if (NPT_FAILED(res)) goto failure;
+ }
+
+ // create a buffer for our response body and call the service
+ res = action->VerifyArguments(false);
+ if (NPT_FAILED(res)) goto failure;
+
+ goto cleanup;
+
+failure:
+ // override res with failure if necessary
+ if (NPT_SUCCEEDED(res)) res = NPT_ERROR_INVALID_FORMAT;
+ // fallthrough
+
+cleanup:
+ {
+ NPT_AutoLock lock(m_ListenerList);
+ m_ListenerList.Apply(PLT_CtrlPointListenerOnActionResponseIterator(res, action, userdata));
+ }
+
+ delete xml;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint::ParseFault
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPoint::ParseFault(PLT_ActionReference& action,
+ NPT_XmlElementNode* fault)
+{
+ NPT_XmlElementNode* detail = fault->GetChild("detail");
+ if (detail == NULL) return NPT_FAILURE;
+
+ NPT_XmlElementNode *upnp_error, *error_code, *error_desc;
+ upnp_error = detail->GetChild("upnp_error");
+ if (upnp_error == NULL) return NPT_FAILURE;
+
+ error_code = upnp_error->GetChild("errorCode");
+ error_desc = upnp_error->GetChild("errorDescription");
+ NPT_Int32 code = 501;
+ NPT_String desc;
+ if (error_code && error_code->GetText()) {
+ NPT_String value = *error_code->GetText();
+ value.ToInteger(code);
+ }
+ if (error_desc && error_desc->GetText()) {
+ desc = *error_desc->GetText();
+ }
+ action->SetError(code, desc);
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltCtrlPoint.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltCtrlPoint.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,175 @@
+/*****************************************************************
+|
+| Platinum - Control Point
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_CONTROL_POINT_H_
+#define _PLT_CONTROL_POINT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltService.h"
+#include "PltHttpServerListener.h"
+#include "PltSsdpListener.h"
+#include "PltDeviceData.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_HttpServer;
+class PLT_CtrlPointHouseKeepingTask;
+class PLT_SsdpSearchTask;
+class PLT_SsdpListenTask;
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointListener class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointListener
+{
+public:
+ virtual ~PLT_CtrlPointListener() {}
+
+ virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device) = 0;
+ virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device) = 0;
+ virtual NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata) = 0;
+ virtual NPT_Result OnEventNotify(PLT_Service* service, NPT_List* vars) = 0;
+};
+
+typedef NPT_List PLT_CtrlPointListenerList;
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPoint class
++---------------------------------------------------------------------*/
+class PLT_CtrlPoint : public PLT_SsdpPacketListener,
+ public PLT_SsdpSearchResponseListener
+{
+public:
+ PLT_CtrlPoint(const char* autosearch = "upnp:rootdevice"); // pass NULL to bypass the multicast search
+
+ NPT_Result AddListener(PLT_CtrlPointListener* listener);
+ NPT_Result RemoveListener(PLT_CtrlPointListener* listener);
+ void IgnoreUUID(const char* uuid);
+ NPT_Result InspectDevice(const char* location,
+ const char* uuid,
+ NPT_Timeout leasetime = 1800);
+ NPT_Result Search(const NPT_HttpUrl& url = NPT_HttpUrl("239.255.255.250", 1900, "*"),
+ const char* target = "upnp:rootdevice",
+ NPT_Cardinal mx = 5);
+ NPT_Result Discover(const NPT_HttpUrl& url = NPT_HttpUrl("239.255.255.250", 1900, "*"),
+ const char* target = "ssdp:all",
+ NPT_Cardinal mx = 5,
+ NPT_Timeout repeat = 50000);
+ NPT_Result InvokeAction(PLT_ActionReference& action, void* userdata = NULL);
+ NPT_Result Subscribe(PLT_Service* service, bool cancel = false, void* userdata = NULL);
+
+ // NPT_HttpRequestHandler methods
+ virtual NPT_Result ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+ // PLT_SsdpSearchResponseListener methods
+ virtual NPT_Result ProcessSsdpSearchResponse(NPT_Result res,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+ // PLT_SsdpPacketListener method
+ virtual NPT_Result OnSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context);
+
+ // helper methods
+ NPT_Result FindDevice(const char* uuid, PLT_DeviceDataReference& device);
+
+protected:
+ virtual ~PLT_CtrlPoint();
+
+ NPT_Result Start(PLT_SsdpListenTask* task);
+ NPT_Result Stop(PLT_SsdpListenTask* task);
+
+ NPT_Result ProcessSsdpNotify(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context);
+ NPT_Result ProcessSsdpMessage(NPT_HttpMessage* message,
+ const NPT_HttpRequestContext& context,
+ NPT_String& uuid);
+ NPT_Result ProcessGetDescriptionResponse(NPT_Result res,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response,
+ PLT_DeviceDataReference& device);
+ NPT_Result ProcessGetSCPDResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ NPT_HttpResponse* response,
+ PLT_DeviceDataReference& device);
+ NPT_Result ProcessActionResponse(NPT_Result res,
+ NPT_HttpResponse* response,
+ PLT_ActionReference& action,
+ void* userdata);
+ NPT_Result ProcessSubscribeResponse(NPT_Result res,
+ NPT_HttpResponse* response,
+ PLT_Service* service,
+ void* userdata);
+ NPT_Result ProcessHttpNotify(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+private:
+ // methods
+ NPT_Result DoHouseKeeping();
+ NPT_Result RemoveDevice(PLT_DeviceDataReference& data);
+ NPT_Result ParseFault(PLT_ActionReference& action, NPT_XmlElementNode* fault);
+ PLT_SsdpSearchTask* CreateSearchTask(const NPT_HttpUrl& url,
+ const char* target,
+ NPT_Cardinal mx,
+ const NPT_IpAddress& address);
+
+private:
+ friend class NPT_Reference;
+ friend class PLT_UPnP;
+ friend class PLT_UPnP_CtrlPointStartIterator;
+ friend class PLT_UPnP_CtrlPointStopIterator;
+ friend class PLT_EventSubscriberRemoverIterator;
+ friend class PLT_CtrlPointGetDescriptionTask;
+ friend class PLT_CtrlPointGetSCPDTask;
+ friend class PLT_CtrlPointInvokeActionTask;
+ friend class PLT_CtrlPointHouseKeepingTask;
+ friend class PLT_CtrlPointSubscribeEventTask;
+
+ NPT_List m_UUIDsToIgnore;
+ NPT_Lock m_ListenerList;
+ PLT_HttpServer* m_EventHttpServer;
+ NPT_HttpRequestHandler* m_EventHttpServerHandler;
+ PLT_TaskManager m_TaskManager;
+ NPT_Lock > m_Devices;
+ NPT_Lock > m_Subscribers;
+ NPT_String m_AutoSearch;
+};
+
+typedef NPT_Reference PLT_CtrlPointReference;
+
+#endif /* _PLT_CONTROL_POINT_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltCtrlPointTask.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltCtrlPointTask.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,201 @@
+/*****************************************************************
+|
+| Platinum - Control Point Tasks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDeviceHost.h"
+#include "PltCtrlPointTask.h"
+#include "PltCtrlPoint.h"
+#include "PltDatagramStream.h"
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask::PLT_CtrlPointGetDescriptionTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointGetDescriptionTask::PLT_CtrlPointGetDescriptionTask(const NPT_HttpUrl& url,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_DeviceDataReference& device) :
+ PLT_HttpClientSocketTask(new NPT_HttpRequest(url, "GET")),
+ m_CtrlPoint(ctrl_point),
+ m_Device(device)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask::~PLT_CtrlPointGetDescriptionTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointGetDescriptionTask::~PLT_CtrlPointGetDescriptionTask()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPointGetDescriptionTask::ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ return m_CtrlPoint->ProcessGetDescriptionResponse(res, context, response, m_Device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetSCPDTask::PLT_CtrlPointGetSCPDTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointGetSCPDTask::PLT_CtrlPointGetSCPDTask(const NPT_HttpUrl& url,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_DeviceDataReference& device) :
+ PLT_HttpClientSocketTask(new NPT_HttpRequest(url, "GET")),
+ m_CtrlPoint(ctrl_point),
+ m_Device(device)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetSCPDTask::~PLT_CtrlPointGetSCPDTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointGetSCPDTask::~PLT_CtrlPointGetSCPDTask()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetSCPDTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPointGetSCPDTask::ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(context);
+ return m_CtrlPoint->ProcessGetSCPDResponse(res, request, response, m_Device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointInvokeActionTask::PLT_CtrlPointInvokeActionTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointInvokeActionTask::PLT_CtrlPointInvokeActionTask(NPT_HttpRequest* request,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_ActionReference& action,
+ void* userdata) :
+ PLT_HttpClientSocketTask(request),
+ m_CtrlPoint(ctrl_point),
+ m_Action(action),
+ m_Userdata(userdata)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointInvokeActionTask::~PLT_CtrlPointInvokeActionTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointInvokeActionTask::~PLT_CtrlPointInvokeActionTask()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointInvokeActionTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPointInvokeActionTask::ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+
+ return m_CtrlPoint->ProcessActionResponse(res, response, m_Action, m_Userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointHouseKeepingTask::PLT_CtrlPointHouseKeepingTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointHouseKeepingTask::PLT_CtrlPointHouseKeepingTask(PLT_CtrlPoint* ctrl_point,
+ NPT_TimeInterval timer) :
+ m_CtrlPoint(ctrl_point),
+ m_Timer(timer)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointHouseKeepingTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_CtrlPointHouseKeepingTask::DoRun()
+{
+ while (1) {
+ if (m_CtrlPoint) {
+ m_CtrlPoint->DoHouseKeeping();
+ }
+
+ if (IsAborting(m_Timer.m_Seconds*1000)) break;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointSubscribeEventTask::PLT_CtrlPointSubscribeEventTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointSubscribeEventTask::PLT_CtrlPointSubscribeEventTask(NPT_HttpRequest* request,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_Service* service,
+ void* userdata) :
+ PLT_HttpClientSocketTask(request),
+ m_CtrlPoint(ctrl_point),
+ m_Service(service),
+ m_Userdata(userdata)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointSubscribeEventTask::~PLT_CtrlPointSubscribeEventTask
++---------------------------------------------------------------------*/
+PLT_CtrlPointSubscribeEventTask::~PLT_CtrlPointSubscribeEventTask()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointSubscribeEventTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_CtrlPointSubscribeEventTask::ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+
+ return m_CtrlPoint->ProcessSubscribeResponse(res, response, m_Service, m_Userdata);
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltCtrlPointTask.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltCtrlPointTask.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,167 @@
+/*****************************************************************
+|
+| Platinum - Control Point Tasks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_CONTROL_POINT_TASK_H_
+#define _PLT_CONTROL_POINT_TASK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttpClientTask.h"
+#include "PltDatagramStream.h"
+#include "PltDeviceData.h"
+#include "PltCtrlPoint.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Action;
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointGetDescriptionTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_CtrlPointGetDescriptionTask(const NPT_HttpUrl& url,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_DeviceDataReference& device);
+ virtual ~PLT_CtrlPointGetDescriptionTask();
+
+protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ PLT_DeviceDataReference m_Device;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetSCPDTask class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointGetSCPDTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_CtrlPointGetSCPDTask(const NPT_HttpUrl& url,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_DeviceDataReference& m_Device);
+ virtual ~PLT_CtrlPointGetSCPDTask();
+
+protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ PLT_DeviceDataReference m_Device;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointInvokeActionTask class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointInvokeActionTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_CtrlPointInvokeActionTask(NPT_HttpRequest* request,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_ActionReference& action,
+ void* userdata);
+ virtual ~PLT_CtrlPointInvokeActionTask();
+
+protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ PLT_ActionReference m_Action;
+ void* m_Userdata;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointHouseKeepingTask class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointHouseKeepingTask : public PLT_ThreadTask
+{
+public:
+ PLT_CtrlPointHouseKeepingTask(PLT_CtrlPoint* ctrl_point,
+ NPT_TimeInterval timer = NPT_TimeInterval(10, 0));
+
+protected:
+ ~PLT_CtrlPointHouseKeepingTask() {}
+
+ // PLT_ThreadTask methods
+ virtual void DoRun();
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ NPT_TimeInterval m_Timer;
+};
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointSubscribeEventTask class
++---------------------------------------------------------------------*/
+class PLT_CtrlPointSubscribeEventTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_CtrlPointSubscribeEventTask(NPT_HttpRequest* request,
+ PLT_CtrlPoint* ctrl_point,
+ PLT_Service* service,
+ void* userdata);
+ virtual ~PLT_CtrlPointSubscribeEventTask();
+
+protected:
+ // PLT_HttpClientSocketTask methods
+ NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+protected:
+ PLT_CtrlPoint* m_CtrlPoint;
+ PLT_Service* m_Service;
+ void* m_Userdata;
+};
+
+#endif /* _PLT_CONTROL_POINT_TASK_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltDatagramStream.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltDatagramStream.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,145 @@
+/*****************************************************************
+|
+| Platinum - Datagram Stream
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDatagramStream.h"
+
+/*----------------------------------------------------------------------
+| PLT_InputDatagramStream::PLT_InputDatagramStream
++---------------------------------------------------------------------*/
+PLT_InputDatagramStream::PLT_InputDatagramStream(NPT_UdpSocket* socket) :
+ m_Socket(socket)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputDatagramStream::~PLT_InputDatagramStream
++---------------------------------------------------------------------*/
+PLT_InputDatagramStream::~PLT_InputDatagramStream()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputDatagramStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputDatagramStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read /*= 0*/)
+{
+
+ if (bytes_read) *bytes_read = 0;
+
+ if (bytes_to_read == 0) {
+ return NPT_SUCCESS;
+ }
+
+ NPT_DataBuffer data_buffer(buffer, bytes_to_read, false);
+
+ // read data into it now
+ NPT_SocketAddress addr;
+ NPT_Result res = m_Socket->Receive(data_buffer, &addr);
+
+ // update info
+ m_Socket->GetInfo(m_Info);
+ m_Info.remote_address = addr;
+
+ if (bytes_read) *bytes_read = data_buffer.GetDataSize();
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputDatagramStream::GetInfo(NPT_SocketInfo& info)
+{
+ info = m_Info;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::PLT_OutputDatagramStream
++---------------------------------------------------------------------*/
+PLT_OutputDatagramStream::PLT_OutputDatagramStream(NPT_UdpSocket* socket,
+ NPT_Size size,
+ const NPT_SocketAddress* address) :
+ m_Socket(socket),
+ m_Address(address?new NPT_SocketAddress(address->GetIpAddress(), address->GetPort()):NULL)
+{
+ m_Buffer.SetBufferSize(size);
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::~PLT_OutputDatagramStream
++---------------------------------------------------------------------*/
+PLT_OutputDatagramStream::~PLT_OutputDatagramStream()
+{
+ delete m_Address;
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_OutputDatagramStream::Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written /* = NULL */)
+{
+ // calculate if we need to increase the buffer
+ NPT_Int32 overflow = bytes_to_write - m_Buffer.GetBufferSize() + m_Buffer.GetDataSize();
+ if (overflow > 0) {
+ m_Buffer.Reserve(m_Buffer.GetBufferSize() + overflow);
+ }
+ // copy data in place at the end of what we have there already
+ NPT_CopyMemory(m_Buffer.UseData() + m_Buffer.GetDataSize(), buffer, bytes_to_write);
+ m_Buffer.SetDataSize(m_Buffer.GetDataSize() + bytes_to_write);
+
+ if (bytes_written) *bytes_written = bytes_to_write;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream::Flush
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_OutputDatagramStream::Flush()
+{
+ // send buffer now
+ m_Socket->Send(m_Buffer, m_Address);
+
+ // reset buffer
+ m_Buffer.SetDataSize(0);
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltDatagramStream.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltDatagramStream.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,99 @@
+/*****************************************************************
+|
+| Platinum - Datagram Stream
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_DATAGRAM_H_
+#define _PLT_DATAGRAM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_InputDatagramStream
++---------------------------------------------------------------------*/
+class PLT_InputDatagramStream : public NPT_InputStream
+{
+public:
+ // methods
+ PLT_InputDatagramStream(NPT_UdpSocket* socket);
+ virtual ~PLT_InputDatagramStream();
+
+ NPT_Result GetInfo(NPT_SocketInfo& info);
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = 0);
+
+ NPT_Result Seek(NPT_Position offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Skip(NPT_Size offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Tell(NPT_Position& offset){ NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result GetSize(NPT_LargeSize& size) { NPT_COMPILER_UNUSED(size); return NPT_FAILURE; }
+ NPT_Result GetAvailable(NPT_LargeSize& available) { NPT_COMPILER_UNUSED(available); return NPT_FAILURE; }
+
+protected:
+ NPT_UdpSocket* m_Socket;
+ NPT_SocketInfo m_Info;
+};
+
+typedef NPT_Reference PLT_InputDatagramStreamReference;
+
+/*----------------------------------------------------------------------
+| PLT_OutputDatagramStream
++---------------------------------------------------------------------*/
+class PLT_OutputDatagramStream : public NPT_OutputStream
+{
+public:
+ // methods
+ PLT_OutputDatagramStream(NPT_UdpSocket* socket,
+ NPT_Size size = 4096,
+ const NPT_SocketAddress* address = NULL);
+ virtual ~PLT_OutputDatagramStream();
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer, NPT_Size bytes_to_write, NPT_Size* bytes_written = NULL);
+ NPT_Result Flush();
+
+ NPT_Result Seek(NPT_Position offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Tell(NPT_Position& offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+
+protected:
+ NPT_UdpSocket* m_Socket;
+ NPT_DataBuffer m_Buffer;
+ NPT_SocketAddress* m_Address;
+};
+
+typedef NPT_Reference PLT_OutputDatagramStreamReference;
+
+#endif /* _PLT_DATAGRAM_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltDeviceData.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltDeviceData.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,618 @@
+/*****************************************************************
+|
+| Platinum - Device Data
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDeviceData.h"
+#include "PltService.h"
+#include "PltUPnP.h"
+#include "PltXmlHelper.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.devicedata")
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::PLT_DeviceData
++---------------------------------------------------------------------*/
+PLT_DeviceData::PLT_DeviceData(NPT_HttpUrl description_url,
+ const char* uuid,
+ NPT_TimeInterval lease_time,
+ const char* device_type,
+ const char* friendly_name) :
+ m_UUID(uuid),
+ m_URLDescription(description_url),
+ m_DeviceType(device_type),
+ m_FriendlyName(friendly_name)
+{
+ if (uuid == NULL || strlen(uuid) == 0) {
+ PLT_UPnPMessageHelper::GenerateGUID(m_UUID);
+ }
+
+ SetLeaseTime(lease_time);
+ SetURLBase(m_URLDescription);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::~PLT_DeviceData
++---------------------------------------------------------------------*/
+PLT_DeviceData::~PLT_DeviceData()
+{
+ Cleanup();
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::Cleanup
++---------------------------------------------------------------------*/
+void
+PLT_DeviceData::Cleanup()
+{
+ m_Services.Apply(NPT_ObjectDeleter());
+ m_Services.Clear();
+ m_EmbeddedDevices.Clear();
+ m_Icons.Clear();
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetDescriptionUrl
++---------------------------------------------------------------------*/
+/*NPT_Result
+PLT_DeviceData::SetDescriptionUrl(NPT_HttpUrl& url)
+{
+ NPT_CHECK_FATAL(SetURLBase(url));
+ m_URLDescription = url;
+ return NPT_SUCCESS;
+}*/
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetDescriptionUrl
++---------------------------------------------------------------------*/
+NPT_String
+PLT_DeviceData::GetDescriptionUrl(const char* bind_addr)
+{
+ NPT_HttpUrl url = m_URLDescription;
+
+ // override host
+ if (bind_addr) url.SetHost(bind_addr);
+ return url.ToString();
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetURLBase
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::SetURLBase(NPT_HttpUrl& url)
+{
+ // we're assuming param passed to be relative (Host/port not different than description)
+ m_URLBasePath = url.GetPath();
+
+ // remove trailing file according to RFC 2396
+ if (!m_URLBasePath.EndsWith("/")) {
+ int index = m_URLBasePath.ReverseFind('/');
+ if (index < 0) return NPT_FAILURE;
+ m_URLBasePath.SetLength(index+1);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetURLBase
++---------------------------------------------------------------------*/
+NPT_HttpUrl
+PLT_DeviceData::GetURLBase()
+{
+ return NPT_HttpUrl(m_URLDescription.GetHost(),
+ m_URLDescription.GetPort(),
+ m_URLBasePath);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetIconUrl
++---------------------------------------------------------------------*/
+NPT_String
+PLT_DeviceData::GetIconUrl(const char* mimetype,
+ NPT_Int32 maxsize,
+ NPT_Int32 maxdepth)
+{
+ PLT_DeviceIcon icon;
+
+ for (NPT_Cardinal i=0; i maxsize) ||
+ (maxsize && m_Icons[i].m_Height > maxsize) ||
+ (maxdepth && m_Icons[i].m_Depth > maxdepth))
+ continue;
+
+ // pick the biggest and better resolution we can
+ if (icon.m_Width >= m_Icons[i].m_Width ||
+ icon.m_Height >= m_Icons[i].m_Height ||
+ icon.m_Depth >= m_Icons[i].m_Depth ||
+ m_Icons[i].m_UrlPath.IsEmpty())
+ continue;
+
+ icon = m_Icons[i];
+ }
+
+ if (icon.m_UrlPath == "") return "";
+
+ // make absolut path from url base if necessary
+ NPT_HttpUrl url(icon.m_UrlPath);
+ if (!url.IsValid()) {
+ url = GetURLBase();
+ if (icon.m_UrlPath.StartsWith("/")) {
+ url.SetPathPlus(icon.m_UrlPath);
+ } else {
+ url.SetPathPlus(url.GetPath() + icon.m_UrlPath);
+ }
+ }
+
+ return url.ToString();
+}
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetLeaseTime
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::SetLeaseTime(NPT_TimeInterval lease_time)
+{
+ m_LeaseTime = lease_time;
+ NPT_System::GetCurrentTimeStamp(m_LeaseTimeLastUpdate);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetLeaseTimeLastUpdate
++---------------------------------------------------------------------*/
+NPT_TimeStamp
+PLT_DeviceData::GetLeaseTimeLastUpdate()
+{
+ return m_LeaseTimeLastUpdate;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::ToLog
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::ToLog(int level /* = NPT_LOG_LEVEL_FINE */)
+{
+ NPT_COMPILER_UNUSED(level);
+
+ NPT_StringOutputStreamReference stream(new NPT_StringOutputStream);
+ stream->WriteString("Device GUID: ");
+ stream->WriteString((const char*)m_UUID);
+
+ stream->WriteString("Device Type: ");
+ stream->WriteString((const char*)m_DeviceType);
+
+ stream->WriteString("Device Base Url: ");
+ stream->WriteString((const char*)GetURLBase().ToString());
+
+ stream->WriteString("Device Friendly Name: ");
+ stream->WriteString((const char*)m_FriendlyName);
+
+ NPT_LOG_1(level, "%s", (const char*)stream->GetString());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::AddDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::AddDevice(PLT_DeviceDataReference& device)
+{
+ device->m_ParentUUID = m_UUID;
+ m_EmbeddedDevices.Add(device);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::AddService
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::AddService(PLT_Service* service)
+{
+ if (service->m_ServiceType == "" ||
+ service->m_ServiceID == "" ||
+ service->m_SCPDURL == "" ||
+ service->m_ControlURL == "" ||
+ service->m_EventSubURL == "") {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return m_Services.Add(service);
+}
+
+/*----------------------------------------------------------------------
+| PLT_GetDescriptionIterator class
++---------------------------------------------------------------------*/
+template
+class PLT_GetDescriptionIterator
+{
+public:
+ PLT_GetDescriptionIterator(NPT_XmlElementNode* parent) :
+ m_Parent(parent) {}
+
+ NPT_Result operator()(T& data) const {
+ return data->GetDescription(m_Parent);
+ }
+
+private:
+ NPT_XmlElementNode* m_Parent;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::ToXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::GetDescription(NPT_XmlElementNode* root, NPT_XmlElementNode** device_out)
+{
+ NPT_XmlElementNode* device = new NPT_XmlElementNode("device");
+ if (device_out) {
+ *device_out = device;
+ }
+
+ NPT_CHECK_SEVERE(root->AddChild(device));
+
+ // device properties
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "deviceType", m_DeviceType));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "friendlyName", m_FriendlyName));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "manufacturer", m_Manufacturer));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "manufacturerURL", m_ManufacturerURL));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "modelDescription", m_ModelDescription));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "modelName", m_ModelName));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "modelURL", m_ModelURL));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "modelNumber", m_ModelNumber));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "serialNumber", m_SerialNumber));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "UDN", "uuid:" + m_UUID));
+
+ if (!m_PresentationURL.IsEmpty()) {
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(device, "presentationURL", m_PresentationURL));
+ }
+
+ // Extra info not UPnP specs
+ NPT_CHECK(OnAddExtraInfo(device));
+
+ // PS3 support
+ if (!m_DlnaDoc.IsEmpty()) {
+ NPT_XmlElementNode* dlnadoc = new NPT_XmlElementNode("dlna", "X_DLNADOC");
+ dlnadoc->AddText(m_DlnaDoc);
+ device->AddChild(dlnadoc);
+ }
+ if (!m_DlnaCap.IsEmpty()) {
+ NPT_XmlElementNode* dlnacap = new NPT_XmlElementNode("dlna", "X_DLNACAP");
+ dlnacap->AddText(m_DlnaCap);
+ device->AddChild(dlnacap);
+ }
+
+ // icons
+ if (m_Icons.GetItemCount()) {
+ NPT_XmlElementNode* icons = new NPT_XmlElementNode("iconList");
+ NPT_CHECK_SEVERE(device->AddChild(icons));
+ for (NPT_Cardinal i=0; iAddChild(icon));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "mimetype", m_Icons[i].m_MimeType));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "width", NPT_String::FromInteger(m_Icons[i].m_Width)));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "height", NPT_String::FromInteger(m_Icons[i].m_Height)));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "depth", NPT_String::FromInteger(m_Icons[i].m_Depth)));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(icon, "url", m_Icons[i].m_UrlPath));
+ }
+ }
+
+ // services
+ NPT_XmlElementNode* services = new NPT_XmlElementNode("serviceList");
+ NPT_CHECK_SEVERE(device->AddChild(services));
+ NPT_CHECK_SEVERE(m_Services.ApplyUntil(PLT_GetDescriptionIterator(services),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)));
+
+ // PS3 support
+ NPT_XmlElementNode* aggr = new NPT_XmlElementNode("av", "aggregationFlags");
+ NPT_CHECK_SEVERE(aggr->SetNamespaceUri("av", "urn:schemas-sonycom:av"));
+ aggr->AddText("10");
+ device->AddChild(aggr);
+
+ // embedded devices
+ if (m_EmbeddedDevices.GetItemCount()) {
+ NPT_XmlElementNode* deviceList = new NPT_XmlElementNode("deviceList");
+ NPT_CHECK_SEVERE(device->AddChild(deviceList));
+
+ NPT_CHECK_SEVERE(m_EmbeddedDevices.ApplyUntil(
+ PLT_GetDescriptionIterator(deviceList),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::GetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::GetDescription(NPT_String& desc)
+{
+ NPT_Result res;
+ NPT_XmlElementNode* spec = NULL;
+ NPT_XmlElementNode* root = new NPT_XmlElementNode("root");
+
+ NPT_CHECK_LABEL_SEVERE(res = root->SetNamespaceUri("", "urn:schemas-upnp-org:device-1-0"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = root->SetNamespaceUri("dlna", "urn:schemas-dlna-org:device-1-0"), cleanup);
+
+ // add spec version
+ spec = new NPT_XmlElementNode("specVersion");
+ NPT_CHECK_LABEL_SEVERE(res = root->AddChild(spec), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(spec, "major", "1"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(spec, "minor", "0"), cleanup);
+
+ // get device xml
+ NPT_CHECK_LABEL_SEVERE(res = GetDescription(root), cleanup);
+
+ // serialize node
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::Serialize(*root, desc), cleanup);
+
+cleanup:
+ delete root;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::SetDescription(const char* description,
+ const NPT_IpAddress& local_iface_ip)
+{
+ NPT_XmlParser parser;
+ NPT_XmlNode* tree = NULL;
+ NPT_Result res;
+ NPT_XmlElementNode* root = NULL;
+ NPT_String URLBase;
+
+ res = parser.Parse(description, tree);
+ NPT_CHECK_LABEL_SEVERE(res, cleanup);
+
+ root = tree->AsElementNode();
+ if (!root ||
+ root->GetTag() != "root" ||
+ !root->GetNamespace() ||
+ *root->GetNamespace() != "urn:schemas-upnp-org:device-1-0") {
+ NPT_LOG_INFO_1("root namespace is invalid: %s",
+ (root&&root->GetNamespace())?root->GetNamespace()->GetChars():"null");
+ NPT_CHECK_LABEL_SEVERE(NPT_FAILURE, cleanup);
+ }
+
+ // look for optional URLBase element
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetChildText(root, "URLBase", URLBase))) {
+ NPT_HttpUrl url(URLBase);
+
+ if (!url.IsValid()) {
+ NPT_CHECK_LABEL_SEVERE(NPT_FAILURE, cleanup);
+ }
+
+ SetURLBase(url);
+ }
+
+ // at least one root device child element is required
+ NPT_XmlElementNode* device;
+ if (!(device = PLT_XmlHelper::GetChild(root, "device"))) {
+ NPT_CHECK_LABEL_SEVERE(NPT_FAILURE, cleanup);
+ }
+
+ res = SetDescriptionDevice(device);
+
+cleanup:
+ // delete the tree
+ delete tree;
+
+ m_LocalIfaceIp = local_iface_ip;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::SetDescriptionDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::SetDescriptionDevice(NPT_XmlElementNode* device_node)
+{
+ NPT_Result res;
+
+ NPT_CHECK_SEVERE(PLT_XmlHelper::GetChildText(device_node, "deviceType", m_DeviceType));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::GetChildText(device_node, "UDN", m_UUID));
+
+ // jump uuid:, we should probably check first
+ m_UUID = ((const char*)m_UUID)+5;
+
+ // optional attributes
+ PLT_XmlHelper::GetChildText(device_node, "friendlyName", m_FriendlyName);
+ PLT_XmlHelper::GetChildText(device_node, "manufacturer", m_Manufacturer);
+ PLT_XmlHelper::GetChildText(device_node, "manufacturerURL", m_ManufacturerURL);
+ PLT_XmlHelper::GetChildText(device_node, "modelDescription", m_ModelDescription);
+ PLT_XmlHelper::GetChildText(device_node, "modelName", m_ModelName);
+ PLT_XmlHelper::GetChildText(device_node, "modelNumber", m_ModelNumber);
+ PLT_XmlHelper::GetChildText(device_node, "serialNumber", m_SerialNumber);
+
+ // enumerate icons
+ NPT_XmlElementNode* iconList = PLT_XmlHelper::GetChild(device_node, "iconList");
+ if (iconList) {
+ NPT_Array icons;
+ PLT_XmlHelper::GetChildren(iconList, icons, "icon");
+
+ for (NPT_Cardinal k=0 ; k services;
+ PLT_XmlHelper::GetChildren(serviceList, services, "service");
+ for( int k = 0 ; k < (int)services.GetItemCount(); k++) {
+ PLT_Service* service = new PLT_Service(this);
+ PLT_XmlHelper::GetChildText(services[k], "serviceType", service->m_ServiceType);
+ PLT_XmlHelper::GetChildText(services[k], "serviceId", service->m_ServiceID);
+ PLT_XmlHelper::GetChildText(services[k], "SCPDURL", service->m_SCPDURL);
+ PLT_XmlHelper::GetChildText(services[k], "controlURL", service->m_ControlURL);
+ PLT_XmlHelper::GetChildText(services[k], "eventSubURL", service->m_EventSubURL);
+ if (NPT_FAILED(res = AddService(service))) {
+ delete service;
+ return res;
+ }
+ }
+ }
+
+ // enumerate embedded devices
+ NPT_XmlElementNode* deviceList = PLT_XmlHelper::GetChild(device_node, "deviceList");
+ if (deviceList) {
+ NPT_Array devices;
+ PLT_XmlHelper::GetChildren(deviceList, devices, "device");
+ for( int k = 0 ; k < (int)devices.GetItemCount(); k++) {
+ PLT_DeviceDataReference device(new PLT_DeviceData(m_URLDescription, "", m_LeaseTime));
+ NPT_CHECK_SEVERE(device->SetDescriptionDevice(devices[k]));
+ AddDevice(device);
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindEmbeddedDeviceByType
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindEmbeddedDeviceByType(const char* type,
+ PLT_DeviceDataReference& device)
+{
+ return NPT_ContainerFind(m_EmbeddedDevices,
+ PLT_DeviceDataFinderByType(type),
+ device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceById
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceById(const char* id, PLT_Service*& service)
+{
+ return NPT_ContainerFind(m_Services,
+ PLT_ServiceIDFinder(id),
+ service);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceByType
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceByType(const char* type, PLT_Service*& service)
+{
+ return NPT_ContainerFind(m_Services,
+ PLT_ServiceTypeFinder(type),
+ service);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceByDescriptionURI
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceByDescriptionURI(const char* uri,
+ PLT_Service*& service)
+{
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Services,
+ PLT_ServiceSCPDURLFinder(uri),
+ service))) {
+ return NPT_SUCCESS;
+ }
+
+ for (int i=0; i < (int)m_EmbeddedDevices.GetItemCount(); i++) {
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_EmbeddedDevices[i]->m_Services,
+ PLT_ServiceSCPDURLFinder(uri),
+ service)))
+ return NPT_SUCCESS;
+ }
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceByControlURI
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceByControlURI(const char* uri,
+ PLT_Service*& service)
+{
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Services,
+ PLT_ServiceControlURLFinder(uri),
+ service))) {
+ return NPT_SUCCESS;
+ }
+
+ for (int i=0; i < (int)m_EmbeddedDevices.GetItemCount(); i++) {
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_EmbeddedDevices[i]->m_Services,
+ PLT_ServiceControlURLFinder(uri),
+ service)))
+ return NPT_SUCCESS;
+ }
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData::FindServiceByEventSubURI
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceData::FindServiceByEventSubURI(const char* uri,
+ PLT_Service*& service)
+{
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Services,
+ PLT_ServiceEventSubURLFinder(uri),
+ service))) {
+ return NPT_SUCCESS;
+ }
+
+ for (int i=0; i < (int)m_EmbeddedDevices.GetItemCount(); i++) {
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_EmbeddedDevices[i]->m_Services,
+ PLT_ServiceEventSubURLFinder(uri),
+ service)))
+ return NPT_SUCCESS;
+ }
+ return NPT_FAILURE;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltDeviceData.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltDeviceData.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,211 @@
+/*****************************************************************
+|
+| Platinum - Device Data
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_DEVICE_DATA_H_
+#define _PLT_DEVICE_DATA_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Service;
+class PLT_DeviceData;
+
+typedef NPT_Reference PLT_DeviceDataReference;
+typedef NPT_List PLT_DeviceDataReferenceList;
+
+/*----------------------------------------------------------------------
+| PLT_DeviceIcon class
++---------------------------------------------------------------------*/
+class PLT_DeviceIcon
+{
+public:
+ PLT_DeviceIcon(const char* mimetype = "",
+ NPT_Int32 width = 0,
+ NPT_Int32 height = 0,
+ NPT_Int32 depth = 0,
+ const char* urlpath = "") :
+ m_MimeType(mimetype),
+ m_Width(width),
+ m_Height(height),
+ m_Depth(depth),
+ m_UrlPath(urlpath) {}
+ virtual ~PLT_DeviceIcon() {}
+
+ NPT_String m_MimeType;
+ NPT_Int32 m_Width;
+ NPT_Int32 m_Height;
+ NPT_Int32 m_Depth;
+ NPT_String m_UrlPath;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceData class
++---------------------------------------------------------------------*/
+class PLT_DeviceData
+{
+public:
+ PLT_DeviceData(
+ NPT_HttpUrl description_url = NPT_HttpUrl(NULL, 0, "/"),
+ const char* uuid = "",
+ NPT_TimeInterval lease_time = NPT_TimeInterval(1800, 0),
+ const char* device_type = "",
+ const char* friendly_name = "");
+
+ /* Getters */
+ virtual NPT_Result GetDescription(NPT_String& desc);
+ virtual NPT_String GetDescriptionUrl(const char* bind_addr = NULL);
+ virtual NPT_HttpUrl GetURLBase();
+ virtual NPT_Result GetDescription(NPT_XmlElementNode* parent, NPT_XmlElementNode** device = NULL);
+ virtual NPT_String GetIconUrl(const char* mimetype = NULL, NPT_Int32 maxsize = 0, NPT_Int32 maxdepth = 0);
+
+ const NPT_TimeInterval& GetLeaseTime() const { return m_LeaseTime; }
+ const NPT_String& GetUUID() const { return m_UUID; }
+ const NPT_String& GetFriendlyName() const { return m_FriendlyName; }
+ const NPT_String& GetType() const { return m_DeviceType; }
+ const NPT_String& GetModelDescription() const { return m_ModelDescription; }
+ const NPT_String& GetParentUUID() const { return m_ParentUUID; }
+
+ const NPT_Array& GetServices() const { return m_Services; }
+ const NPT_Array& GetEmbeddedDevices() const { return m_EmbeddedDevices; }
+
+ NPT_Result FindEmbeddedDeviceByType(const char* type, PLT_DeviceDataReference& device);
+ NPT_Result FindServiceById(const char* id, PLT_Service*& service);
+ NPT_Result FindServiceByType(const char* type, PLT_Service*& service);
+ NPT_Result FindServiceByDescriptionURI(const char* uri, PLT_Service*& service);
+ NPT_Result FindServiceByControlURI(const char* uri, PLT_Service*& service);
+ NPT_Result FindServiceByEventSubURI(const char* uri, PLT_Service*& service);
+
+ /* called by PLT_Device subclasses */
+ NPT_Result AddDevice(PLT_DeviceDataReference& device);
+ NPT_Result AddService(PLT_Service* service);
+
+ NPT_Result ToLog(int level = NPT_LOG_LEVEL_FINE);
+
+protected:
+ virtual ~PLT_DeviceData();
+ virtual void Cleanup();
+ virtual NPT_Result OnAddExtraInfo(NPT_XmlElementNode* /*device_node*/) { return NPT_SUCCESS; }
+
+private:
+ /* called by PLT_CtrlPoint when new device is discovered */
+ NPT_Result SetURLBase(NPT_HttpUrl& url_base);
+ NPT_TimeStamp GetLeaseTimeLastUpdate();
+ NPT_Result SetLeaseTime(NPT_TimeInterval lease_time);
+ NPT_Result SetDescription(const char* szDescription,
+ const NPT_IpAddress& local_iface_ip);
+ NPT_Result SetDescriptionDevice(NPT_XmlElementNode* device_node);
+
+public:
+ NPT_String m_Manufacturer;
+ NPT_String m_ManufacturerURL;
+ NPT_String m_ModelDescription;
+ NPT_String m_ModelName;
+ NPT_String m_ModelNumber;
+ NPT_String m_ModelURL;
+ NPT_String m_SerialNumber;
+ NPT_String m_UPC;
+ NPT_String m_PresentationURL;
+ NPT_String m_DlnaDoc;
+ NPT_String m_DlnaCap;
+
+protected:
+ friend class NPT_Reference;
+ friend class PLT_DeviceDataFinder;
+ friend class PLT_DeviceDataFinderByType;
+ friend class PLT_CtrlPoint;
+ friend class PLT_DeviceReadyIterator;
+ friend class PLT_DeviceHost;
+
+ //members
+ NPT_String m_ParentUUID;
+ NPT_String m_UUID;
+ NPT_HttpUrl m_URLDescription;
+ NPT_String m_URLBasePath;
+ NPT_String m_DeviceType;
+ NPT_String m_FriendlyName;
+ NPT_TimeInterval m_LeaseTime;
+ NPT_TimeStamp m_LeaseTimeLastUpdate;
+ NPT_Array m_Services;
+ NPT_Array m_EmbeddedDevices;
+ NPT_Array m_Icons;
+
+ /* IP address of interface used when retrieving device description.
+ We need the info for the control point subscription callback */
+ NPT_IpAddress m_LocalIfaceIp;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceDataFinder
++---------------------------------------------------------------------*/
+class PLT_DeviceDataFinder
+{
+public:
+ // methods
+ PLT_DeviceDataFinder(const char* uuid) : m_UUID(uuid) {}
+ virtual ~PLT_DeviceDataFinder() {}
+
+ bool operator()(const PLT_DeviceDataReference& data) const {
+ return data->m_UUID.Compare(m_UUID, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_UUID;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceDataFinderByType
++---------------------------------------------------------------------*/
+class PLT_DeviceDataFinderByType
+{
+public:
+ // methods
+ PLT_DeviceDataFinderByType(const char* type) : m_Type(type) {}
+ virtual ~PLT_DeviceDataFinderByType() {}
+
+ bool operator()(const PLT_DeviceDataReference& data) const {
+ return data->m_DeviceType.Compare(m_Type, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Type;
+};
+
+#endif /* _PLT_DEVICE_DATA_H_ */
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltDeviceHost.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltDeviceHost.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,775 @@
+/*****************************************************************
+|
+| Platinum - Device Host
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltService.h"
+#include "PltDeviceHost.h"
+#include "PltUPnP.h"
+#include "PltXmlHelper.h"
+#include "PltSsdp.h"
+#include "PltHttpServer.h"
+#include "PltVersion.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.devicehost")
+
+/*----------------------------------------------------------------------
+| typedef
++---------------------------------------------------------------------*/
+typedef PLT_HttpRequestHandler PLT_HttpDeviceHostRequestHandler;
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::PLT_DeviceHost
++---------------------------------------------------------------------*/
+PLT_DeviceHost::PLT_DeviceHost(const char* description_path /* = "/" */,
+ const char* uuid /* = "" */,
+ const char* device_type /* = "" */,
+ const char* friendly_name /* = "" */,
+ bool show_ip /* = false */,
+ NPT_UInt16 port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_DeviceData(NPT_HttpUrl(NULL, 0, description_path),
+ uuid,
+ NPT_TimeInterval(1800, 0),
+ device_type,
+ friendly_name),
+ m_HttpServer(NULL),
+ m_Broadcast(false),
+ m_Port(port),
+ m_PortRebind(port_rebind)
+{
+ if (show_ip) {
+ NPT_List ips;
+ PLT_UPnPMessageHelper::GetIPAddresses(ips);
+ if (ips.GetItemCount()) {
+ m_FriendlyName += " (" + *ips.GetFirstItem() + ")";
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::~PLT_DeviceHost
++---------------------------------------------------------------------*/
+PLT_DeviceHost::~PLT_DeviceHost()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::AddIcon
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::AddIcon(const PLT_DeviceIcon& icon, const char* filepath)
+{
+ NPT_HttpFileRequestHandler* icon_handler =
+ new NPT_HttpFileRequestHandler(icon.m_UrlPath, filepath);
+ m_HttpServer->AddRequestHandler(icon_handler, icon.m_UrlPath, false);
+ m_RequestHandlers.Add(icon_handler);
+ return m_Icons.Add(icon);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::AddIcon
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::AddIcon(const PLT_DeviceIcon& icon,
+ const void* data,
+ NPT_Size size,
+ bool copy /* = true */)
+{
+ NPT_HttpStaticRequestHandler* icon_handler =
+ new NPT_HttpStaticRequestHandler(
+ data,
+ size,
+ icon.m_MimeType,
+ copy);
+ m_HttpServer->AddRequestHandler(icon_handler, icon.m_UrlPath, false);
+ m_RequestHandlers.Add(icon_handler);
+ return m_Icons.Add(icon);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::SetupIcons
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::SetupIcons()
+{
+ AddIcon(
+ PLT_DeviceIcon("image/jpeg", 120, 120, 24, "/images/platinum-120x120.jpg"),
+ "platinum-120x120.jpg");
+ AddIcon(
+ PLT_DeviceIcon("image/jpeg", 48, 48, 24, "/images/platinum-48x48.jpg"),
+ "platinum-48x48.jpg");
+ AddIcon(
+ PLT_DeviceIcon("image/png", 120, 120, 24, "/images/platinum-120x120.png"),
+ "platinum-120x120.png");
+ AddIcon(
+ PLT_DeviceIcon("image/png", 48, 48, 24, "/images/platinum-48x48.png"),
+ "platinum-48x48.png");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::SetupDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::SetupDevice()
+{
+ NPT_CHECK_WARNING(SetupIcons());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::SetupServiceSCPDHandler
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::SetupServiceSCPDHandler(PLT_Service* service)
+{
+ NPT_HttpUrl url;
+ NPT_String doc;
+
+ // static scpd document
+ NPT_String scpd_url = service->GetSCPDURL();
+ if (!scpd_url.StartsWith("/")) {
+ scpd_url = GetURLBase().GetPath() + scpd_url;
+ }
+ url.SetPathPlus(scpd_url);
+ NPT_CHECK_FATAL(service->GetSCPDXML(doc));
+
+ NPT_HttpStaticRequestHandler* scpd_handler = new NPT_HttpStaticRequestHandler(doc, "text/xml");
+ m_HttpServer->AddRequestHandler(scpd_handler, url.GetPath(), false);
+ m_RequestHandlers.Add(scpd_handler);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::Start(PLT_SsdpListenTask* task)
+{
+ // TODO: We should reuse address otherwise we might fail if we're passed the same port during fast restart
+#ifdef _XBOX
+ m_HttpServer = new PLT_HttpServer(m_Port, m_PortRebind, 5);
+#else
+ m_HttpServer = new PLT_HttpServer(m_Port, m_PortRebind, 20); // limit to 20 threads max
+#endif
+
+ NPT_CHECK_FATAL(SetupServices(*this));
+
+ // start the server
+ NPT_CHECK_SEVERE(m_HttpServer->Start());
+
+ // read back assigned port in case
+ // we passed 0 to randomly select one
+ m_Port = m_HttpServer->GetPort();
+ m_URLDescription.SetPort(m_Port);
+
+ // callback to initialize the device
+ NPT_CHECK_FATAL(SetupDevice());
+
+ // set up static handlers first as the order is important
+
+ // services static root device scpd documents
+ for (NPT_Cardinal i=0; im_Services.GetItemCount(); i++) {
+ SetupServiceSCPDHandler(m_EmbeddedDevices[j]->m_Services[i]);
+ }
+ }
+
+ // all other requests including description document
+ // and service control are dynamically handled
+ PLT_HttpDeviceHostRequestHandler* device_handler = new PLT_HttpDeviceHostRequestHandler(this);
+ m_RequestHandlers.Add(device_handler);
+ m_HttpServer->AddRequestHandler(device_handler, "/", true);
+
+ // we should not advertise right away
+ // spec says randomly less than 100ms
+ NPT_TimeInterval delay(0, NPT_System::GetRandomInteger() % 100000000);
+
+ // calculate when we should send another announcement
+ NPT_Size leaseTime = (NPT_Size)(float)GetLeaseTime();
+ NPT_TimeInterval repeat;
+ repeat.m_Seconds = leaseTime?(int)((leaseTime >> 1) + ((unsigned short)NPT_System::GetRandomInteger() % (leaseTime >> 2))):30;
+
+ // the XBOX cannot receive multicast, so we blast every 7 secs
+#ifdef _XBOX
+ repeat.m_Seconds = 7;
+#endif
+
+ PLT_ThreadTask* announce_task = new PLT_SsdpDeviceAnnounceTask(
+ this,
+ repeat,
+ true,
+ m_Broadcast);
+ m_TaskManager.StartTask(announce_task, &delay);
+
+ // register ourselves as a listener for ssdp requests
+ task->AddListener(this);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::Stop(PLT_SsdpListenTask* task)
+{
+ // unregister ourselves as a listener for ssdp requests
+ task->RemoveListener(this);
+
+ // remove all our running tasks
+ m_TaskManager.StopAllTasks();
+
+ if (m_HttpServer) {
+ // stop our internal http server
+ m_HttpServer->Stop();
+ delete m_HttpServer;
+ m_HttpServer = NULL;
+
+ // notify we're gone
+ NPT_List if_list;
+ PLT_UPnPMessageHelper::GetNetworkInterfaces(if_list);
+ if_list.Apply(PLT_SsdpAnnounceInterfaceIterator(this, true, m_Broadcast));
+ if_list.Apply(NPT_ObjectDeleter());
+ }
+
+ m_RequestHandlers.Apply(NPT_ObjectDeleter());
+ m_RequestHandlers.Clear();
+
+ PLT_DeviceData::Cleanup();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::Announce
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::Announce(PLT_DeviceData* device,
+ NPT_HttpRequest& req,
+ NPT_UdpSocket& socket,
+ bool byebye)
+{
+ NPT_Result res = NPT_SUCCESS;
+
+ NPT_LOG_INFO_3("Sending SSDP NOTIFY (%s) Request to %s with location:%s",
+ byebye?"ssdp:byebye":"ssdp:alive",
+ (const char*)req.GetUrl().ToString(),
+ (const char*)(PLT_UPnPMessageHelper::GetLocation(req)?*PLT_UPnPMessageHelper::GetLocation(req):""));
+
+ if (byebye == false) {
+ // get location URL based on ip address of interface
+ PLT_UPnPMessageHelper::SetNTS(req, "ssdp:alive");
+ PLT_UPnPMessageHelper::SetLeaseTime(req, (NPT_Timeout)(float)device->GetLeaseTime());
+ PLT_UPnPMessageHelper::SetServer(req, NPT_HttpServer::m_ServerHeader, false);
+ } else {
+ PLT_UPnPMessageHelper::SetNTS(req, "ssdp:byebye");
+ }
+
+ // target address
+ NPT_IpAddress ip;
+ if (NPT_FAILED(res = ip.ResolveName(req.GetUrl().GetHost()))) {
+ return res;
+ }
+ NPT_SocketAddress addr(ip, req.GetUrl().GetPort());
+
+ // upnp:rootdevice
+ if (device->m_ParentUUID.IsEmpty()) {
+ PLT_SsdpSender::SendSsdp(req,
+ NPT_String("uuid:" + device->m_UUID + "::upnp:rootdevice"),
+ "upnp:rootdevice",
+ socket,
+ true,
+ &addr);
+ }
+
+ // uuid:device-UUID::urn:schemas-upnp-org:device:deviceType:ver
+ PLT_SsdpSender::SendSsdp(req,
+ NPT_String("uuid:" + device->m_UUID + "::" + device->m_DeviceType),
+ device->m_DeviceType,
+ socket,
+ true,
+ &addr);
+
+ // services
+ for (int i=0; i < (int)device->m_Services.GetItemCount(); i++) {
+ // uuid:device-UUID::urn:schemas-upnp-org:service:serviceType:ver
+ PLT_SsdpSender::SendSsdp(req,
+ NPT_String("uuid:" + device->m_UUID + "::" + device->m_Services[i]->GetServiceType()),
+ device->m_Services[i]->GetServiceType(),
+ socket,
+ true,
+ &addr);
+ }
+
+ // uuid:device-UUID
+ PLT_SsdpSender::SendSsdp(req,
+ "uuid:" + device->m_UUID,
+ "uuid:" + device->m_UUID,
+ socket,
+ true,
+ &addr);
+
+
+ // embedded devices
+ for (int j=0; j < (int)device->m_EmbeddedDevices.GetItemCount(); j++) {
+ Announce(device->m_EmbeddedDevices[j].AsPointer(),
+ req,
+ socket,
+ byebye);
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessHttpRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ // get the address of who sent us some data back*/
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String protocol = request.GetProtocol();
+
+ if (method.Compare("POST") == 0) {
+ return ProcessHttpPostRequest(request, context, response);
+ } else if (method.Compare("SUBSCRIBE") == 0 || method.Compare("UNSUBSCRIBE") == 0) {
+ return ProcessHttpSubscriberRequest(request, context, response);
+ } else if (method.Compare("GET") == 0) {
+ if (request.GetUrl().GetPath() == m_URLDescription.GetPath()) {
+ return ProcessGetDescription(request, context, response);
+ }
+ }
+
+ response.SetStatus(405, "Bad Request");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessGetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessGetDescription(NPT_HttpRequest& /*request*/,
+ const NPT_HttpRequestContext& /*context*/,
+ NPT_HttpResponse& response)
+{
+ NPT_String doc;
+ NPT_CHECK_FATAL(GetDescription(doc));
+ PLT_HttpHelper::SetBody(response, doc);
+ PLT_HttpHelper::SetContentType(response, "text/xml");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessPostRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessHttpPostRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_Result res;
+ NPT_String service_type;
+ NPT_String str;
+ NPT_XmlElementNode* xml = NULL;
+ NPT_String soap_action_header;
+ PLT_Service* service;
+ NPT_XmlElementNode* soap_body;
+ NPT_XmlElementNode* soap_action;
+ const NPT_String* attr;
+ PLT_ActionDesc* action_desc;
+ PLT_ActionReference action;
+ NPT_MemoryStreamReference resp(new NPT_MemoryStream);
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String url = request.GetUrl().ToRequestString(true);
+ NPT_String protocol = request.GetProtocol();
+
+ if (NPT_FAILED(FindServiceByControlURI(url, service)))
+ goto bad_request;
+
+ if (!request.GetHeaders().GetHeaderValue("SOAPAction"))
+ goto bad_request;
+
+ // extract the soap action name from the header
+ soap_action_header = *request.GetHeaders().GetHeaderValue("SOAPAction");
+ soap_action_header.TrimLeft('"');
+ soap_action_header.TrimRight('"');
+ char prefix[200];
+ char soap_action_name[100];
+ int ret;
+ //FIXME: no sscanf
+ ret = sscanf(soap_action_header, "%[^#]#%s",
+ prefix,
+ soap_action_name);
+ if (ret != 2)
+ goto bad_request;
+
+ // read the xml body and parse it
+ if (NPT_FAILED(PLT_HttpHelper::ParseBody(request, xml)))
+ goto bad_request;
+
+ // check envelope
+ if (xml->GetTag().Compare("Envelope", true))
+ goto bad_request;
+
+ // check namespace
+ if (!xml->GetNamespace() || xml->GetNamespace()->Compare("http://schemas.xmlsoap.org/soap/envelope/"))
+ goto bad_request;
+
+ // check encoding
+ attr = xml->GetAttribute("encodingStyle", "http://schemas.xmlsoap.org/soap/envelope/");
+ if (!attr || attr->Compare("http://schemas.xmlsoap.org/soap/encoding/"))
+ goto bad_request;
+
+ // read action
+ soap_body = PLT_XmlHelper::GetChild(xml, "Body");
+ if (soap_body == NULL)
+ goto bad_request;
+
+ PLT_XmlHelper::GetChild(soap_body, soap_action);
+ if (soap_action == NULL)
+ goto bad_request;
+
+ // verify action name is identical to SOAPACTION header*/
+ if (soap_action->GetTag().Compare(soap_action_name, true))
+ goto bad_request;
+
+ // verify namespace
+ if (!soap_action->GetNamespace() || soap_action->GetNamespace()->Compare(service->GetServiceType()))
+ goto bad_request;
+
+ // create a buffer for our response body and call the service
+ if ((action_desc = service->FindActionDesc(soap_action_name)) == NULL) {
+ res = NPT_FAILURE;
+ // create a bastard soap response
+ PLT_Action::FormatSoapError(401, "Invalid Action", *resp);
+ goto error;
+ }
+
+ // create an action object
+ action = new PLT_Action(action_desc);
+
+ // read all the arguments if any
+ for (NPT_List::Iterator args = soap_action->GetChildren().GetFirstItem(); args; args++) {
+ NPT_XmlElementNode* child = (*args)->AsElementNode();
+ if (!child) continue;
+
+ // Total HACK for xbox360 upnp uncompliance!
+ NPT_String name = child->GetTag();
+ if (action_desc->GetName() == "Browse" && name == "ContainerID") {
+ name = "ObjectID";
+ }
+
+ res = action->SetArgumentValue(
+ name,
+ child->GetText()?*child->GetText():"");
+
+ if (NPT_FAILED(res)) {
+ // FIXME: incorrect upnp error?
+ PLT_Action::FormatSoapError(401, "Invalid Action", *resp);
+ goto error;
+ }
+ }
+
+ if (NPT_FAILED(action->VerifyArguments(true))) {
+ action->SetError(402, "Invalid Args");
+ goto error;
+ }
+
+ // call the virtual function, it's all good
+ // set the error in case the it wasn't done
+ if (NPT_FAILED(OnAction(action, PLT_HttpRequestContext(request, context)))) {
+ goto error;
+ }
+
+ // create the soap response now
+ action->FormatSoapResponse(*resp);
+ goto done;
+
+error:
+ if (!action.IsNull() && action->GetErrorCode() == 0) {
+ action->SetError(501, "Action Failed");
+ action->FormatSoapResponse(*resp);
+ }
+ response.SetStatus(500, "Internal Server Error");
+
+done:
+ //args.Apply(NPT_ObjectDeleter());
+
+ NPT_LargeSize resp_body_size;
+ if (NPT_SUCCEEDED(resp->GetAvailable(resp_body_size))) {
+ PLT_HttpHelper::SetContentType(response, "text/xml; charset=\"utf-8\"");
+ response.GetHeaders().SetHeader("Ext", ""); // should only be for M-POST but oh well
+ NPT_InputStreamReference input = resp;
+ PLT_HttpHelper::SetBody(response, input);
+ }
+
+ delete xml;
+ return NPT_SUCCESS;
+
+bad_request:
+ delete xml;
+ response.SetStatus(400, "Bad Request");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessHttpSubscriberRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessHttpSubscriberRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String url = request.GetUrl().ToRequestString(true);
+ NPT_String protocol = request.GetProtocol();
+
+ const NPT_String* nt = PLT_UPnPMessageHelper::GetNT(request);
+ const NPT_String* callback_urls = PLT_UPnPMessageHelper::GetCallbacks(request);
+ const NPT_String* sid = PLT_UPnPMessageHelper::GetSID(request);
+
+ PLT_Service* service;
+ if (NPT_FAILED(FindServiceByEventSubURI(url, service))) {
+ goto cleanup;
+ }
+
+ if (method.Compare("SUBSCRIBE") == 0) {
+ // Do we have a sid ?
+ if (sid) {
+ // make sure we don't have a callback nor a nt
+ if (nt || callback_urls) {
+ goto cleanup;
+ }
+
+ NPT_Int32 timeout;
+ if (NPT_FAILED(PLT_UPnPMessageHelper::GetTimeOut(request, timeout))) {
+ timeout = 1800;
+ }
+ // subscription renewed
+ // send the info to the service
+ service->ProcessRenewSubscription(context.GetLocalAddress(),
+ *sid,
+ timeout,
+ response);
+ return NPT_SUCCESS;
+ } else {
+ // new subscription ?
+ // verify nt is present and valid
+ if (!nt || nt->Compare("upnp:event", true)) {
+ response.SetStatus(412, "Precondition failed");
+ return NPT_FAILURE;
+ }
+ // verify callback is present
+ if (!callback_urls) {
+ response.SetStatus(412, "Precondition failed");
+ return NPT_FAILURE;
+ }
+
+ NPT_Int32 timeout;
+ if (NPT_FAILED(PLT_UPnPMessageHelper::GetTimeOut(request, timeout))) {
+ timeout = 1800;
+ }
+
+ // send the info to the service
+ service->ProcessNewSubscription(&m_TaskManager,
+ context.GetLocalAddress(),
+ *callback_urls,
+ timeout,
+ response);
+ return NPT_SUCCESS;
+ }
+ } else if (method.Compare("UNSUBSCRIBE") == 0) {
+ // Do we have a sid ?
+ if (sid && sid->GetLength() > 0) {
+ // make sure we don't have a callback nor a nt
+ if (nt || callback_urls) {
+ goto cleanup;
+ }
+
+ // subscription cancelled
+ // send the info to the service
+ service->ProcessCancelSubscription(context.GetLocalAddress(),
+ *sid,
+ response);
+ return NPT_SUCCESS;
+ }
+ }
+
+cleanup:
+ response.SetStatus(405, "Bad Request");
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::OnSsdpPacket
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::OnSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ return ProcessSsdpSearchRequest(request, context);
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::ProcessSsdpSearchRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::ProcessSsdpSearchRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context)
+{
+ // get the address of who sent us some data back*/
+ NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString();
+ NPT_String method = request.GetMethod();
+ NPT_String url = request.GetUrl().ToRequestString(true);
+ NPT_String protocol = request.GetProtocol();
+
+ if (method.Compare("M-SEARCH") == 0) {
+ NPT_LOG_INFO_1("Received M-SEARCH from %s", (const char*) ip_address);
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, &request);
+
+ if (url.Compare("*") || protocol.Compare("HTTP/1.1"))
+ return NPT_FAILURE;
+
+ const NPT_String* st = PLT_UPnPMessageHelper::GetST(request);
+ NPT_CHECK_POINTER_SEVERE(st);
+
+ const NPT_String* man = PLT_UPnPMessageHelper::GetMAN(request);
+ if (!man || man->Compare("\"ssdp:discover\"", true))
+ return NPT_FAILURE;
+
+ NPT_UInt32 mx;
+ if (NPT_FAILED(PLT_UPnPMessageHelper::GetMX(request, mx)))
+ return NPT_FAILURE;
+
+ // create a task to respond to the request
+ NPT_TimeInterval timer((mx==0)?0:((int)(0 + ((unsigned short)NPT_System::GetRandomInteger() % ((mx>10)?10:mx)))), 0);
+ PLT_SsdpDeviceSearchResponseTask* task = new PLT_SsdpDeviceSearchResponseTask(this, context.GetRemoteAddress(), *st);
+ m_TaskManager.StartTask(task, &timer);
+ return NPT_SUCCESS;
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::SendSsdpSearchResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::SendSsdpSearchResponse(PLT_DeviceData* device,
+ NPT_HttpResponse& response,
+ NPT_UdpSocket& socket,
+ const char* st,
+ const NPT_SocketAddress* addr /* = NULL */)
+{
+ NPT_LOG_INFO_1("Responding to a M-SEARCH request for %s", st);
+
+ // ssdp:all or upnp:rootdevice
+ if (NPT_String::Compare(st, "ssdp:all") == 0 || NPT_String::Compare(st, "upnp:rootdevice") == 0) {
+ if (device->m_ParentUUID.IsEmpty()) {
+ // upnp:rootdevice
+ PLT_SsdpSender::SendSsdp(response,
+ NPT_String("uuid:" + device->m_UUID + "::upnp:rootdevice"),
+ "upnp:rootdevice",
+ socket,
+ false,
+ addr);
+ }
+ }
+
+ // uuid:device-UUID
+ if (NPT_String::Compare(st, "ssdp:all", false) == 0 || NPT_String::Compare(st, "uuid:" + device->m_UUID, false) == 0) {
+ // uuid:device-UUID
+ PLT_SsdpSender::SendSsdp(response,
+ "uuid:" + device->m_UUID,
+ "uuid:" + device->m_UUID,
+ socket,
+ false,
+ addr);
+ }
+
+ // urn:schemas-upnp-org:device:deviceType:ver
+ if (NPT_String::Compare(st, "ssdp:all", false) == 0 || NPT_String::Compare(st, device->m_DeviceType, false) == 0) {
+ // uuid:device-UUID::urn:schemas-upnp-org:device:deviceType:ver
+ PLT_SsdpSender::SendSsdp(response,
+ NPT_String("uuid:" + device->m_UUID + "::" + device->m_DeviceType),
+ device->m_DeviceType,
+ socket,
+ false,
+ addr);
+ }
+
+ // services
+ for (int i=0; i < (int)device->m_Services.GetItemCount(); i++) {
+ if (NPT_String::Compare(st, "ssdp:all", false) == 0 || NPT_String::Compare(st, device->m_Services[i]->GetServiceType(), false) == 0) {
+ // uuid:device-UUID::urn:schemas-upnp-org:service:serviceType:ver
+ PLT_SsdpSender::SendSsdp(response,
+ NPT_String("uuid:" + device->m_UUID + "::" + device->m_Services[i]->GetServiceType()),
+ device->m_Services[i]->GetServiceType(),
+ socket,
+ false,
+ addr);
+ }
+ }
+
+ // embedded devices
+ for (int j=0; j < (int)device->m_EmbeddedDevices.GetItemCount(); j++) {
+ SendSsdpSearchResponse(device->m_EmbeddedDevices[j].AsPointer(), response, socket, st, addr);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost::OnAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_DeviceHost::OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+ action->SetError(401, "Invalid Action");
+ return NPT_FAILURE;
+}
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltDeviceHost.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltDeviceHost.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,163 @@
+/*****************************************************************
+|
+| Platinum - Device Host
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_DEVICE_HOST_H_
+#define _PLT_DEVICE_HOST_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltDeviceData.h"
+#include "PltHttpServerListener.h"
+#include "PltSsdpListener.h"
+#include "PltTaskManager.h"
+#include "PltAction.h"
+#include "PltHttp.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_HttpServer;
+class PLT_HttpServerHandler;
+class PLT_SsdpDeviceAnnounceTask;
+class PLT_SsdpListenTask;
+
+/*----------------------------------------------------------------------
+| PLT_DeviceHost class
++---------------------------------------------------------------------*/
+class PLT_DeviceHost : public PLT_DeviceData,
+ public PLT_SsdpPacketListener
+{
+public:
+ PLT_DeviceHost(const char* description_path = "/",
+ const char* uuid = "",
+ const char* device_type = "",
+ const char* friendly_name = "",
+ bool show_ip = false,
+ NPT_UInt16 port = 0,
+ bool port_rebind = false);
+
+ // public methods
+ virtual void SetBroadcast(bool broadcast) { m_Broadcast = broadcast; }
+ virtual NPT_UInt16 GetPort() { return m_Port; };
+
+ // NPT_HttpRequestHandler forward for control/event requests
+ virtual NPT_Result ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+ // PLT_SsdpDeviceAnnounceTask & PLT_SsdpDeviceAnnounceUnicastTask
+ virtual NPT_Result Announce(PLT_DeviceData* device,
+ NPT_HttpRequest& request,
+ NPT_UdpSocket& socket,
+ bool byebye);
+
+ virtual NPT_Result Announce(NPT_HttpRequest& request,
+ NPT_UdpSocket& socket,
+ bool byebye) {
+ return Announce(this, request, socket, byebye);
+ }
+
+ // PLT_SsdpPacketListener method
+ virtual NPT_Result OnSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context);
+
+ // PLT_SsdpDeviceSearchListenTask
+ virtual NPT_Result ProcessSsdpSearchRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context);
+
+ // PLT_SsdpDeviceSearchResponseTask
+ virtual NPT_Result SendSsdpSearchResponse(PLT_DeviceData* device,
+ NPT_HttpResponse& response,
+ NPT_UdpSocket& socket,
+ const char* st,
+ const NPT_SocketAddress* addr = NULL);
+ virtual NPT_Result SendSsdpSearchResponse(NPT_HttpResponse& response,
+ NPT_UdpSocket& socket,
+ const char* ST,
+ const NPT_SocketAddress* addr = NULL) {
+ return SendSsdpSearchResponse(this, response, socket, ST, addr);
+ }
+
+protected:
+ virtual ~PLT_DeviceHost();
+
+ // pure methods
+ virtual NPT_Result SetupServices(PLT_DeviceData& data) = 0;
+
+ // setup methods
+ virtual NPT_Result SetupIcons();
+ virtual NPT_Result SetupDevice();
+
+ // overridable methods
+ virtual NPT_Result AddIcon(const PLT_DeviceIcon& icon,
+ const char* filepath);
+ virtual NPT_Result AddIcon(const PLT_DeviceIcon& icon,
+ const void* data,
+ NPT_Size size,
+ bool copy = true);
+ virtual NPT_Result Start(PLT_SsdpListenTask* task);
+ virtual NPT_Result Stop(PLT_SsdpListenTask* task);
+ virtual NPT_Result SetupServiceSCPDHandler(PLT_Service* service);
+ virtual NPT_Result OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result ProcessGetDescription(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+ virtual NPT_Result ProcessHttpPostRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+ virtual NPT_Result ProcessHttpSubscriberRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+protected:
+ friend class PLT_UPnP;
+ friend class PLT_UPnP_DeviceStartIterator;
+ friend class PLT_UPnP_DeviceStopIterator;
+ friend class PLT_Service;
+ friend class NPT_Reference;
+
+private:
+ PLT_TaskManager m_TaskManager;
+ PLT_HttpServer* m_HttpServer;
+ bool m_Broadcast;
+ NPT_UInt16 m_Port;
+ bool m_PortRebind;
+ NPT_List m_RequestHandlers;
+};
+
+typedef NPT_Reference PLT_DeviceHostReference;
+
+#endif /* _PLT_DEVICE_HOST_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltDownloader.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltDownloader.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,135 @@
+/*****************************************************************
+|
+| Platinum - Downloader
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDownloader.h"
+#include "PltTaskManager.h"
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::PLT_Downloader
++---------------------------------------------------------------------*/
+PLT_Downloader::PLT_Downloader(PLT_TaskManager* task_manager,
+ const char* url,
+ NPT_OutputStreamReference& output) :
+ m_URL(url),
+ m_Output(output),
+ m_TaskManager(task_manager),
+ m_Task(NULL),
+ m_State(PLT_DOWNLOADER_IDLE)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::~PLT_Downloader
++---------------------------------------------------------------------*/
+PLT_Downloader::~PLT_Downloader()
+{
+ Stop();
+}
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Downloader::Start()
+{
+ Stop();
+
+ m_Task = new PLT_HttpDownloadTask(NPT_HttpUrl(m_URL), this);
+ NPT_Result res = m_TaskManager->StartTask(m_Task, NULL, false);
+ if (NPT_FAILED(res)) {
+ m_State = PLT_DOWNLOADER_ERROR;
+ return res;
+ }
+
+ m_State = PLT_DOWNLOADER_STARTED;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Downloader::Stop()
+{
+ if (m_Task) {
+ m_Task->Kill();
+ m_Task = NULL;
+ }
+
+ m_State = PLT_DOWNLOADER_IDLE;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Downloader::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Downloader::ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+
+ if (NPT_FAILED(res)) {
+ m_State = PLT_DOWNLOADER_ERROR;
+ return res;
+ }
+
+ m_State = PLT_DOWNLOADER_DOWNLOADING;
+
+ NPT_HttpEntity* entity;
+ NPT_InputStreamReference body;
+ if (!response || !(entity = response->GetEntity()) || NPT_FAILED(entity->GetInputStream(body))) {
+ m_State = PLT_DOWNLOADER_ERROR;
+ return NPT_FAILURE;
+ }
+
+ // Read body (no content length means until socket is closed)
+ res = NPT_StreamToStreamCopy(*body.AsPointer(),
+ *m_Output.AsPointer(),
+ 0,
+ entity->GetContentLength());
+
+ if (NPT_FAILED(res)) {
+ m_State = PLT_DOWNLOADER_ERROR;
+ return res;
+ }
+
+ m_State = PLT_DOWNLOADER_SUCCESS;
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltDownloader.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltDownloader.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,91 @@
+/*****************************************************************
+|
+||
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_DOWNLOADER_H_
+#define _PLT_DOWNLOADER_H_
+
+/*----------------------------------------------------------------------
+| Includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttpClientTask.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Downloader;
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef PLT_HttpClientTask PLT_HttpDownloadTask;
+
+typedef enum {
+ PLT_DOWNLOADER_IDLE,
+ PLT_DOWNLOADER_STARTED,
+ PLT_DOWNLOADER_DOWNLOADING,
+ PLT_DOWNLOADER_ERROR,
+ PLT_DOWNLOADER_SUCCESS
+} Plt_DowloaderState;
+
+/*----------------------------------------------------------------------
+| PLT_Downloader class
++---------------------------------------------------------------------*/
+class PLT_Downloader
+{
+public:
+ PLT_Downloader(PLT_TaskManager* task_manager,
+ const char* url,
+ NPT_OutputStreamReference& output);
+ virtual ~PLT_Downloader();
+
+ NPT_Result Start();
+ NPT_Result Stop();
+ Plt_DowloaderState GetState() { return m_State; }
+
+ // PLT_HttpClientTask method
+ NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+
+private:
+ // members
+ NPT_String m_URL;
+ NPT_OutputStreamReference m_Output;
+ PLT_TaskManager* m_TaskManager;
+ PLT_HttpDownloadTask* m_Task;
+ Plt_DowloaderState m_State;
+};
+
+#endif /* _PLT_DOWNLOADER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltEvent.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltEvent.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,261 @@
+/*****************************************************************
+|
+| Platinum - Control/Event
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltTaskManager.h"
+#include "PltEvent.h"
+#include "PltService.h"
+#include "PltUPnP.h"
+#include "PltDeviceData.h"
+#include "PltXmlHelper.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.event")
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::PLT_EventSubscriber
++---------------------------------------------------------------------*/
+PLT_EventSubscriber::PLT_EventSubscriber(PLT_TaskManager* task_manager,
+ PLT_Service* service,
+ const char* sid,
+ int timeout /* = -1 */) :
+ m_TaskManager(task_manager),
+ m_Service(service),
+ m_EventKey(0),
+ m_SubscriberTask(NULL),
+ m_SID(sid)
+{
+ NPT_LOG_FINE_1("Creating new subscriber (%s)", m_SID.GetChars());
+ SetTimeout(timeout);
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::~PLT_EventSubscriber
++---------------------------------------------------------------------*/
+PLT_EventSubscriber::~PLT_EventSubscriber()
+{
+ NPT_LOG_FINE_1("Deleting subscriber (%s)", m_SID.GetChars());
+ if (m_SubscriberTask) {
+ m_SubscriberTask->Kill();
+ m_SubscriberTask = NULL;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::GetService
++---------------------------------------------------------------------*/
+PLT_Service*
+PLT_EventSubscriber::GetService()
+{
+ return m_Service;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::GetEventKey
++---------------------------------------------------------------------*/
+NPT_Ordinal
+PLT_EventSubscriber::GetEventKey()
+{
+ return m_EventKey;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::SetEventKey
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::SetEventKey(NPT_Ordinal value)
+{
+ m_EventKey = value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::GetLocalIf
++---------------------------------------------------------------------*/
+NPT_SocketAddress
+PLT_EventSubscriber::GetLocalIf()
+{
+ return m_LocalIf;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::SetLocalIf
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::SetLocalIf(NPT_SocketAddress value)
+{
+ m_LocalIf = value;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::GetExpirationTime
++---------------------------------------------------------------------*/
+// a TimeStamp of 0 means no expiration
+NPT_TimeStamp
+PLT_EventSubscriber::GetExpirationTime()
+{
+ return m_ExpirationTime;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::SetExpirationTime
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::SetTimeout(int timeout /* = -1 */)
+{
+ NPT_LOG_FINE_2("subscriber (%s) expiring in %d seconds",
+ m_SID.GetChars(),
+ timeout);
+
+ // -1 means infinite so we set an expiration time of 0
+ if (timeout == -1) {
+ m_ExpirationTime = NPT_TimeStamp(0, 0);
+ } else {
+ NPT_System::GetCurrentTimeStamp(m_ExpirationTime);
+ m_ExpirationTime += NPT_TimeInterval(timeout, 0);
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::FindCallbackURL
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::FindCallbackURL(const char* callback_url)
+{
+ NPT_String res;
+ return NPT_ContainerFind(m_CallbackURLs,
+ NPT_StringFinder(callback_url),
+ res);
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::AddCallbackURL
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::AddCallbackURL(const char* callback_url)
+{
+ NPT_CHECK_POINTER_FATAL(callback_url);
+
+ NPT_LOG_FINE_2("Adding callback \"%s\" to subscriber %s",
+ callback_url,
+ m_SID.GetChars());
+ return m_CallbackURLs.Add(callback_url);
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber::Notify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_EventSubscriber::Notify(NPT_List& vars)
+{
+ // verify we have eventable variables
+ bool foundVars = false;
+ NPT_XmlElementNode* propertyset = new NPT_XmlElementNode("e", "propertyset");
+ NPT_CHECK_SEVERE(propertyset->SetNamespaceUri("e", "urn:schemas-upnp-org:event-1-0"));
+
+ NPT_List::Iterator var = vars.GetFirstItem();
+ while (var) {
+ if ((*var)->IsSendingEvents()) {
+ NPT_XmlElementNode* property = new NPT_XmlElementNode("e", "property");
+ propertyset->AddChild(property);
+ PLT_XmlHelper::AddChildText(property, (*var)->GetName(), (*var)->GetValue());
+ foundVars = true;
+ }
+ ++var;
+ }
+
+ // no eventable state variables found!
+ if (foundVars == false) {
+ delete propertyset;
+ return NPT_FAILURE;
+ }
+
+ // format the body with the xml
+ NPT_String xml;
+ if (NPT_FAILED(PLT_XmlHelper::Serialize(*propertyset, xml))) {
+ delete propertyset;
+ NPT_CHECK_FATAL(NPT_FAILURE);
+ }
+ delete propertyset;
+
+
+ // parse the callback url
+ NPT_HttpUrl url(m_CallbackURLs[0]);
+ if (!url.IsValid()) {
+ NPT_CHECK_FATAL(NPT_FAILURE);
+ }
+ // format request
+ NPT_HttpRequest* request = new NPT_HttpRequest(url,
+ "NOTIFY",
+ NPT_HTTP_PROTOCOL_1_0);
+ request->GetHeaders().SetHeader(NPT_HTTP_HEADER_CONNECTION, "keep-alive");
+
+ // add the extra headers
+ PLT_HttpHelper::SetContentType(*request, "text/xml");
+ PLT_UPnPMessageHelper::SetNT(*request, "upnp:event");
+ PLT_UPnPMessageHelper::SetNTS(*request, "upnp:propchange");
+ PLT_UPnPMessageHelper::SetSID(*request, m_SID);
+ PLT_UPnPMessageHelper::SetSeq(*request, m_EventKey);
+
+ // wrap around sequence to 1
+ if (++m_EventKey == 0) m_EventKey = 1;
+
+ PLT_HttpHelper::SetBody(*request, xml);
+
+ // start the task now if not started already
+ if (!m_SubscriberTask) {
+ m_SubscriberTask = new PLT_HttpClientSocketTask(request, true);
+ NPT_TimeInterval delay(0.5f);
+ // delay start to make sure ctrlpoint receives response to subscription
+ // before our first NOTIFY. Also make sure task is not auto-destroy
+ // since we want to destroy it ourselves when the subscriber goes away.
+ NPT_CHECK_FATAL(m_TaskManager->StartTask(m_SubscriberTask, &delay, false));
+ } else {
+ m_SubscriberTask->AddRequest(request);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberFinderByService::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_EventSubscriberFinderByService::operator()(PLT_EventSubscriber* const & eventSub) const
+{
+ return m_Service->GetDevice()->GetUUID().Compare(
+ eventSub->GetService()->GetDevice()->GetUUID(), true) ? false : true;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltEvent.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltEvent.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,140 @@
+/*****************************************************************
+|
+| Platinum - Event
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_EVENT_H_
+#define _PLT_EVENT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttpClientTask.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_StateVariable;
+class PLT_DeviceData;
+class PLT_Service;
+class PLT_TaskManager;
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriber class
++---------------------------------------------------------------------*/
+class PLT_EventSubscriber
+{
+public:
+ PLT_EventSubscriber(PLT_TaskManager* task_manager,
+ PLT_Service* service,
+ const char* sid,
+ int timeout = -1);
+ ~PLT_EventSubscriber();
+
+ PLT_Service* GetService();
+ NPT_Ordinal GetEventKey();
+ NPT_Result SetEventKey(NPT_Ordinal value);
+ NPT_SocketAddress GetLocalIf();
+ NPT_Result SetLocalIf(NPT_SocketAddress value);
+ NPT_TimeStamp GetExpirationTime();
+ NPT_Result SetTimeout(int timeout = -1);
+ const NPT_String& GetSID() const { return m_SID; }
+ NPT_Result FindCallbackURL(const char* callback_url);
+ NPT_Result AddCallbackURL(const char* callback_url);
+ NPT_Result Notify(NPT_List& vars);
+
+protected:
+ //members
+ PLT_TaskManager* m_TaskManager;
+ PLT_Service* m_Service;
+ NPT_Ordinal m_EventKey;
+ PLT_HttpClientSocketTask* m_SubscriberTask;
+ NPT_String m_SID;
+ NPT_SocketAddress m_LocalIf;
+ NPT_Array m_CallbackURLs;
+ NPT_TimeStamp m_ExpirationTime;
+};
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberFinderBySID
++---------------------------------------------------------------------*/
+class PLT_EventSubscriberFinderBySID
+{
+public:
+ // methods
+ PLT_EventSubscriberFinderBySID(const char* sid) : m_SID(sid) {}
+
+ bool operator()(PLT_EventSubscriber* const & sub) const {
+ return m_SID.Compare(sub->GetSID(), true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_SID;
+};
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberFinderByCallbackURL
++---------------------------------------------------------------------*/
+class PLT_EventSubscriberFinderByCallbackURL
+{
+public:
+ // methods
+ PLT_EventSubscriberFinderByCallbackURL(const char* callback_url) :
+ m_CallbackURL(callback_url) {}
+
+ bool operator()(PLT_EventSubscriber* const & sub) const {
+ return NPT_SUCCEEDED(sub->FindCallbackURL(m_CallbackURL));
+ }
+
+private:
+ // members
+ NPT_String m_CallbackURL;
+};
+
+/*----------------------------------------------------------------------
+| PLT_EventSubscriberFinderByService
++---------------------------------------------------------------------*/
+class PLT_EventSubscriberFinderByService
+{
+public:
+ // methods
+ PLT_EventSubscriberFinderByService(PLT_Service* service) : m_Service(service) {}
+ virtual ~PLT_EventSubscriberFinderByService() {}
+ bool operator()(PLT_EventSubscriber* const & eventSub) const;
+
+private:
+ // members
+ PLT_Service* m_Service;
+};
+
+#endif /* _PLT_EVENT_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltHttp.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltHttp.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,616 @@
+/*****************************************************************
+|
+| Platinum - HTTP Protocol Helper
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltHttp.h"
+#include "PltDatagramStream.h"
+#include "PltVersion.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.http")
+
+/*----------------------------------------------------------------------
+| external references
++---------------------------------------------------------------------*/
+extern NPT_String HttpServerHeader;
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaderFinder
++---------------------------------------------------------------------*/
+class NPT_HttpHeaderFinder
+{
+ public:
+ // methods
+ NPT_HttpHeaderFinder(const char* name) : m_Name(name) {}
+ bool operator()(const NPT_HttpHeader* const & header) const {
+ if (header->GetName().Compare(m_Name, true)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private:
+ // members
+ NPT_String m_Name;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaderPrinter
++---------------------------------------------------------------------*/
+class NPT_HttpHeaderPrinter
+{
+public:
+ // methods
+ NPT_HttpHeaderPrinter(NPT_OutputStreamReference& stream) : m_Stream(stream) {}
+ NPT_Result operator()(NPT_HttpHeader*& header) const {
+ m_Stream->WriteString(header->GetName());
+ m_Stream->Write(": ", 2);
+ m_Stream->WriteString(header->GetValue());
+ m_Stream->Write("\r\n", 2, NULL);
+ return NPT_SUCCESS;
+ }
+
+private:
+ // members
+ NPT_OutputStreamReference& m_Stream;
+};
+
+/*----------------------------------------------------------------------
+| NPT_HttpHeaderLogger
++---------------------------------------------------------------------*/
+class NPT_HttpHeaderLogger
+{
+public:
+ // methods
+ NPT_HttpHeaderLogger(NPT_LoggerReference& logger, int level) :
+ m_Logger(logger), m_Level(level) {}
+ NPT_Result operator()(NPT_HttpHeader*& header) const {
+ NPT_COMPILER_UNUSED(header);
+
+ NPT_LOG_L2(m_Logger, m_Level, "%s: %s",
+ (const char*)header->GetName(),
+ (const char*)header->GetValue());
+ return NPT_SUCCESS;
+ }
+
+ NPT_LoggerReference& m_Logger;
+ int m_Level;
+};
+
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetContentType
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetContentType(NPT_HttpMessage& message, NPT_String& type)
+{
+ type = "";
+
+ const NPT_String* val =
+ message.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_CONTENT_TYPE);
+ NPT_CHECK_POINTER(val);
+
+ type = *val;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetContentType
++---------------------------------------------------------------------*/
+void
+PLT_HttpHelper::SetContentType(NPT_HttpMessage& message, const char* type)
+{
+ message.GetHeaders().SetHeader(NPT_HTTP_HEADER_CONTENT_TYPE, type);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetContentLength
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetContentLength(NPT_HttpMessage& message, NPT_LargeSize& len)
+{
+ len = 0;
+
+ const NPT_String* val =
+ message.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_CONTENT_LENGTH);
+ NPT_CHECK_POINTER(val);
+
+ return val->ToInteger(len);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetContentLength
++---------------------------------------------------------------------*/
+void
+PLT_HttpHelper::SetContentLength(NPT_HttpMessage& message, NPT_LargeSize len)
+{
+ message.GetHeaders().SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH, NPT_String::FromIntegerU(len));
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::SetBody(NPT_HttpMessage& message, NPT_String& body)
+{
+ return SetBody(message, (const char*)body, body.GetLength());
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpMessage::SetBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::SetBody(NPT_HttpMessage& message, const char* body, NPT_Size len)
+{
+ if (len == 0) {
+ return NPT_SUCCESS;
+ }
+
+ // dump the body in a memory stream
+ NPT_MemoryStreamReference stream(new NPT_MemoryStream);
+ stream->Write(body, len);
+
+ // set content length
+ PLT_HttpHelper::SetContentLength(message, len);
+
+ NPT_InputStreamReference input = stream;
+ return SetBody(message, input, len);
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpMessage::SetBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::SetBody(NPT_HttpMessage& message, NPT_InputStreamReference& stream, NPT_LargeSize len)
+{
+ if (len == 0) {
+ NPT_CHECK_SEVERE(stream->GetAvailable(len));
+ }
+
+ // get the entity
+ NPT_HttpEntity* entity = message.GetEntity();
+ if (entity == NULL) {
+ // no entity yet, create one
+ message.SetEntity(entity = new NPT_HttpEntity());
+ }
+
+ // set the entity body
+ entity->SetInputStream(stream);
+ entity->SetContentLength(len);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetBody(NPT_HttpMessage& message, NPT_String& body)
+{
+ NPT_Result res;
+ NPT_InputStreamReference stream;
+
+ // get stream
+ NPT_HttpEntity* entity = message.GetEntity();
+ if (!entity || NPT_FAILED(entity->GetInputStream(stream))) {
+ return NPT_FAILURE;
+ }
+
+ // extract body
+ NPT_StringOutputStream* output_stream = new NPT_StringOutputStream(&body);
+ res = NPT_StreamToStreamCopy(*stream, *output_stream, 0, entity->GetContentLength());
+ delete output_stream;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::ParseBody
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::ParseBody(NPT_HttpMessage& message, NPT_XmlElementNode*& tree)
+{
+ // reset tree
+ tree = NULL;
+
+ // read body
+ NPT_String body;
+ NPT_CHECK_WARNING(GetBody(message, body));
+
+ // parse body
+ NPT_XmlParser parser;
+ NPT_XmlNode* node;
+ NPT_CHECK_WARNING(parser.Parse(body, node));
+
+ tree = node->AsElementNode();
+ if (!tree) {
+ delete node;
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::IsConnectionKeepAlive
++---------------------------------------------------------------------*/
+bool
+PLT_HttpHelper::IsConnectionKeepAlive(NPT_HttpMessage& message)
+{
+ const NPT_String* connection =
+ message.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_CONNECTION);
+
+ // if we have the keep-alive header then no matter what protocol version, we want keep-alive
+ // if we are in HTTP 1.1 and we don't have the keep-alive header, make sure we also don't have the Connection: close header.
+ NPT_String protocol = message.GetProtocol();
+ if ((!protocol.Compare(NPT_HTTP_PROTOCOL_1_1, true) && (!connection || connection->Compare("close", true))) ||
+ (connection && !connection->Compare("keep-alive", true))) {
+ return true;
+ }
+
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::IsBodyStreamSeekable
++---------------------------------------------------------------------*/
+bool
+PLT_HttpHelper::IsBodyStreamSeekable(NPT_HttpMessage& message)
+{
+ NPT_HttpEntity* entity = message.GetEntity();
+ NPT_InputStreamReference stream;
+ if (!entity || NPT_FAILED(entity->GetInputStream(stream))) return true;
+
+ // try to get current position and seek there
+ NPT_Position position;
+ if (NPT_FAILED(stream->Tell(position)) ||
+ NPT_FAILED(stream->Seek(position))) {
+ return false;
+ }
+
+ return true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetHost
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetHost(NPT_HttpRequest& request, NPT_String& value)
+{
+ value = "";
+
+ const NPT_String* val =
+ request.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_HOST);
+ NPT_CHECK_POINTER(val);
+
+ value = *val;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetHost
++---------------------------------------------------------------------*/
+void
+PLT_HttpHelper::SetHost(NPT_HttpRequest& request, const char* host)
+{
+ request.GetHeaders().SetHeader(NPT_HTTP_HEADER_HOST, host);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetRange
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetRange(NPT_HttpRequest& request,
+ NPT_Position& start,
+ NPT_Position& end)
+{
+ start = (NPT_Position)-1;
+ end = (NPT_Position)-1;
+
+ const NPT_String* range =
+ request.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_RANGE);
+ NPT_CHECK_POINTER(range);
+
+ char s[32], e[32];
+ s[0] = '\0';
+ e[0] = '\0';
+ int ret = sscanf(*range, "bytes=%[^-]-%s", s, e);
+ if (ret < 1) {
+ return NPT_FAILURE;
+ }
+ if (s[0] != '\0') {
+ NPT_ParseInteger64U(s, start);
+ }
+ if (e[0] != '\0') {
+ NPT_ParseInteger64U(e, end);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetRange
++---------------------------------------------------------------------*/
+void
+PLT_HttpHelper::SetRange(NPT_HttpRequest& request, NPT_Position start, NPT_Position end)
+{
+ NPT_String range = "bytes=";
+ if (start != (NPT_Position)-1) {
+ range += NPT_String::FromIntegerU(start);
+ }
+ range += '-';
+ if (end != (NPT_Position)-1) {
+ range += NPT_String::FromIntegerU(end);
+ }
+ request.GetHeaders().SetHeader(NPT_HTTP_HEADER_RANGE, range);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::ToLog
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::ToLog(NPT_LoggerReference logger, int level, NPT_HttpRequest* request)
+{
+ NPT_COMPILER_UNUSED(logger);
+ NPT_COMPILER_UNUSED(level);
+
+ if (!request) {
+ NPT_LOG_L(logger, level, "NULL HTTP Request!");
+ return NPT_FAILURE;
+ }
+
+ NPT_StringOutputStreamReference stream(new NPT_StringOutputStream);
+ NPT_OutputStreamReference output = stream;
+ request->GetHeaders().GetHeaders().Apply(NPT_HttpHeaderPrinter(output));
+
+ NPT_LOG_L4(logger, level, "\n%s %s %s\n%s",
+ (const char*)request->GetMethod(),
+ (const char*)request->GetUrl().ToRequestString(true),
+ (const char*)request->GetProtocol(),
+ (const char*)stream->GetString());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::GetContentRange
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::GetContentRange(NPT_HttpResponse& response,
+ NPT_Position& start,
+ NPT_Position& end,
+ NPT_LargeSize& length)
+{
+ const NPT_String* range =
+ response.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_CONTENT_RANGE);
+ NPT_CHECK_POINTER(range);
+
+ start = (NPT_Position)-1;
+ end = (NPT_Position)-1;
+ length = (NPT_LargeSize)-1;
+
+ char s[32], e[32], l[32];
+ s[0] = '\0';
+ e[0] = '\0';
+ l[0] = '\0';
+ int ret = sscanf(*range, "bytes %[^-]-%s[^/]/%s", s, e, l);
+ if (ret < 3) {
+ return NPT_FAILURE;
+ }
+ if (s[0] != '\0') {
+ NPT_ParseInteger64U(s, start);
+ }
+ if (e[0] != '\0') {
+ NPT_ParseInteger64U(e, end);
+ }
+ if (l[0] != '\0') {
+ NPT_ParseInteger64U(l, length);
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper::SetContentRange
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::SetContentRange(NPT_HttpResponse& response,
+ NPT_Position start,
+ NPT_Position end,
+ NPT_LargeSize length)
+{
+ if (start == (NPT_Position)-1 || end == (NPT_Position)-1 || length == (NPT_Size)-1) {
+ NPT_LOG_WARNING_3("Content Range is exactly -1? (start=%d, end=%d, length=%d)", start, end, length);
+ }
+
+ NPT_String range = "bytes ";
+ range += NPT_String::FromIntegerU(start);
+ range += '-';
+ range += NPT_String::FromIntegerU(end);
+ range += '/';
+ range += NPT_String::FromIntegerU(length);
+ response.GetHeaders().SetHeader(NPT_HTTP_HEADER_CONTENT_RANGE, range);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| NPT_HttpResponse::ToLog
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpHelper::ToLog(NPT_LoggerReference logger, int level, NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(logger);
+ NPT_COMPILER_UNUSED(level);
+
+ if (!response) {
+ NPT_LOG_L(logger, level, "NULL HTTP Response!");
+ return NPT_FAILURE;
+ }
+
+ NPT_StringOutputStreamReference stream(new NPT_StringOutputStream);
+ NPT_OutputStreamReference output = stream;
+ response->GetHeaders().GetHeaders().Apply(NPT_HttpHeaderPrinter(output));
+
+ NPT_LOG_L4(logger, level, "\n%s %d %s\n%s",
+ (const char*)response->GetProtocol(),
+ response->GetStatusCode(),
+ (const char*)response->GetReasonPhrase(),
+ (const char*)stream->GetString());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClient::Connect
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClient::Connect(NPT_Socket* connection, NPT_HttpRequest& request, NPT_Timeout timeout)
+{
+ // get the address of the server
+ NPT_IpAddress server_address;
+ NPT_CHECK_SEVERE(server_address.ResolveName(request.GetUrl().GetHost(), timeout));
+ NPT_SocketAddress address(server_address, request.GetUrl().GetPort());
+
+ // connect to the server
+ NPT_LOG_FINER_2("Connecting to %s:%d\n", (const char*)request.GetUrl().GetHost(), request.GetUrl().GetPort());
+ NPT_CHECK_SEVERE(connection->Connect(address, timeout));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClient::SendRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClient::SendRequest(NPT_OutputStreamReference& output_stream,
+ NPT_HttpRequest& request,
+ NPT_Timeout timeout)
+{
+ NPT_COMPILER_UNUSED(timeout);
+
+ // connect to the server
+ NPT_LOG_FINE("Sending:");
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, &request);
+
+ // add any headers that may be missing
+ NPT_HttpHeaders& headers = request.GetHeaders();
+ headers.SetHeader(NPT_HTTP_HEADER_CONNECTION, "close", false); // set but don't replace
+ headers.SetHeader(NPT_HTTP_HEADER_USER_AGENT,
+ NPT_HttpClient::m_UserAgentHeader, false); // set but don't replace
+
+ // set host only if not already set
+ if (!headers.GetHeader(NPT_HTTP_HEADER_HOST)) {
+ NPT_String host = request.GetUrl().GetHost();
+ if (request.GetUrl().GetPort() != NPT_HTTP_DEFAULT_PORT) {
+ host += ":";
+ host += NPT_String::FromInteger(request.GetUrl().GetPort());
+ }
+ headers.SetHeader(NPT_HTTP_HEADER_HOST, host);
+ }
+
+ // get the request entity to set additional headers
+ NPT_InputStreamReference body_stream;
+ NPT_HttpEntity* entity = request.GetEntity();
+ if (entity && NPT_SUCCEEDED(entity->GetInputStream(body_stream))) {
+ // content length
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH,
+ NPT_String::FromIntegerU(entity->GetContentLength()));
+
+ // content type
+ NPT_String content_type = entity->GetContentType();
+ if (!content_type.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_TYPE, content_type);
+ }
+
+ // content encoding
+ NPT_String content_encoding = entity->GetContentEncoding();
+ if (!content_encoding.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_ENCODING, content_encoding);
+ }
+ } else {
+ // force content length to 0 is there is no message body
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH, "0");
+ }
+
+ // create a memory stream to buffer the headers
+ NPT_MemoryStream header_stream;
+
+ // emit the request headers into the header buffer
+ request.Emit(header_stream);
+
+ // send the headers
+ NPT_CHECK_SEVERE(output_stream->WriteFully(header_stream.GetData(), header_stream.GetDataSize()));
+
+ // send request body
+ if (!body_stream.IsNull() && entity->GetContentLength()) {
+ NPT_CHECK_SEVERE(NPT_StreamToStreamCopy(*body_stream.AsPointer(), *output_stream.AsPointer()));
+ }
+
+ // flush the output stream so that everything is sent to the server
+ output_stream->Flush();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClient::WaitForResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClient::WaitForResponse(NPT_InputStreamReference& input_stream,
+ NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ // create a buffered stream for this connection stream
+ NPT_BufferedInputStreamReference buffered_input_stream(new NPT_BufferedInputStream(input_stream));
+
+ // parse the response
+ NPT_CHECK(NPT_HttpResponse::Parse(*buffered_input_stream, response));
+
+ // unbuffer the stream
+ buffered_input_stream->SetBufferSize(0);
+
+ // create an entity if one is expected in the response
+ if (request.GetMethod() == NPT_HTTP_METHOD_GET || request.GetMethod() == NPT_HTTP_METHOD_POST) {
+ NPT_HttpEntity* response_entity = new NPT_HttpEntity(response->GetHeaders());
+ // Transfer-Encoding: chunked ?
+ if (response_entity->GetTransferEncoding() == "chunked") {
+ NPT_InputStreamReference body_stream(new NPT_HttpChunkedDecoderInputStream(buffered_input_stream));
+ response_entity->SetInputStream((NPT_InputStreamReference)body_stream);
+ } else {
+ response_entity->SetInputStream((NPT_InputStreamReference)buffered_input_stream);
+ }
+ response->SetEntity(response_entity);
+ }
+
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltHttp.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltHttp.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,157 @@
+/*****************************************************************
+|
+| Platinum - HTTP Helper
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_HTTP_H_
+#define _PLT_HTTP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_HttpHelper
++---------------------------------------------------------------------*/
+class PLT_HttpHelper {
+ public:
+ static bool IsConnectionKeepAlive(NPT_HttpMessage& message);
+ static bool IsBodyStreamSeekable(NPT_HttpMessage& message);
+
+ static NPT_Result ToLog(NPT_LoggerReference logger, int level, NPT_HttpRequest* request);
+ static NPT_Result ToLog(NPT_LoggerReference logger, int level, NPT_HttpResponse* response);
+
+ static NPT_Result GetContentType(NPT_HttpMessage& message, NPT_String& type);
+ static void SetContentType(NPT_HttpMessage& message, const char* type);
+ static NPT_Result GetContentLength(NPT_HttpMessage& message, NPT_LargeSize& len);
+ static void SetContentLength(NPT_HttpMessage& message, NPT_LargeSize len);
+
+ static NPT_Result GetHost(NPT_HttpRequest& request, NPT_String& value);
+ static void SetHost(NPT_HttpRequest& request, const char* host);
+ static NPT_Result GetRange(NPT_HttpRequest& request, NPT_Position& start, NPT_Position& end);
+ static void SetRange(NPT_HttpRequest& request, NPT_Position start, NPT_Position end = (NPT_Position)-1);
+
+ static NPT_Result GetContentRange(NPT_HttpResponse& response, NPT_Position& start, NPT_Position& end, NPT_LargeSize& length);
+ static NPT_Result SetContentRange(NPT_HttpResponse& response, NPT_Position start, NPT_Position end, NPT_LargeSize length);
+
+ static NPT_Result SetBody(NPT_HttpMessage& message, NPT_String& body);
+ static NPT_Result SetBody(NPT_HttpMessage& message, const char* body, NPT_Size len);
+ static NPT_Result SetBody(NPT_HttpMessage& message, NPT_InputStreamReference& stream, NPT_LargeSize len = 0);
+
+
+ static NPT_Result GetBody(NPT_HttpMessage& message, NPT_String& body);
+ static NPT_Result ParseBody(NPT_HttpMessage& message, NPT_XmlElementNode*& xml);
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpRequestContext
++---------------------------------------------------------------------*/
+class PLT_HttpRequestContext : public NPT_HttpRequestContext {
+public:
+ // constructors and destructor
+ PLT_HttpRequestContext(NPT_HttpRequest& request) :
+ m_Request(request) {}
+ PLT_HttpRequestContext(NPT_HttpRequest& request, const NPT_HttpRequestContext& context) :
+ NPT_HttpRequestContext(&context.GetLocalAddress(), &context.GetRemoteAddress()),
+ m_Request(request) {}
+ virtual ~PLT_HttpRequestContext() {}
+
+ NPT_HttpRequest& GetRequest() const { return m_Request; }
+
+private:
+ NPT_HttpRequest& m_Request;
+};
+
+/*----------------------------------------------------------------------
+| macros
++---------------------------------------------------------------------*/
+#if defined(NPT_CONFIG_ENABLE_LOGGING)
+#define PLT_LOG_HTTP_MESSAGE_L(_logger, _level, _msg) \
+ PLT_HttpHelper::ToLog(_logger, _level, _msg)
+#define PLT_LOG_HTTP_MESSAGE(_level, _msg) \
+ PLT_LOG_HTTP_MESSAGE_L(_NPT_LocalLogger, _level, _msg)
+
+#else /* NPT_CONFIG_ENABLE_LOGGING */
+#define PLT_LOG_HTTP_MESSAGE_L(_logger, _level, _msg)
+#define PLT_LOG_HTTP_MESSAGE(_level, _msg)
+#endif /* NPT_CONFIG_ENABLE_LOGGING */
+
+/*----------------------------------------------------------------------
+| PLT_HttpClient
++---------------------------------------------------------------------*/
+class PLT_HttpClient {
+public:
+ // constructors and destructor
+ PLT_HttpClient() {}
+ virtual ~PLT_HttpClient() {}
+
+ // methods
+ NPT_Result Connect(NPT_Socket* connection,
+ NPT_HttpRequest& request,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+
+ NPT_Result SendRequest(NPT_OutputStreamReference& output_stream,
+ NPT_HttpRequest& request,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+
+ NPT_Result WaitForResponse(NPT_InputStreamReference& input_stream,
+ NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response);
+
+protected:
+ // members
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpRequestHandler
++---------------------------------------------------------------------*/
+template
+class PLT_HttpRequestHandler : public NPT_HttpRequestHandler
+{
+public:
+ PLT_HttpRequestHandler(T* data) : m_Data(data) {}
+ virtual ~PLT_HttpRequestHandler() {}
+
+ // NPT_HttpRequestHandler methods
+ NPT_Result SetupResponse(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response) {
+ return m_Data->ProcessHttpRequest(request, context, response);
+ }
+
+private:
+ T* m_Data;
+};
+
+
+#endif /* _PLT_HTTP_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltHttpClientTask.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltHttpClientTask.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,292 @@
+/*****************************************************************
+|
+| Platinum - HTTP Client Tasks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltHttpClientTask.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.http.clienttask")
+
+/*----------------------------------------------------------------------
+| PLT_HttpTcpConnector::PLT_HttpTcpConnector
++---------------------------------------------------------------------*/
+PLT_HttpTcpConnector::PLT_HttpTcpConnector() :
+ NPT_HttpClient::Connector(),
+ m_Socket(new NPT_TcpClientSocket())
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpTcpConnector::Connect
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpTcpConnector::Connect(const char* hostname,
+ NPT_UInt16 port,
+ NPT_Timeout connection_timeout,
+ NPT_Timeout io_timeout,
+ NPT_Timeout name_resolver_timeout,
+ NPT_InputStreamReference& input_stream,
+ NPT_OutputStreamReference& output_stream)
+{
+ if (m_HostName == hostname && m_Port == port) {
+ input_stream = m_InputStream;
+ output_stream = m_OutputStream;
+ return NPT_SUCCESS;
+ }
+
+ // get the address and port to which we need to connect
+ NPT_IpAddress address;
+ NPT_CHECK_FATAL(address.ResolveName(hostname, name_resolver_timeout));
+
+ // connect to the server
+ NPT_LOG_FINE_2("NPT_HttpTcpConnector::Connect - will connect to %s:%d\n", hostname, port);
+ m_Socket->SetReadTimeout(io_timeout);
+ m_Socket->SetWriteTimeout(io_timeout);
+ NPT_SocketAddress socket_address(address, port);
+ NPT_CHECK_FATAL(m_Socket->Connect(socket_address, connection_timeout));
+
+ // get and keep the streams
+ NPT_CHECK(m_Socket->GetInputStream(m_InputStream));
+ NPT_CHECK(m_Socket->GetOutputStream(m_OutputStream));
+ NPT_CHECK(m_Socket->GetInfo(m_SocketInfo));
+
+ m_HostName = hostname;
+ m_Port = port;
+ input_stream = m_InputStream;
+ output_stream = m_OutputStream;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::PLT_HttpClientSocketTask
++---------------------------------------------------------------------*/
+PLT_HttpClientSocketTask::PLT_HttpClientSocketTask(NPT_HttpRequest* request,
+ bool wait_forever /* = false */) :
+ m_WaitForever(wait_forever),
+ m_Connector(NULL)
+{
+ if (request) m_Requests.Push(request);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask::~PLT_HttpClientSocketTask
++---------------------------------------------------------------------*/
+PLT_HttpClientSocketTask::~PLT_HttpClientSocketTask()
+{
+ // delete any outstanding requests
+ NPT_HttpRequest* request;
+ while (NPT_SUCCEEDED(m_Requests.Pop(request, false))) {
+ delete request;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::AddRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClientSocketTask::AddRequest(NPT_HttpRequest* request)
+{
+ return m_Requests.Push(request);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::GetNextRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClientSocketTask::GetNextRequest(NPT_HttpRequest*& request, NPT_Timeout timeout)
+{
+ return m_Requests.Pop(request, timeout);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::SetConnector
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClientSocketTask::SetConnector(PLT_HttpTcpConnector* connector)
+{
+ NPT_AutoLock autolock(m_ConnectorLock);
+
+ if (IsAborting(0)) return NPT_ERROR_CONNECTION_ABORTED;
+
+ // NPT_HttpClient will delete old connector and own the new one
+ m_Client.SetConnector(connector);
+ m_Connector = connector;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::DoAbort
++---------------------------------------------------------------------*/
+void
+PLT_HttpClientSocketTask::DoAbort()
+{
+ NPT_AutoLock autolock(m_ConnectorLock);
+ if (m_Connector) m_Connector->Abort();
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_HttpClientSocketTask::DoRun()
+{
+ NPT_HttpRequest* request;
+ NPT_HttpRequestContext context;
+ bool using_previous_connector;
+ NPT_Result res;
+ NPT_HttpResponse* response;
+
+ using_previous_connector = false;
+ SetConnector(new PLT_HttpTcpConnector());
+
+ do {
+ // pop next request or wait for one for 100ms
+ if (NPT_SUCCEEDED(GetNextRequest(request, 100))) {
+ response = NULL;
+retry:
+ // if body is not seekable, don't even try to
+ // reuse previous connector since in case it fails because
+ // server closed connection, we won't be able to
+ // rewind the body to resend the request
+ if (!PLT_HttpHelper::IsBodyStreamSeekable(*request) && using_previous_connector) {
+ using_previous_connector = false;
+ if (NPT_FAILED(SetConnector(new PLT_HttpTcpConnector())))
+ goto abort;
+ }
+
+ if (IsAborting(0)) goto abort;
+
+ // send request
+ res = m_Client.SendRequest(*request, response);
+
+ // retry only if we were reusing a previous connector
+ if (NPT_FAILED(res) && using_previous_connector) {
+ using_previous_connector = false;
+ if (NPT_FAILED(SetConnector(new PLT_HttpTcpConnector())))
+ goto abort;
+
+ // server may have closed socket on us
+ NPT_HttpEntity* entity = request->GetEntity();
+ NPT_InputStreamReference input_stream;
+
+ // rewind request body if any to be able to resend it
+ if (entity && NPT_SUCCEEDED(entity->GetInputStream(input_stream))) {
+ input_stream->Seek(0);
+ }
+
+ goto retry;
+ }
+
+ NPT_LOG_FINE_1("PLT_HttpClientSocketTask receiving: res = %d", res);
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, response);
+
+ // callback to process response
+ NPT_SocketInfo info;
+ m_Connector->GetInfo(info);
+ context.SetLocalAddress(info.local_address);
+ context.SetRemoteAddress(info.remote_address);
+ ProcessResponse(res, request, context, response);
+
+ // check if server says keep-alive to keep our connector
+ if (response && PLT_HttpHelper::IsConnectionKeepAlive(*response)) {
+ using_previous_connector = true;
+ } else {
+ using_previous_connector = false;
+ if (NPT_FAILED(SetConnector(new PLT_HttpTcpConnector())))
+ goto abort;
+ }
+
+ // cleanup
+ delete response;
+ response = NULL;
+ delete request;
+ request = NULL;
+ }
+ } while (m_WaitForever && !IsAborting(0));
+
+abort:
+ if (request) delete request;
+ if (response) delete response;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpClientSocketTask::ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_LOG_FINE_1("PLT_HttpClientSocketTask::ProcessResponse (result=%d)", res);
+ NPT_CHECK_WARNING(res);
+
+ NPT_HttpEntity* entity;
+ NPT_InputStreamReference body;
+ if (!response ||
+ !(entity = response->GetEntity()) ||
+ NPT_FAILED(entity->GetInputStream(body))) {
+ return NPT_FAILURE;
+ }
+
+ // dump body into memory (if no content-length specified, read until disconnection)
+ NPT_MemoryStream output;
+ NPT_CHECK_SEVERE(NPT_StreamToStreamCopy(*body,
+ output,
+ 0,
+ entity->GetContentLength()));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileHttpClientTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileHttpClientTask::ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(res);
+ NPT_COMPILER_UNUSED(request);
+ NPT_COMPILER_UNUSED(context);
+ NPT_COMPILER_UNUSED(response);
+
+ NPT_LOG_FINE_1("PLT_FileHttpClientTask::ProcessResponse (status=%d)\n", res);
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltHttpClientTask.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltHttpClientTask.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,158 @@
+/*****************************************************************
+|
+| Platinum - HTTP Client Tasks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_HTTP_CLIENT_TASK_H_
+#define _PLT_HTTP_CLIENT_TASK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttp.h"
+#include "PltThreadTask.h"
+
+/*----------------------------------------------------------------------
+| PLT_HttpTcpConnector
++---------------------------------------------------------------------*/
+class PLT_HttpTcpConnector : public NPT_HttpClient::Connector
+{
+public:
+ PLT_HttpTcpConnector();
+ virtual ~PLT_HttpTcpConnector() {}
+ virtual NPT_Result Connect(const char* hostname,
+ NPT_UInt16 port,
+ NPT_Timeout connection_timeout,
+ NPT_Timeout io_timeout,
+ NPT_Timeout name_resolver_timeout,
+ NPT_InputStreamReference& input_stream,
+ NPT_OutputStreamReference& output_stream);
+
+public:
+ void GetInfo(NPT_SocketInfo& info) { info = m_SocketInfo;}
+ void Abort() { if (!m_Socket.IsNull()) m_Socket->Disconnect(); }
+
+private:
+ NPT_String m_HostName;
+ NPT_UInt16 m_Port;
+ NPT_InputStreamReference m_InputStream;
+ NPT_OutputStreamReference m_OutputStream;
+ NPT_SocketInfo m_SocketInfo;
+ NPT_Reference m_Socket;
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientSocketTask class
++---------------------------------------------------------------------*/
+class PLT_HttpClientSocketTask : public PLT_ThreadTask
+{
+friend class PLT_ThreadTask;
+
+public:
+ PLT_HttpClientSocketTask(NPT_HttpRequest* request = NULL,
+ bool wait_forever = false);
+
+ NPT_Result AddRequest(NPT_HttpRequest* request);
+
+protected:
+ virtual ~PLT_HttpClientSocketTask();
+
+protected:
+ virtual NPT_Result SetConnector(PLT_HttpTcpConnector* connector);
+
+ // PLT_ThreadTask methods
+ virtual void DoAbort();
+ virtual void DoRun();
+
+ virtual NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+private:
+ NPT_Result GetNextRequest(NPT_HttpRequest*& request, NPT_Timeout timeout);
+
+protected:
+ NPT_HttpClient m_Client;
+ bool m_WaitForever;
+ NPT_Queue m_Requests;
+ NPT_Mutex m_ConnectorLock;
+ PLT_HttpTcpConnector* m_Connector;
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpClientTask class
++---------------------------------------------------------------------*/
+template
+class PLT_HttpClientTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_HttpClientTask(const NPT_HttpUrl& url, T* data) :
+ PLT_HttpClientSocketTask(new NPT_HttpRequest(url, "GET")),
+ m_Data(data) {}
+ protected:
+ virtual ~PLT_HttpClientTask() {}
+
+protected:
+ // PLT_HttpClientSocketTask method
+ NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) {
+ return m_Data->ProcessResponse(res, request, context, response);
+ }
+
+protected:
+ T* m_Data;
+};
+
+/*----------------------------------------------------------------------
+| PLT_FileHttpClientTask class
++---------------------------------------------------------------------*/
+class PLT_FileHttpClientTask : public PLT_HttpClientSocketTask
+{
+public:
+ PLT_FileHttpClientTask(const NPT_HttpUrl& url) :
+ PLT_HttpClientSocketTask(new NPT_HttpRequest(url, "GET")) {}
+
+protected:
+ virtual ~PLT_FileHttpClientTask() {}
+
+protected:
+ // PLT_HttpClientSocketTask method
+ NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+};
+
+#endif /* _PLT_HTTP_CLIENT_TASK_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltHttpServer.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltHttpServer.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,266 @@
+/*****************************************************************
+|
+| Platinum - HTTP Server
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltTaskManager.h"
+#include "PltHttpServer.h"
+#include "PltHttp.h"
+#include "PltVersion.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.http.server")
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::PLT_HttpServer
++---------------------------------------------------------------------*/
+PLT_HttpServer::PLT_HttpServer(unsigned int port,
+ bool port_rebind /* = false */,
+ NPT_Cardinal max_clients /* = 0 */,
+ bool reuse_address /* = false */) :
+ m_TaskManager(new PLT_TaskManager(max_clients)),
+ m_Port(port),
+ m_PortRebind(port_rebind),
+ m_ReuseAddress(reuse_address),
+ m_HttpListenTask(NULL)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::~PLT_HttpServer
++---------------------------------------------------------------------*/
+PLT_HttpServer::~PLT_HttpServer()
+{
+ delete m_TaskManager;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServer::Start()
+{
+ NPT_Result res = NPT_FAILURE;
+
+ // if we're given a port for our http server, try it
+ if (m_Port) {
+ res = SetListenPort(m_Port, m_ReuseAddress);
+ // return right away on failure if told not to try to rebind randomly
+ if (NPT_FAILED(res) && !m_PortRebind) {
+ NPT_CHECK_SEVERE(res);
+ }
+ }
+
+ // try random port now
+ if (!m_Port || NPT_FAILED(res)) {
+ // randomly try a port for our http server
+ int retries = 100;
+ do {
+ int random = NPT_System::GetRandomInteger();
+ int port = (unsigned short)(50000 + (random % 15000));
+ if (NPT_SUCCEEDED(SetListenPort(port, m_ReuseAddress))) {
+ break;
+ }
+ } while (--retries > 0);
+
+ if (retries == 0) NPT_CHECK_SEVERE(NPT_FAILURE);
+ }
+
+ m_Port = m_Config.m_ListenPort;
+
+ // start a task to listen
+ m_HttpListenTask = new PLT_HttpServerListenTask(this, &m_Socket, false);
+ m_TaskManager->StartTask(m_HttpListenTask, NULL, false);
+
+ NPT_SocketInfo info;
+ m_Socket.GetInfo(info);
+ NPT_LOG_INFO_2("HttpServer listening on %s:%d",
+ (const char*)info.local_address.GetIpAddress().ToString(),
+ m_Port);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServer::Stop()
+{
+ if (m_HttpListenTask) {
+ m_HttpListenTask->Kill();
+ m_HttpListenTask = NULL;
+ }
+
+ // stop all other pending tasks
+ m_TaskManager->StopAllTasks();
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer::ProcessHttpRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServer::ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response,
+ bool& headers_only)
+{
+
+ NPT_LOG_INFO_3("Received %s Request from %s for %s",
+ (const char*) request.GetMethod(),
+ (const char*) context.GetRemoteAddress().GetIpAddress().ToString(),
+ (const char*) request.GetUrl().GetPath());
+
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, &request);
+
+ NPT_HttpRequestHandler* handler = FindRequestHandler(request);
+ if (handler == NULL) {
+ response = new NPT_HttpResponse(404, "Not Found", NPT_HTTP_PROTOCOL_1_1);
+ } else {
+ // create a repsones object
+ response = new NPT_HttpResponse(200, "OK", NPT_HTTP_PROTOCOL_1_1);
+ response->GetHeaders().SetHeader("Server", "Platinum/" PLT_PLATINUM_VERSION_STRING);
+
+ // prepare the response
+ response->SetEntity(new NPT_HttpEntity());
+
+ // ask the handler to setup the response
+ handler->SetupResponse(request, context, *response);
+
+ // set headers_only flag
+ headers_only = (request.GetMethod()==NPT_HTTP_METHOD_HEAD);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileServer::GetMimeType
++---------------------------------------------------------------------*/
+const char*
+PLT_FileServer::GetMimeType(const NPT_String& filename)
+{
+ int last_dot = filename.ReverseFind('.');
+ if (last_dot > 0) {
+ NPT_String extension = filename.GetChars()+last_dot+1;
+ extension.MakeLowercase();
+
+ for (unsigned int i=0; i= 0) || (file_path.Find("\\..") >= 0)) {
+ response.SetStatus(404, "File Not Found");
+ return NPT_SUCCESS;
+ }
+
+ if (NPT_FAILED(result = file.Open(NPT_FILE_OPEN_MODE_READ)) ||
+ NPT_FAILED(result = file.GetInputStream(stream)) ||
+ NPT_FAILED(result = stream->GetSize(total_len))) {
+ // file didn't open
+ response.SetStatus(404, "File Not Found");
+ return NPT_SUCCESS;
+ } else {
+ NPT_HttpEntity* entity = new NPT_HttpEntity();
+ entity->SetContentLength(total_len);
+ response.SetEntity(entity);
+
+ // set the content type if we can
+ entity->SetContentType(GetMimeType(file_path));
+
+ // request is HEAD, returns without setting a body
+ if (request_is_head) return NPT_SUCCESS;
+
+ // see if it was a byte range request
+ if (start != (NPT_Position)-1 || end != (NPT_Position)-1) {
+ // we can only support a range from an offset to the end of the resource for now
+ // due to the fact we can't limit how much to read from a stream yet
+ NPT_Position start_offset = (NPT_Position)-1, end_offset = total_len - 1, len;
+ if (start == (NPT_Position)-1 && end != (NPT_Position)-1) {
+ // we are asked for the last N=end bytes
+ // adjust according to total length
+ if (end >= total_len) {
+ start_offset = 0;
+ } else {
+ start_offset = total_len-end;
+ }
+ } else if (start != (NPT_Position)-1) {
+ start_offset = start;
+ // if the end is specified but incorrect
+ // set the end_offset in order to generate a bad response
+ if (end != (NPT_Position)-1 && end < start) {
+ end_offset = (NPT_Position)-1;
+ }
+ }
+
+ // in case the range request was invalid or we can't seek then respond appropriately
+ if (start_offset == (NPT_Position)-1 || end_offset == (NPT_Position)-1 ||
+ start_offset > end_offset || NPT_FAILED(stream->Seek(start_offset))) {
+ response.SetStatus(416, "Requested range not satisfiable");
+ } else {
+ len = end_offset - start_offset + 1;
+ response.SetStatus(206, "Partial Content");
+ PLT_HttpHelper::SetContentRange(response, start_offset, end_offset, total_len);
+
+ entity->SetInputStream(stream);
+ entity->SetContentLength(len);
+ }
+ } else {
+ entity->SetInputStream(stream);
+ }
+ return NPT_SUCCESS;
+ }
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltHttpServer.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltHttpServer.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,98 @@
+/*****************************************************************
+|
+| Platinum - HTTP Server
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_HTTP_SERVER_H_
+#define _PLT_HTTP_SERVER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttpServerListener.h"
+#include "PltHttpServerTask.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_HttpServerStartIterator;
+
+/*----------------------------------------------------------------------
+| PLT_HttpServer class
++---------------------------------------------------------------------*/
+class PLT_HttpServer : public PLT_HttpServerListener,
+ public NPT_HttpServer
+{
+ friend class PLT_HttpServerTask;
+ friend class PLT_HttpServerStartIterator;
+
+public:
+ PLT_HttpServer(unsigned int port = 0,
+ bool port_rebind = false,
+ NPT_Cardinal max_clients = 0,
+ bool reuse_address = false);
+ virtual ~PLT_HttpServer();
+
+ // PLT_HttpServerListener method
+ NPT_Result ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response,
+ bool& headers_only);
+
+ virtual NPT_Result Start();
+ virtual NPT_Result Stop();
+ virtual unsigned int GetPort() { return m_Port; }
+
+private:
+ PLT_TaskManager* m_TaskManager;
+ unsigned int m_Port;
+ bool m_PortRebind;
+ bool m_ReuseAddress;
+ PLT_HttpServerListenTask* m_HttpListenTask;
+};
+
+/*----------------------------------------------------------------------
+| PLT_FileServer class
++---------------------------------------------------------------------*/
+class PLT_FileServer
+{
+public:
+ // class methods
+ static NPT_Result ServeFile(NPT_HttpResponse& response,
+ NPT_String file_path,
+ NPT_Position start = (NPT_Position)-1,
+ NPT_Position end = (NPT_Position)-1,
+ bool request_is_head = false);
+ static const char* GetMimeType(const NPT_String& filename);
+};
+
+#endif /* _PLT_HTTP_SERVER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltHttpServerListener.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltHttpServerListener.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,55 @@
+/*****************************************************************
+|
+| Platinum - HTTP Server Listener
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+#ifndef _PLT_HTTP_SERVER_LISTENER_H_
+#define _PLT_HTTP_SERVER_LISTENER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerListener Interface
++---------------------------------------------------------------------*/
+class PLT_HttpServerListener
+{
+ public:
+ virtual ~PLT_HttpServerListener() {}
+
+ virtual NPT_Result ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response,
+ bool& headers_only) = 0;
+};
+
+#endif /* _PLT_HTTP_SERVER_LISTENER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltHttpServerTask.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltHttpServerTask.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,294 @@
+/*****************************************************************
+|
+| Platinum - HTTP Server Tasks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltHttpServerTask.h"
+#include "PltHttp.h"
+#include "PltVersion.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.http.servertask")
+
+/*----------------------------------------------------------------------
+| external references
++---------------------------------------------------------------------*/
+extern NPT_String HttpServerHeader;
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::PLT_HttpServerSocketTask
++---------------------------------------------------------------------*/
+PLT_HttpServerSocketTask::PLT_HttpServerSocketTask(NPT_Socket* socket,
+ bool stay_alive_forever) :
+ m_Socket(socket),
+ m_StayAliveForever(stay_alive_forever)
+{
+ socket->SetReadTimeout(30000);
+ socket->SetWriteTimeout(30000);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::~PLT_HttpServerSocketTask
++---------------------------------------------------------------------*/
+PLT_HttpServerSocketTask::~PLT_HttpServerSocketTask()
+{
+ delete m_Socket;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_HttpServerSocketTask::DoRun()
+{
+ NPT_BufferedInputStreamReference buffered_input_stream;
+ NPT_HttpRequestContext context;
+ NPT_Result res = NPT_SUCCESS;
+ bool headers_only;
+ bool keep_alive = false;
+
+ // create a buffered input stream to parse http request
+ // as it comes
+ NPT_InputStreamReference input_stream;
+ NPT_CHECK_LABEL_SEVERE(GetInputStream(input_stream), done);
+ buffered_input_stream = new NPT_BufferedInputStream(input_stream);
+
+ while (!IsAborting(0)) {
+ NPT_HttpRequest* request = NULL;
+ NPT_HttpResponse* response = NULL;
+
+ // reset keep-alive in case of failure
+ keep_alive = false;
+
+ // wait for a request
+ res = Read(buffered_input_stream, request, &context);
+ if (NPT_FAILED(res) || (request == NULL)) goto cleanup;
+
+ // callback to process request and get back a response
+ headers_only = false;
+ res = ProcessRequest(*request, context, response, headers_only);
+ if (NPT_FAILED(res) || (response == NULL)) goto cleanup;
+
+ // send back response
+ keep_alive = PLT_HttpHelper::IsConnectionKeepAlive(*request);
+ res = Write(response, keep_alive, headers_only);
+
+cleanup:
+ // cleanup
+ delete request;
+ delete response;
+
+ if (!keep_alive && !m_StayAliveForever) {
+ // if we were to support persistent connections
+ // we would stop only if res would be a failure
+ // (like a timeout or a read/write error)
+ goto done;
+ }
+ }
+
+done:
+ return;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::GetInputStream(NPT_InputStreamReference& stream)
+{
+ return m_Socket->GetInputStream(stream);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::GetInfo(NPT_SocketInfo& info)
+{
+ return m_Socket->GetInfo(info);
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::Read
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::Read(NPT_BufferedInputStreamReference& buffered_input_stream,
+ NPT_HttpRequest*& request,
+ NPT_HttpRequestContext* context)
+{
+ NPT_SocketInfo info;
+ GetInfo(info);
+
+ if (context) {
+ // extract socket info
+ context->SetLocalAddress(info.local_address);
+ context->SetRemoteAddress(info.remote_address);
+ }
+
+ // parse request
+ NPT_Result res = NPT_HttpRequest::Parse(*buffered_input_stream, &info.local_address, request);
+ if (NPT_FAILED(res) || !request) {
+ // only log if not timeout
+ res = NPT_FAILED(res)?res:NPT_FAILURE;
+ if (res != NPT_ERROR_TIMEOUT && res != NPT_ERROR_EOS) NPT_CHECK_WARNING(res);
+ return res;
+ }
+
+ // read socket info again to refresh the remote address in case it was a udp socket
+ GetInfo(info);
+ if (context) {
+ context->SetLocalAddress(info.local_address);
+ context->SetRemoteAddress(info.remote_address);
+ }
+
+ // return right away if no body is expected
+ if (request->GetMethod() == NPT_HTTP_METHOD_GET ||
+ request->GetMethod() == NPT_HTTP_METHOD_HEAD)
+ return NPT_SUCCESS;
+
+ // create an entity
+ NPT_HttpEntity* request_entity = new NPT_HttpEntity(request->GetHeaders());
+ request->SetEntity(request_entity);
+
+ // buffer body now if any
+ if (request_entity->GetContentLength() > 0) {
+ // unbuffer the stream
+ buffered_input_stream->SetBufferSize(0);
+
+ NPT_MemoryStream* body_stream = new NPT_MemoryStream();
+ NPT_CHECK_SEVERE(NPT_StreamToStreamCopy(
+ *buffered_input_stream.AsPointer(),
+ *body_stream,
+ 0,
+ request_entity->GetContentLength()));
+
+ // set entity body
+ request_entity->SetInputStream((NPT_InputStreamReference)body_stream);
+
+ // rebuffer the stream
+ buffered_input_stream->SetBufferSize(NPT_BUFFERED_BYTE_STREAM_DEFAULT_SIZE);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::Write
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_HttpServerSocketTask::Write(NPT_HttpResponse* response,
+ bool& keep_alive,
+ bool headers_only /* = false */)
+{
+ // add any headers that may be missing
+ NPT_HttpHeaders& headers = response->GetHeaders();
+ const NPT_String* value = headers.GetHeaderValue(NPT_HTTP_HEADER_CONNECTION);
+ if (value) {
+ // only replace Connection header if already set and keep_alive passed not allowed
+ if (!keep_alive) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONNECTION, "close"); // override
+ } else {
+ keep_alive = value->Compare("keep-alive") == 0; // keep-alive ok but use whatever was set
+ }
+ } else {
+ headers.SetHeader(NPT_HTTP_HEADER_CONNECTION, keep_alive?"keep-alive":"close");
+ }
+
+ // set user agent
+ headers.SetHeader(NPT_HTTP_HEADER_SERVER,
+ NPT_HttpServer::m_ServerHeader, false); // set but don't replace
+
+ // get the response entity to set additional headers
+ NPT_HttpEntity* entity = response->GetEntity();
+ if (entity) {
+ if (entity->HasContentLength()) {
+ // content length
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH,
+ NPT_String::FromIntegerU(entity->GetContentLength()));
+ }
+
+ // content type
+ NPT_String content_type = entity->GetContentType();
+ if (!content_type.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_TYPE, content_type);
+ }
+
+ // content encoding
+ NPT_String content_encoding = entity->GetContentEncoding();
+ if (!content_encoding.IsEmpty()) {
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_ENCODING, content_encoding);
+ }
+ } else {
+ // force content length to 0 is there is no message body
+ headers.SetHeader(NPT_HTTP_HEADER_CONTENT_LENGTH, "0");
+ }
+
+ //headers.SetHeader("DATE", "Wed, 13 Feb 2008 22:32:57 GMT");
+ //headers.SetHeader("Accept-Ranges", "bytes");
+
+ NPT_LOG_FINE("PLT_HttpServerTask Sending response:");
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, response);
+
+ // get the socket stream to send the request
+ NPT_OutputStreamReference output_stream;
+ NPT_CHECK_SEVERE(m_Socket->GetOutputStream(output_stream));
+
+ // create a memory stream to buffer the headers
+ NPT_MemoryStream header_stream;
+
+ // emit the response headers into the header buffer
+ response->Emit(header_stream);
+
+ // send the headers
+ NPT_CHECK_SEVERE(output_stream->WriteFully(header_stream.GetData(), header_stream.GetDataSize()));
+
+ // send response body if any
+ if (!headers_only && entity) {
+ NPT_InputStreamReference body_stream;
+ entity->GetInputStream(body_stream);
+
+ if (!body_stream.IsNull()) {
+ NPT_CHECK_SEVERE(NPT_StreamToStreamCopy(
+ *body_stream.AsPointer(),
+ *output_stream.AsPointer(),
+ 0,
+ entity->GetContentLength()));
+ }
+ }
+
+ // flush the output stream so that everything is sent to the server
+ output_stream->Flush();
+
+ return NPT_SUCCESS;
+}
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltHttpServerTask.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltHttpServerTask.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,163 @@
+/*****************************************************************
+|
+| Platinum - HTTP Server Tasks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_HTTP_SERVER_TASK_H_
+#define _PLT_HTTP_SERVER_TASK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttp.h"
+#include "PltDatagramStream.h"
+#include "PltThreadTask.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+template class PLT_HttpListenTask;
+class PLT_HttpServerListener;
+typedef PLT_HttpListenTask PLT_HttpServerListenTask;
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask class
++---------------------------------------------------------------------*/
+class PLT_HttpServerSocketTask : public PLT_ThreadTask
+{
+ friend class PLT_ThreadTask;
+
+public:
+ PLT_HttpServerSocketTask(NPT_Socket* socket, bool stay_alive_forever = false);
+
+protected:
+ virtual ~PLT_HttpServerSocketTask();
+
+protected:
+ // Request callback handler
+ virtual NPT_Result ProcessRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response,
+ bool& headers_only) = 0;
+
+ // overridables
+ virtual NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ virtual NPT_Result GetInfo(NPT_SocketInfo& info);
+
+ // PLT_ThreadTask methods
+ virtual void DoAbort() { m_Socket->Disconnect(); }
+ virtual void DoRun();
+
+private:
+ virtual NPT_Result Read(NPT_BufferedInputStreamReference& buffered_input_stream,
+ NPT_HttpRequest*& request,
+ NPT_HttpRequestContext* context = NULL);
+ virtual NPT_Result Write(NPT_HttpResponse* response,
+ bool& keep_alive,
+ bool headers_only = false);
+
+protected:
+ NPT_Socket* m_Socket;
+ bool m_StayAliveForever;
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerTask class
++---------------------------------------------------------------------*/
+template
+class PLT_HttpServerTask : public PLT_HttpServerSocketTask
+{
+public:
+ PLT_HttpServerTask(T* data,
+ NPT_Socket* socket,
+ bool keep_alive = false) :
+ PLT_HttpServerSocketTask(socket, keep_alive), m_Data(data) {}
+
+protected:
+ virtual ~PLT_HttpServerTask() {}
+
+protected:
+ NPT_Result ProcessRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response,
+ bool& headers_only) {
+ return m_Data->ProcessHttpRequest(request, context, response, headers_only);
+ }
+
+protected:
+ T* m_Data;
+};
+
+/*----------------------------------------------------------------------
+| PLT_HttpListenTask class
++---------------------------------------------------------------------*/
+template
+class PLT_HttpListenTask : public PLT_ThreadTask
+{
+public:
+ PLT_HttpListenTask(T* data, NPT_TcpServerSocket* socket, bool cleanup_socket = true) :
+ m_Data(data), m_Socket(socket), m_CleanupSocket(cleanup_socket) {}
+
+protected:
+ virtual ~PLT_HttpListenTask() {
+ if (m_CleanupSocket) delete m_Socket;
+ }
+
+protected:
+ // PLT_ThreadTask methods
+ virtual void DoAbort() { m_Socket->Disconnect(); }
+ virtual void DoRun() {
+ while (!IsAborting(0)) {
+ NPT_Socket* client = NULL;
+ NPT_Result result = m_Socket->WaitForNewClient(client, 5000);
+ if (NPT_FAILED(result) && result != NPT_ERROR_TIMEOUT) {
+ if (client) delete client;
+ //NPT_LOG_WARNING_2("PLT_HttpListenTask exiting with %d (%s)", result, NPT_ResultText(result));
+ break;
+ }
+
+ if (NPT_SUCCEEDED(result)) {
+ PLT_ThreadTask* task = new PLT_HttpServerTask(m_Data, client);
+ if (NPT_FAILED(m_TaskManager->StartTask(task))) {
+ task->Kill();
+ }
+ }
+ }
+ }
+
+protected:
+ T* m_Data;
+ NPT_TcpServerSocket* m_Socket;
+ bool m_CleanupSocket;
+};
+
+#endif /* _PLT_HTTP_SERVER_TASK_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltIconsData.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltIconsData.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,2579 @@
+/*****************************************************************
+|
+| Platinum - AV Media Server Device SCPDs
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 Platinum_120x120_jpg[16096] =
+{
+ 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00,
+ 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xC0,
+ 0x00, 0x11, 0x08, 0x00, 0x81, 0x00, 0x81, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00,
+ 0x1F, 0x00, 0x00, 0x01, 0x04, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03,
+ 0x06, 0x07, 0x08, 0x02, 0x05, 0x09, 0x0A, 0x01, 0x00, 0x0B, 0xFF, 0xC4, 0x00, 0x49, 0x10, 0x00, 0x01, 0x03, 0x03, 0x02,
+ 0x04, 0x03, 0x04, 0x07, 0x04, 0x04, 0x0C, 0x07, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x11, 0x07, 0x21,
+ 0x00, 0x12, 0x31, 0x41, 0x08, 0x13, 0x51, 0x14, 0x61, 0x71, 0x81, 0x09, 0x15, 0x22, 0x32, 0x91, 0xA1, 0xB1, 0x23, 0x52,
+ 0xC1, 0xD1, 0x42, 0x72, 0xB2, 0xE1, 0x0A, 0x16, 0x17, 0x24, 0x34, 0x35, 0x62, 0x92, 0xB3, 0xD2, 0xF0, 0xF1, 0x25, 0x33,
+ 0x37, 0x45, 0x73, 0x74, 0x75, 0xFF, 0xC4, 0x00, 0x1A, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xFF, 0xC4, 0x00, 0x3B, 0x11, 0x01, 0x00,
+ 0x01, 0x03, 0x03, 0x03, 0x01, 0x06, 0x05, 0x03, 0x02, 0x06, 0x01, 0x05, 0x00, 0x00, 0x01, 0x11, 0x02, 0x21, 0x31, 0x00,
+ 0x03, 0x41, 0x12, 0x51, 0x61, 0x71, 0x22, 0x32, 0x81, 0x91, 0xB1, 0xF0, 0x04, 0x13, 0xA1, 0xC1, 0xD1, 0x42, 0xE1, 0xF1,
+ 0x52, 0x72, 0x05, 0x23, 0x62, 0x92, 0xB2, 0xD2, 0xA2, 0x14, 0x33, 0x34, 0x53, 0x83, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01,
+ 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xA3, 0xEA, 0x9A, 0x46, 0x7E, 0xD1, 0x3F, 0x2D, 0xBA, 0xFA, 0x9D, 0xBE,
+ 0x7F, 0x87, 0x1F, 0x5B, 0x22, 0x90, 0xFD, 0xC3, 0x30, 0xE7, 0xE5, 0xEA, 0x61, 0xD7, 0xB1, 0xA4, 0x15, 0x37, 0xD5, 0x5B,
+ 0x1C, 0xF7, 0x07, 0xF0, 0xC6, 0x00, 0xE0, 0x99, 0x40, 0xF0, 0x91, 0x78, 0xEF, 0x2F, 0x57, 0x6B, 0x73, 0x9F, 0x99, 0xA1,
+ 0x97, 0x37, 0x03, 0xAE, 0x76, 0xF8, 0x9E, 0xFB, 0x8C, 0x6D, 0x9F, 0x97, 0x4C, 0x9E, 0x19, 0x32, 0xCB, 0xCF, 0xBA, 0x5A,
+ 0x42, 0x3C, 0xCD, 0xFD, 0x6C, 0x97, 0xD1, 0xA1, 0xD5, 0x3B, 0xB7, 0x37, 0xC7, 0x7F, 0xE4, 0x7A, 0x1F, 0x99, 0xFC, 0xF8,
+ 0x86, 0xA6, 0xF2, 0x0C, 0x31, 0x8B, 0x19, 0xF9, 0xCF, 0xED, 0xA2, 0x13, 0x26, 0x6E, 0x79, 0x3B, 0xE8, 0x45, 0xCD, 0x38,
+ 0xFB, 0xDB, 0x9E, 0x9F, 0x0F, 0xC7, 0x3E, 0xBD, 0x8E, 0xDB, 0xF0, 0x99, 0x8B, 0x4F, 0x4A, 0x5B, 0xB0, 0x4F, 0x3C, 0x4C,
+ 0xFC, 0x7B, 0xF6, 0xD1, 0x6E, 0x71, 0xF2, 0xD0, 0x6B, 0x9F, 0x83, 0xF7, 0xBD, 0x49, 0xDF, 0xD7, 0xB8, 0xCF, 0x5F, 0x87,
+ 0xBB, 0x6E, 0x15, 0xCB, 0x4F, 0x9B, 0x7A, 0x7F, 0x19, 0xD3, 0x33, 0x89, 0xF0, 0xFF, 0x00, 0x67, 0xE5, 0xF4, 0x9D, 0x0F,
+ 0xF5, 0xA0, 0x49, 0x19, 0x39, 0x00, 0x6D, 0xBE, 0xE3, 0x3D, 0x32, 0x36, 0xDB, 0x61, 0x9F, 0x81, 0x07, 0xAF, 0x0B, 0xEE,
+ 0xD9, 0xF8, 0x6A, 0x8A, 0x2A, 0x49, 0x88, 0x26, 0x26, 0x4F, 0xA4, 0xCE, 0xAD, 0x5F, 0x85, 0x0D, 0x3A, 0x4E, 0xBC, 0x6B,
+ 0x56, 0x9A, 0x69, 0x04, 0x7A, 0xEC, 0x2B, 0x71, 0xFD, 0x40, 0xBB, 0xA8, 0x76, 0xD3, 0xF7, 0x14, 0xE6, 0x84, 0x98, 0xD4,
+ 0x36, 0x6A, 0xF2, 0x1D, 0x41, 0x99, 0xEC, 0x85, 0xD6, 0x13, 0x32, 0x51, 0x8D, 0x16, 0x69, 0x81, 0x09, 0x4F, 0xB0, 0x89,
+ 0x72, 0x9B, 0x44, 0x75, 0xBC, 0xD2, 0x56, 0x5C, 0x47, 0x2E, 0xEE, 0xF3, 0x49, 0x5C, 0x13, 0xD2, 0x32, 0x77, 0x01, 0x98,
+ 0xF3, 0x24, 0x46, 0x42, 0xF7, 0xD4, 0xEE, 0x46, 0xD6, 0xDD, 0x55, 0xB7, 0x42, 0xA8, 0xB5, 0x96, 0x60, 0x8E, 0x50, 0xB7,
+ 0xAE, 0x6D, 0x31, 0xAF, 0x43, 0x9E, 0x27, 0xBE, 0x86, 0x3B, 0x52, 0xC6, 0xD1, 0x9B, 0x8A, 0xF6, 0xD1, 0x6B, 0xD6, 0xF6,
+ 0xAF, 0xDD, 0x56, 0x45, 0xBF, 0x3A, 0xE0, 0xAB, 0x5B, 0x37, 0xCA, 0x2D, 0xF9, 0x6C, 0x5D, 0x94, 0xCA, 0x44, 0x57, 0x27,
+ 0x56, 0x53, 0x45, 0x95, 0x43, 0xA5, 0xD1, 0xDE, 0xA0, 0xD7, 0x9A, 0x84, 0xC4, 0xA9, 0x90, 0x21, 0x3C, 0x9A, 0x9D, 0x3A,
+ 0x72, 0xD8, 0xFA, 0xB4, 0xB9, 0x19, 0xE7, 0x5A, 0x97, 0xC7, 0x9F, 0xB7, 0xF8, 0xCA, 0xBA, 0x82, 0xB2, 0x05, 0xB4, 0x4C,
+ 0x4B, 0x7C, 0x3D, 0xCC, 0xB2, 0x45, 0xE3, 0x9D, 0x70, 0xD1, 0xF8, 0x95, 0xA8, 0x2A, 0x08, 0x58, 0xB5, 0xA2, 0x70, 0xDF,
+ 0x31, 0xCD, 0xCB, 0x73, 0xAF, 0x2C, 0xFA, 0x80, 0x88, 0xF0, 0x64, 0xAD, 0x4C, 0x6E, 0xD2, 0xC1, 0x29, 0x3B, 0x0E, 0x60,
+ 0x49, 0xC1, 0x29, 0x23, 0x9B, 0x9B, 0x19, 0x4A, 0x87, 0xAF, 0x50, 0x9D, 0xC8, 0xF5, 0x76, 0xF7, 0x1A, 0x80, 0x42, 0xEE,
+ 0x66, 0xE6, 0x6C, 0xC0, 0x52, 0x71, 0xF0, 0x73, 0x3A, 0xF5, 0x28, 0x07, 0xA5, 0x48, 0xF6, 0x7A, 0x5E, 0xAB, 0x65, 0x95,
+ 0x2E, 0x79, 0x27, 0x99, 0x49, 0xBC, 0x6A, 0x18, 0x91, 0x51, 0x1C, 0xEA, 0x3C, 0xD8, 0x03, 0xA1, 0xC8, 0xC0, 0x18, 0x39,
+ 0xCE, 0x46, 0xFB, 0x11, 0xE9, 0xD7, 0xAF, 0x6E, 0x35, 0xD5, 0xDC, 0x83, 0xB4, 0x94, 0xD8, 0xC0, 0x81, 0x49, 0x1D, 0xA1,
+ 0xEE, 0xF9, 0x67, 0x4E, 0x7B, 0x2A, 0x8B, 0x5E, 0xBF, 0xAE, 0xDB, 0x4A, 0xC0, 0xB3, 0x28, 0xD3, 0x6E, 0x8B, 0xDA, 0xFA,
+ 0xB8, 0xA9, 0x56, 0xA5, 0xA1, 0x6C, 0xD3, 0x7C, 0x91, 0x3A, 0xB5, 0x70, 0xD6, 0xA5, 0x37, 0x12, 0x9F, 0x4F, 0x60, 0xC9,
+ 0x71, 0x88, 0xED, 0x79, 0x8F, 0x38, 0x14, 0xF4, 0x99, 0x2F, 0x35, 0x16, 0x24, 0x74, 0xBB, 0x26, 0x4B, 0xCD, 0x30, 0xD3,
+ 0x8E, 0x27, 0x1D, 0xCD, 0xCE, 0x96, 0x1F, 0x64, 0x89, 0x96, 0xD3, 0x69, 0xFA, 0x71, 0x9C, 0x5B, 0xB4, 0xD4, 0x94, 0x8D,
+ 0x4B, 0x14, 0xD2, 0x2B, 0x52, 0x58, 0x82, 0x6E, 0x5F, 0xD2, 0x09, 0x56, 0x20, 0x67, 0x5B, 0xCD, 0x6F, 0xD3, 0x1B, 0xFB,
+ 0x40, 0xF5, 0x2E, 0xE9, 0xD1, 0xDD, 0x59, 0xB7, 0x45, 0xA3, 0xA8, 0xB6, 0x7A, 0xE9, 0xAA, 0xAC, 0xD1, 0x51, 0x54, 0xA5,
+ 0xD6, 0xE2, 0x2A, 0x2D, 0x66, 0x9B, 0x16, 0xAF, 0x48, 0xA8, 0xD3, 0x2B, 0x34, 0x79, 0x12, 0xE9, 0xB5, 0x5A, 0x5D, 0x4A,
+ 0x99, 0x36, 0x34, 0xC8, 0x73, 0xA1, 0xBE, 0xB6, 0xDC, 0x6D, 0xD2, 0x16, 0x1B, 0x79, 0x2E, 0x34, 0x99, 0xDB, 0xDE, 0xA6,
+ 0xA2, 0x69, 0xAB, 0xAA, 0x94, 0x91, 0xCC, 0xDE, 0xF1, 0x37, 0xE1, 0x02, 0xD7, 0x83, 0x0E, 0x9E, 0xDD, 0x54, 0xD7, 0x4D,
+ 0x35, 0xD3, 0x7A, 0x5B, 0x8B, 0x24, 0x5D, 0xA5, 0x22, 0x24, 0x7A, 0x88, 0xB9, 0xC6, 0x0D, 0x42, 0x8E, 0xCC, 0xCA, 0xB3,
+ 0xCF, 0x8D, 0xF7, 0xC7, 0x4E, 0xDE, 0x83, 0x07, 0x3E, 0x83, 0x60, 0x77, 0xEF, 0xC6, 0x8E, 0xE4, 0x60, 0x7F, 0xF8, 0xFE,
+ 0xF2, 0x7E, 0xFA, 0x26, 0xCC, 0x07, 0xCB, 0x17, 0xEF, 0x76, 0xF3, 0x0F, 0xC3, 0x41, 0xB9, 0x28, 0x0C, 0x1E, 0x6E, 0xA0,
+ 0x8E, 0xBB, 0xE0, 0x7C, 0x89, 0xCE, 0x3A, 0x0E, 0xFD, 0x08, 0xDF, 0x69, 0xEA, 0xA9, 0x11, 0x88, 0x99, 0x2C, 0x3F, 0xDE,
+ 0x33, 0x67, 0xE9, 0x6D, 0x13, 0x09, 0xDD, 0x78, 0x1C, 0x47, 0x08, 0x21, 0x98, 0x7B, 0x6B, 0x5E, 0xE4, 0xCC, 0x64, 0x76,
+ 0xDC, 0x6F, 0xD8, 0x80, 0x4F, 0x41, 0x8E, 0xA3, 0x71, 0xF2, 0xDB, 0x89, 0xBF, 0xDE, 0x0F, 0xE0, 0xFD, 0x25, 0xF3, 0xA9,
+ 0xEA, 0x2F, 0xD8, 0x3D, 0x6D, 0x3C, 0x44, 0xC5, 0xFB, 0xC7, 0x37, 0xEE, 0x2F, 0xB4, 0x9F, 0x51, 0xFE, 0xE9, 0xE1, 0x49,
+ 0xDC, 0xF9, 0x9A, 0x99, 0x7B, 0xD1, 0xF3, 0x75, 0x63, 0x97, 0x3B, 0x6F, 0xBD, 0x83, 0xE8, 0x08, 0x39, 0xF5, 0xD8, 0x93,
+ 0xF2, 0xCF, 0xA6, 0xDB, 0xEF, 0xC7, 0x62, 0x12, 0x5F, 0x30, 0x37, 0x2D, 0x01, 0xCD, 0xBD, 0x27, 0xEB, 0x31, 0xAC, 0xB1,
+ 0xDE, 0xFF, 0x00, 0x27, 0xF9, 0x8F, 0xD3, 0x43, 0xAA, 0x76, 0xD8, 0xCF, 0x7C, 0x1C, 0x91, 0xD3, 0xD7, 0x19, 0xED, 0xB7,
+ 0xA7, 0xAF, 0x71, 0xC2, 0xEA, 0x66, 0x66, 0xF8, 0xC4, 0x31, 0xF2, 0x8F, 0xAE, 0xA8, 0xA1, 0x89, 0x7D, 0x41, 0x21, 0x38,
+ 0xE7, 0x1C, 0xBF, 0x1D, 0x0E, 0xA9, 0xDE, 0xFD, 0xFA, 0x9C, 0x9D, 0xBA, 0x0F, 0x71, 0x39, 0xDF, 0xB9, 0xEE, 0x07, 0x0B,
+ 0xE2, 0xCF, 0x1F, 0x73, 0x6F, 0x1A, 0x3A, 0x19, 0x99, 0x31, 0x39, 0xB5, 0xEF, 0x0C, 0x5A, 0x43, 0xCE, 0x19, 0xBE, 0x74,
+ 0x32, 0xA6, 0xEE, 0x72, 0xAD, 0xB7, 0x03, 0xFB, 0x8E, 0x73, 0xE9, 0xBF, 0x0A, 0x7F, 0x9F, 0x5D, 0x5B, 0xB6, 0xF4, 0x89,
+ 0xD5, 0x3D, 0xD8, 0x0B, 0xBF, 0xD2, 0x37, 0xB5, 0xDB, 0x97, 0xED, 0x0E, 0x85, 0x72, 0x6F, 0xA9, 0x3B, 0xE4, 0x01, 0x9C,
+ 0x0F, 0x78, 0xDC, 0xE3, 0xA6, 0x77, 0xCE, 0x3F, 0x11, 0x87, 0x2F, 0x7E, 0xC7, 0xCB, 0x1A, 0xAA, 0x68, 0xA4, 0x60, 0x25,
+ 0x61, 0x7A, 0x81, 0x98, 0x23, 0x36, 0x3C, 0xC4, 0x62, 0x74, 0x0B, 0xB3, 0x39, 0x72, 0x79, 0x8F, 0x43, 0xD4, 0xEF, 0xF3,
+ 0x38, 0xEB, 0x80, 0x3B, 0x7B, 0xC6, 0xF8, 0xE1, 0x6A, 0xA0, 0x38, 0x26, 0xE4, 0x90, 0x5A, 0xE6, 0x0E, 0x7E, 0x30, 0xF6,
+ 0xBE, 0x9B, 0xF5, 0x0A, 0xA1, 0x6D, 0xB2, 0xA2, 0xA3, 0x80, 0x36, 0x19, 0xC6, 0x48, 0x19, 0x1D, 0x09, 0xE8, 0x08, 0x03,
+ 0xAF, 0x50, 0x73, 0xC4, 0x57, 0x54, 0x16, 0x61, 0xCE, 0x26, 0xDC, 0xDB, 0xFB, 0xE9, 0x2F, 0x49, 0x3F, 0x29, 0x39, 0xE2,
+ 0x1E, 0x7E, 0x87, 0x6D, 0x3F, 0xBC, 0x31, 0xEA, 0x24, 0xC4, 0x6B, 0x25, 0x56, 0xD4, 0xA7, 0x55, 0x57, 0x47, 0xBC, 0x9C,
+ 0xB6, 0xA9, 0x97, 0xF6, 0x9B, 0x54, 0x10, 0xF2, 0xDA, 0x78, 0xDD, 0x5A, 0x63, 0x5B, 0x35, 0x19, 0xD4, 0xF8, 0xCA, 0x42,
+ 0x92, 0xB3, 0x25, 0xFA, 0x15, 0x72, 0x54, 0xC6, 0x9B, 0x4A, 0xB9, 0xD6, 0x8A, 0x73, 0xC0, 0x0C, 0x24, 0x94, 0xF3, 0x52,
+ 0x1B, 0x8D, 0x74, 0x0B, 0x35, 0x52, 0x24, 0xDD, 0xEA, 0xA5, 0x6E, 0xF8, 0xA8, 0x59, 0x7B, 0xF7, 0x35, 0x8E, 0xF5, 0x43,
+ 0x45, 0x15, 0xE6, 0x92, 0xB6, 0x8D, 0xCA, 0x5C, 0x94, 0xEE, 0x10, 0x3C, 0x91, 0x34, 0x87, 0xC7, 0x8B, 0x1A, 0xF6, 0xA7,
+ 0xE1, 0xF3, 0xE9, 0x5F, 0xD3, 0xDD, 0x5A, 0xF0, 0xD3, 0x72, 0x3D, 0xA9, 0x0E, 0x33, 0x4D, 0xD5, 0x0B, 0x6E, 0xCE, 0xAB,
+ 0xD2, 0x2E, 0x18, 0xAB, 0x71, 0xA6, 0xD8, 0xAC, 0x4F, 0x6E, 0x93, 0x2A, 0x1B, 0x95, 0x03, 0x1D, 0xDE, 0x55, 0xB4, 0x97,
+ 0xC9, 0xE7, 0x7D, 0x00, 0x2D, 0xB7, 0x1C, 0x56, 0x42, 0x80, 0x5E, 0xFC, 0x55, 0x7E, 0x0E, 0xA3, 0x76, 0x98, 0xB0, 0x54,
+ 0x49, 0x0C, 0xC9, 0x0C, 0x52, 0xF9, 0xC9, 0xDA, 0x39, 0xD7, 0x99, 0x5E, 0xCB, 0x4D, 0x47, 0x48, 0xD5, 0x4B, 0x0D, 0x29,
+ 0xCC, 0xFF, 0x00, 0x49, 0x7C, 0xF6, 0x96, 0x53, 0x5E, 0x20, 0x2F, 0xAD, 0x44, 0x87, 0x5A, 0xAF, 0xD4, 0x5A, 0x88, 0xE2,
+ 0x56, 0xC2, 0xD1, 0x4E, 0xA9, 0xC6, 0xF2, 0xD5, 0x90, 0x63, 0xD5, 0x69, 0xEC, 0x49, 0x40, 0x46, 0x4E, 0x0A, 0x4B, 0xDE,
+ 0xD0, 0x12, 0x53, 0xB6, 0x47, 0x41, 0x93, 0xC7, 0x65, 0x29, 0x4A, 0x2C, 0x0A, 0x72, 0x48, 0x29, 0xDB, 0x98, 0x26, 0xE4,
+ 0xDF, 0x18, 0x75, 0xED, 0xAF, 0x45, 0x03, 0x52, 0xC8, 0xD5, 0x49, 0x1C, 0x34, 0xA8, 0xF8, 0xF2, 0xA6, 0x64, 0x88, 0xBC,
+ 0x30, 0x5F, 0xA9, 0xE5, 0xA5, 0x10, 0xA2, 0x0F, 0xEE, 0x93, 0x90, 0x3B, 0xF6, 0xEF, 0xD8, 0xFA, 0x1D, 0xFB, 0xF1, 0x6D,
+ 0x7C, 0xB5, 0x2D, 0xE4, 0x25, 0x3B, 0x98, 0xB6, 0x1C, 0x29, 0xAC, 0xFA, 0xCE, 0x95, 0xBC, 0xCD, 0xB1, 0x72, 0xF2, 0xA6,
+ 0x48, 0x4F, 0x8D, 0xBE, 0x0D, 0xFB, 0x67, 0x57, 0x35, 0x1B, 0x4A, 0xF5, 0x46, 0xCE, 0xD4, 0x2D, 0x2C, 0xAA, 0x2E, 0x97,
+ 0xA8, 0xDA, 0x7E, 0xB9, 0x57, 0xC5, 0x87, 0x35, 0x08, 0x0E, 0xA9, 0xBB, 0x96, 0xD3, 0x93, 0x4E, 0xAD, 0x84, 0x25, 0xA5,
+ 0xA5, 0x69, 0x79, 0x4F, 0xD1, 0x21, 0xD6, 0xDB, 0x53, 0x45, 0x0A, 0x0E, 0xB3, 0xE7, 0x20, 0x82, 0x09, 0xC6, 0x2D, 0x4D,
+ 0x4B, 0x4A, 0x53, 0x54, 0xD3, 0x54, 0x09, 0x94, 0x27, 0xA7, 0xCC, 0x9C, 0x4C, 0xD4, 0x76, 0xD2, 0xFC, 0xCA, 0x5A, 0x2A,
+ 0xA3, 0x70, 0x2A, 0xA6, 0xA5, 0x2A, 0x9B, 0x59, 0x13, 0x27, 0x25, 0x50, 0xCE, 0x6D, 0x6D, 0x11, 0xA8, 0xFA, 0xD7, 0xAA,
+ 0x9A, 0xCD, 0xAB, 0xF7, 0x4D, 0xFF, 0x00, 0xAC, 0x97, 0x3C, 0x9B, 0xBB, 0x54, 0x2B, 0xB1, 0xE1, 0x4E, 0xBF, 0xEB, 0x4F,
+ 0xA9, 0x20, 0x37, 0x71, 0xD4, 0x98, 0x6A, 0x4B, 0x16, 0xEC, 0x56, 0x50, 0x12, 0xD4, 0x78, 0x76, 0x85, 0xB0, 0xDD, 0xB9,
+ 0x42, 0x6E, 0x23, 0x69, 0xF2, 0xE2, 0xC9, 0x62, 0x73, 0x21, 0x21, 0x68, 0x58, 0x08, 0x4F, 0x70, 0xA4, 0xA7, 0xA0, 0xA7,
+ 0xA8, 0x31, 0x2C, 0x55, 0xD2, 0x3C, 0x01, 0x02, 0x77, 0x52, 0x64, 0x75, 0x25, 0x61, 0x47, 0x46, 0xD5, 0x26, 0xDD, 0x33,
+ 0x3C, 0xAA, 0x79, 0x9B, 0xCD, 0x4B, 0x54, 0xC6, 0x24, 0xF5, 0xD2, 0x0D, 0xCB, 0x52, 0x92, 0x30, 0xA2, 0x7A, 0x83, 0xB9,
+ 0x00, 0xEC, 0x37, 0x27, 0x23, 0x3B, 0xEC, 0x7E, 0x3B, 0x8E, 0x35, 0x2B, 0xEF, 0xF7, 0xF7, 0x7F, 0x97, 0x2E, 0xA6, 0x5E,
+ 0xEF, 0x7F, 0xBB, 0xFD, 0xA5, 0xB9, 0xD6, 0x4A, 0x92, 0x7D, 0x73, 0xB1, 0xD8, 0x91, 0xCA, 0x77, 0xDF, 0xB1, 0xE9, 0xDB,
+ 0xAE, 0x4F, 0xB8, 0x6C, 0x35, 0xE2, 0xC6, 0x49, 0xCC, 0xC4, 0xF6, 0x88, 0xED, 0xCD, 0xB3, 0x6D, 0x3E, 0xA6, 0xC5, 0xA0,
+ 0xE3, 0xED, 0x99, 0xF8, 0xE6, 0xFA, 0x19, 0x6F, 0x9E, 0x84, 0xFB, 0x86, 0xF8, 0xC0, 0xDF, 0x7C, 0x8D, 0xFD, 0x01, 0xCE,
+ 0x07, 0x5E, 0x9B, 0x01, 0x2D, 0x4B, 0xF2, 0x8C, 0xB3, 0xF0, 0xB8, 0x03, 0xDA, 0x3F, 0x9D, 0x4E, 0x92, 0xF3, 0x8F, 0xA0,
+ 0xFC, 0x47, 0xFC, 0xDC, 0x4C, 0xD5, 0xDE, 0x9F, 0xFB, 0x0F, 0xE7, 0x46, 0xA7, 0x95, 0xCC, 0x3D, 0xCF, 0xBF, 0x07, 0x6C,
+ 0x7B, 0x8F, 0x40, 0x32, 0x7A, 0x7B, 0xBA, 0xF5, 0xE3, 0xD1, 0xB5, 0xA2, 0x7C, 0xFF, 0x00, 0x6D, 0x74, 0xC1, 0x25, 0xC0,
+ 0xA5, 0x60, 0xA7, 0xA8, 0xE3, 0x29, 0x24, 0xF1, 0xC9, 0x7B, 0xB3, 0xA4, 0x15, 0x33, 0x24, 0x9C, 0xEC, 0x7D, 0x0F, 0x4E,
+ 0xA3, 0x61, 0xDB, 0x39, 0xDF, 0xAF, 0xC7, 0x85, 0xA2, 0xDE, 0xB3, 0xC5, 0xED, 0xF2, 0x8F, 0xD3, 0x48, 0x2A, 0x6E, 0x4E,
+ 0xCB, 0xC0, 0xDB, 0xA1, 0xC1, 0xEF, 0xD3, 0xE3, 0xEE, 0x19, 0xF4, 0xDF, 0x27, 0x83, 0xEF, 0xEF, 0xFB, 0xE8, 0x98, 0x33,
+ 0x7E, 0xD1, 0x8F, 0x23, 0xDE, 0xC7, 0x9D, 0x0E, 0xA9, 0x80, 0x83, 0xB8, 0xC1, 0xDC, 0x9C, 0xE0, 0x9C, 0x76, 0xC7, 0x51,
+ 0xF9, 0x74, 0x19, 0xCF, 0x06, 0x89, 0x7B, 0xBF, 0xE7, 0x43, 0xAE, 0x67, 0x30, 0xC0, 0x3B, 0x01, 0x9D, 0xCE, 0xF8, 0xE9,
+ 0xD7, 0x38, 0xEB, 0xD3, 0x04, 0x91, 0xB6, 0x31, 0x8E, 0x06, 0xD9, 0xE6, 0x39, 0xEF, 0x89, 0xED, 0x3C, 0x4E, 0x96, 0x65,
+ 0xF8, 0xE8, 0x67, 0x64, 0x13, 0xFD, 0x2D, 0x80, 0x04, 0x6F, 0xD0, 0xE7, 0xD7, 0xB1, 0x3E, 0x9B, 0xED, 0xC0, 0xDA, 0x7B,
+ 0xF6, 0xD3, 0x87, 0xF6, 0xF9, 0xE2, 0xD9, 0xBE, 0x9B, 0x55, 0x67, 0x14, 0xA6, 0x54, 0x32, 0x72, 0x93, 0x91, 0x82, 0x09,
+ 0xC6, 0xF9, 0x03, 0x07, 0xA6, 0xE3, 0x38, 0x1B, 0x8E, 0xF8, 0xE3, 0x9F, 0x75, 0xF7, 0xBC, 0x40, 0x7A, 0x4C, 0x76, 0xE5,
+ 0x9E, 0xFE, 0x35, 0x35, 0xFB, 0xB7, 0x98, 0x5B, 0x7C, 0x33, 0xCD, 0xB1, 0xAA, 0xC3, 0x7E, 0xDD, 0xB5, 0xFD, 0x33, 0xB9,
+ 0xEC, 0xDD, 0x5F, 0xB5, 0x8B, 0x82, 0xE1, 0xD2, 0xFB, 0x9A, 0x9B, 0x77, 0xC4, 0x6D, 0x1F, 0x68, 0xCE, 0x83, 0x4F, 0x5A,
+ 0xDA, 0xAF, 0x51, 0xDD, 0x46, 0xC1, 0xC8, 0xF5, 0xBB, 0x7A, 0x45, 0x56, 0x96, 0xEB, 0x2A, 0xE6, 0x43, 0x86, 0x4A, 0x32,
+ 0x3E, 0xC8, 0xC7, 0x15, 0x75, 0xD5, 0xB7, 0x55, 0x1B, 0xB4, 0xCC, 0xED, 0x55, 0xD5, 0x04, 0xFB, 0x54, 0x90, 0xD4, 0x31,
+ 0x93, 0xA6, 0x78, 0xB3, 0x39, 0xCE, 0xB9, 0x77, 0x09, 0xA1, 0xEC, 0x17, 0x0E, 0x69, 0xC2, 0x7C, 0xAE, 0x46, 0x18, 0xD5,
+ 0xD2, 0xF1, 0x1D, 0xAD, 0xF5, 0xDB, 0x22, 0xB8, 0xCD, 0xDB, 0xA6, 0xD5, 0x82, 0x9B, 0x1B, 0x5B, 0x2C, 0x88, 0xF7, 0x14,
+ 0x35, 0xC4, 0x6B, 0xCD, 0x69, 0xE6, 0xAB, 0x34, 0xD6, 0x66, 0xA0, 0x2E, 0x43, 0x88, 0x24, 0x33, 0xE4, 0xBC, 0xD7, 0x98,
+ 0xCA, 0x31, 0xCE, 0xF0, 0xC3, 0x8B, 0x0D, 0x80, 0x13, 0xDD, 0xF8, 0xAD, 0xDA, 0x68, 0x28, 0xAE, 0x81, 0x8D, 0xCA, 0x3A,
+ 0x84, 0xB8, 0x89, 0x37, 0x02, 0x6C, 0x7C, 0xE3, 0x29, 0x95, 0xF8, 0x7A, 0xC2, 0x92, 0x9A, 0xA9, 0xEB, 0xAB, 0x6E, 0xA6,
+ 0x16, 0xA6, 0x1A, 0x4E, 0x48, 0x85, 0x99, 0x18, 0x64, 0xCD, 0xF5, 0x4F, 0x68, 0x35, 0x77, 0x45, 0x52, 0x86, 0x85, 0x3A,
+ 0xA5, 0x17, 0x34, 0xD7, 0x4E, 0x9F, 0x59, 0x59, 0xCA, 0x96, 0xE4, 0x8A, 0x64, 0xD7, 0x5E, 0x59, 0xED, 0xCC, 0x56, 0xA5,
+ 0x73, 0x1D, 0xB7, 0x18, 0xC0, 0xC0, 0x03, 0x8C, 0xAA, 0x6A, 0x26, 0xFF, 0x00, 0xF2, 0xF6, 0x92, 0x00, 0x09, 0xA5, 0xC7,
+ 0xD6, 0xD3, 0x9B, 0xEB, 0x4E, 0xA6, 0xB6, 0xA6, 0xA4, 0x56, 0xA6, 0x63, 0x03, 0xC8, 0x78, 0xFD, 0x42, 0x09, 0xB6, 0xA6,
+ 0x06, 0xDF, 0x2E, 0x35, 0x82, 0x01, 0x27, 0x04, 0xE3, 0xAF, 0x63, 0xB7, 0xE9, 0x9F, 0x43, 0xC5, 0xF8, 0x96, 0x3B, 0x4D,
+ 0xB4, 0x69, 0x8F, 0x70, 0xD1, 0xD7, 0x35, 0xF8, 0xD2, 0x58, 0x95, 0x32, 0x0C, 0xD8, 0x32, 0x5B, 0x99, 0x02, 0x7D, 0x3E,
+ 0x53, 0xF0, 0xA7, 0xC0, 0x94, 0xC9, 0xE6, 0x6E, 0x4C, 0x29, 0x91, 0x56, 0xD4, 0x88, 0xCF, 0x37, 0x95, 0x04, 0xB8, 0xD3,
+ 0x88, 0x5E, 0x14, 0xA4, 0xF3, 0x72, 0xAD, 0x41, 0x53, 0x03, 0x1C, 0x24, 0x22, 0x4C, 0x8B, 0x61, 0x1B, 0x33, 0x6C, 0xF1,
+ 0x17, 0xC6, 0x91, 0x0D, 0x3E, 0x55, 0xE2, 0xC8, 0x58, 0xBB, 0x79, 0xB6, 0x62, 0xF6, 0x8D, 0x0D, 0x41, 0xA3, 0x26, 0x96,
+ 0x95, 0x84, 0x17, 0x56, 0xB7, 0x5D, 0x76, 0x44, 0x87, 0xDF, 0x71, 0xC9, 0x12, 0x24, 0xC9, 0x79, 0xC5, 0xBA, 0xF4, 0x89,
+ 0x32, 0x1E, 0x53, 0x8F, 0x48, 0x90, 0xFB, 0xCE, 0x2D, 0xE7, 0x9D, 0x75, 0xC5, 0x38, 0xEB, 0xAB, 0x5B, 0x8E, 0x2D, 0x4A,
+ 0x52, 0x94, 0x40, 0x29, 0x23, 0xCC, 0x0B, 0x2A, 0xAE, 0x65, 0xBB, 0x77, 0xBA, 0xFC, 0xA3, 0x4E, 0x39, 0xE6, 0xD1, 0x76,
+ 0x63, 0x9B, 0x44, 0x5E, 0xDE, 0x74, 0xF5, 0x43, 0xBC, 0x8D, 0x80, 0x0F, 0x6C, 0x6D, 0x9C, 0x1C, 0xF7, 0x04, 0x6F, 0xD3,
+ 0xD7, 0x6E, 0x2B, 0xEF, 0xE5, 0xA3, 0x5F, 0x0B, 0xFE, 0xFF, 0x00, 0xCC, 0x9F, 0xD3, 0x83, 0x46, 0x90, 0x5C, 0x8F, 0xFB,
+ 0x7E, 0xB9, 0xDF, 0x6F, 0x99, 0xED, 0xEB, 0xC1, 0xA3, 0x48, 0x7B, 0x4A, 0x7F, 0x7C, 0x7E, 0x29, 0xFE, 0x7C, 0x1A, 0x35,
+ 0x35, 0x19, 0x5B, 0xEC, 0xAF, 0x76, 0xD9, 0xC7, 0xA7, 0xC8, 0x83, 0xEB, 0xB7, 0x7E, 0xFC, 0x77, 0xA8, 0x31, 0x97, 0xC5,
+ 0xE3, 0xD6, 0x3F, 0xCF, 0x8D, 0x74, 0xC7, 0x90, 0xED, 0x3C, 0xFD, 0xF9, 0xD2, 0x66, 0x59, 0xDC, 0x67, 0x63, 0x9C, 0x8C,
+ 0xF6, 0x3D, 0x7A, 0x9E, 0xF9, 0xDB, 0x3E, 0xBD, 0x3A, 0x70, 0xC4, 0xBC, 0x64, 0x0B, 0xCD, 0xA5, 0xF0, 0x42, 0x27, 0x99,
+ 0xBF, 0x11, 0xA5, 0xA4, 0x55, 0x27, 0x24, 0xE4, 0x8F, 0x76, 0xFD, 0x07, 0xBC, 0xF6, 0xDC, 0x7E, 0x67, 0xDD, 0xC4, 0x35,
+ 0x25, 0xA1, 0x1F, 0x17, 0xF8, 0x62, 0xE7, 0x78, 0x6C, 0x73, 0xAA, 0xB5, 0xAF, 0x79, 0x3D, 0xE0, 0x06, 0x7E, 0x67, 0xCF,
+ 0xE1, 0xA1, 0x97, 0x28, 0xEE, 0x79, 0x8E, 0x3E, 0xEF, 0x43, 0x8C, 0x83, 0xD3, 0x19, 0x1D, 0x3A, 0x9E, 0xFB, 0xF6, 0xDF,
+ 0x84, 0xD6, 0xDA, 0x0C, 0xDE, 0x6E, 0x23, 0x7B, 0x16, 0xB9, 0x21, 0x99, 0xE6, 0x24, 0x74, 0x9E, 0x7B, 0x0C, 0x7C, 0x78,
+ 0x26, 0xDE, 0x3E, 0xB1, 0x7D, 0x02, 0xE5, 0x4D, 0xA6, 0x81, 0x2B, 0x5A, 0x42, 0x53, 0x95, 0x12, 0x4F, 0xDD, 0xE5, 0x07,
+ 0x99, 0x4A, 0xDC, 0x8C, 0x80, 0x32, 0x76, 0x3D, 0x31, 0xDC, 0x71, 0x9B, 0x54, 0x5D, 0xA9, 0x26, 0xD9, 0xCF, 0xEF, 0x69,
+ 0xE3, 0x12, 0xBA, 0x5D, 0x45, 0xAE, 0x2B, 0x88, 0xF5, 0xF9, 0x7C, 0x31, 0x16, 0x2F, 0x89, 0xB6, 0xD8, 0xD1, 0x7D, 0x5A,
+ 0xB9, 0x74, 0x7A, 0xB7, 0xE2, 0x02, 0x97, 0xA6, 0x97, 0x5D, 0x5F, 0x45, 0x2D, 0x7B, 0x80, 0x5A, 0x97, 0x5E, 0xA5, 0x51,
+ 0xD8, 0x89, 0x57, 0xA1, 0x5A, 0x55, 0xC3, 0x06, 0x9D, 0x51, 0x43, 0x17, 0x54, 0x6A, 0x7C, 0xB7, 0xAB, 0x56, 0xE4, 0x25,
+ 0x44, 0xAB, 0x53, 0x1C, 0x4D, 0x76, 0xAD, 0x4C, 0x8F, 0x6F, 0x85, 0xCC, 0x65, 0x95, 0x55, 0x43, 0xA5, 0x48, 0x4B, 0xAB,
+ 0x7A, 0x2A, 0x09, 0xA2, 0x91, 0xF6, 0xC1, 0x95, 0xAA, 0x09, 0x42, 0x56, 0x60, 0x6E, 0x5A, 0x2E, 0xC7, 0x77, 0xD7, 0x41,
+ 0x5D, 0x3B, 0x6D, 0x54, 0x95, 0x27, 0x55, 0x34, 0xD4, 0x43, 0x59, 0x28, 0x42, 0xC0, 0xB9, 0xF6, 0x64, 0x5F, 0x2E, 0xA3,
+ 0x4A, 0xED, 0x05, 0xD4, 0x30, 0xA5, 0xB4, 0x8E, 0x74, 0x29, 0x3C, 0xC8, 0x5A, 0x47, 0xF4, 0x54, 0x01, 0x49, 0xC8, 0xC8,
+ 0xDC, 0x1E, 0xA3, 0xB1, 0x04, 0x6D, 0xB9, 0xCD, 0xAC, 0xA8, 0xA9, 0x98, 0x9C, 0x43, 0x03, 0x2D, 0xB3, 0x01, 0x31, 0x89,
+ 0x96, 0xEF, 0x94, 0xDC, 0x3A, 0x8B, 0x11, 0x2B, 0x97, 0xCF, 0x3D, 0xBE, 0xFC, 0x3A, 0xAC, 0xBA, 0x87, 0x49, 0xF6, 0x88,
+ 0x72, 0x98, 0x71, 0xAE, 0x64, 0xAD, 0xB7, 0x12, 0xB0, 0x40, 0x50, 0x51, 0xE5, 0x3F, 0x67, 0x1B, 0x9E, 0xF9, 0xC9, 0xC0,
+ 0xDB, 0xAE, 0x3A, 0xF3, 0xD6, 0x48, 0x98, 0x65, 0xF8, 0x70, 0xFA, 0x0E, 0x5C, 0xC8, 0xCC, 0x76, 0xE7, 0x66, 0xF4, 0xB1,
+ 0x34, 0xB0, 0x17, 0x98, 0x6D, 0x57, 0x84, 0x99, 0x99, 0x71, 0x11, 0xA6, 0x1B, 0xD5, 0x99, 0x77, 0x27, 0x84, 0x5B, 0x46,
+ 0x93, 0x2D, 0xD5, 0x3B, 0x53, 0xD0, 0xCD, 0x51, 0xAC, 0xE9, 0x8B, 0x6E, 0x2C, 0xF3, 0xB8, 0x9B, 0x62, 0xAE, 0x86, 0xEE,
+ 0x3B, 0x44, 0x2F, 0x39, 0x21, 0xA4, 0xD2, 0xAA, 0x8A, 0xA7, 0xB2, 0x09, 0x28, 0x50, 0xA7, 0xA8, 0x00, 0xAF, 0x2C, 0x81,
+ 0x2D, 0x7D, 0x7F, 0x83, 0xA6, 0x95, 0xF6, 0xB6, 0x37, 0x6A, 0xDA, 0x89, 0x67, 0xA6, 0xAF, 0x68, 0xF3, 0x69, 0x82, 0xF3,
+ 0x9B, 0x44, 0x47, 0x35, 0x07, 0x4D, 0x68, 0x70, 0xA7, 0x88, 0x26, 0x08, 0x99, 0xB1, 0xF0, 0x93, 0x5A, 0xEB, 0x45, 0xD7,
+ 0x16, 0xFD, 0xB0, 0xEA, 0xF2, 0x54, 0xAD, 0x3F, 0xB7, 0x23, 0x12, 0x41, 0x49, 0x4B, 0x94, 0x9A, 0xCD, 0xD5, 0x48, 0x75,
+ 0xB2, 0x49, 0xCF, 0x33, 0x0A, 0x84, 0x1B, 0x56, 0x7D, 0x06, 0x09, 0x04, 0x71, 0x3B, 0x6F, 0xB4, 0x75, 0x5D, 0xFC, 0xBD,
+ 0xBC, 0xC2, 0xC9, 0x55, 0x74, 0x85, 0xB9, 0x22, 0x23, 0x88, 0x9D, 0x6B, 0x4D, 0xBA, 0xA5, 0xB4, 0xB2, 0xE3, 0xBA, 0xAF,
+ 0xAF, 0x89, 0x67, 0x8D, 0x58, 0x08, 0x4F, 0x7E, 0xCD, 0x39, 0x3F, 0xD1, 0x03, 0x63, 0x9C, 0x90, 0x07, 0xBF, 0x6C, 0x91,
+ 0xEB, 0xEF, 0xC9, 0xED, 0xB0, 0xCC, 0xFA, 0xC7, 0x6F, 0xB8, 0xFD, 0x53, 0x54, 0xF5, 0x1C, 0x5E, 0x61, 0x11, 0x22, 0x32,
+ 0x5C, 0xBA, 0x77, 0xED, 0xE7, 0x4B, 0x38, 0x42, 0xBE, 0xD2, 0x80, 0xCF, 0x4C, 0xF7, 0x39, 0xC0, 0xC6, 0x7B, 0x9F, 0x4F,
+ 0xD3, 0x81, 0xE2, 0xDC, 0xFC, 0x4C, 0xC6, 0x31, 0x7F, 0xAE, 0x9E, 0x87, 0x2A, 0x03, 0xA9, 0xE0, 0x00, 0xC7, 0xA3, 0xA7,
+ 0x0C, 0x4C, 0x5B, 0x03, 0x6B, 0xF7, 0x8E, 0x6D, 0xCB, 0x10, 0x49, 0xA4, 0xD4, 0xEE, 0xD8, 0x07, 0x18, 0x39, 0xFE, 0x1D,
+ 0x37, 0xF5, 0xCF, 0xE7, 0x8E, 0xFC, 0x3D, 0x2D, 0x0E, 0xB7, 0xC2, 0x7A, 0x93, 0xBE, 0x76, 0x39, 0x39, 0xF5, 0xD8, 0x7E,
+ 0xA7, 0x6E, 0x14, 0xF8, 0xB9, 0x9C, 0xC0, 0xF6, 0x98, 0x8D, 0x1A, 0x11, 0x72, 0xB3, 0xB0, 0xC7, 0x5E, 0xA7, 0x7F, 0x5F,
+ 0xE8, 0x8C, 0x6F, 0xF1, 0x3E, 0xEE, 0x1F, 0xC7, 0xEF, 0xEF, 0xD7, 0x47, 0xF7, 0xFE, 0xDF, 0x2D, 0x23, 0xED, 0x4E, 0x7E,
+ 0xFA, 0xBF, 0x04, 0xF0, 0x68, 0xD4, 0xC1, 0xED, 0x60, 0x67, 0x24, 0x67, 0x3D, 0x46, 0x37, 0x27, 0x3D, 0xBB, 0xED, 0xD7,
+ 0x71, 0x9C, 0x67, 0xD7, 0x8E, 0x86, 0x5E, 0x5F, 0x12, 0xAF, 0xAF, 0x27, 0xC0, 0xE3, 0xE1, 0xAE, 0x82, 0xAE, 0x0C, 0xDB,
+ 0x0F, 0x4C, 0xE4, 0xB2, 0xCD, 0xA2, 0x5E, 0xDE, 0x75, 0x87, 0xB6, 0x24, 0x6C, 0x0E, 0x09, 0x19, 0x00, 0xF5, 0x24, 0x7E,
+ 0x78, 0xDB, 0x1D, 0x3F, 0x2E, 0x08, 0x59, 0x89, 0xB4, 0x4E, 0x71, 0x01, 0x96, 0x78, 0xFD, 0xF1, 0x7D, 0x2E, 0xB2, 0x62,
+ 0x03, 0x33, 0x29, 0x56, 0x30, 0x58, 0xB3, 0xE1, 0xB7, 0x1A, 0xCB, 0xDA, 0x49, 0xDB, 0x3D, 0x72, 0x70, 0x00, 0x38, 0x4E,
+ 0x33, 0x92, 0x70, 0x41, 0xDF, 0x73, 0xB1, 0xEF, 0xBE, 0x76, 0xE1, 0x08, 0xE1, 0x1F, 0x46, 0x75, 0x3F, 0x99, 0xDB, 0x3E,
+ 0x41, 0x23, 0x9E, 0x73, 0xDA, 0xDF, 0x2D, 0x20, 0xF2, 0xD7, 0xCB, 0x93, 0x91, 0xB6, 0xC7, 0x7C, 0x60, 0x9E, 0xD8, 0xC6,
+ 0x09, 0x1D, 0x4E, 0x09, 0x19, 0x38, 0xDB, 0x85, 0x55, 0x40, 0x59, 0xBD, 0xF9, 0x2D, 0xE7, 0xEC, 0xF8, 0xEA, 0x7A, 0xDE,
+ 0x6E, 0xDE, 0x2F, 0x21, 0xE8, 0x71, 0x78, 0x94, 0xBC, 0x7A, 0xE9, 0x9F, 0x57, 0x90, 0xA4, 0xB4, 0xE0, 0xE6, 0xC6, 0x52,
+ 0x52, 0x71, 0xB6, 0x32, 0x0E, 0xC4, 0xE3, 0xDD, 0x9C, 0x1E, 0xE3, 0x1B, 0x0E, 0x30, 0x73, 0xE5, 0x57, 0xE3, 0xDF, 0xF6,
+ 0xB4, 0x59, 0xB4, 0x6A, 0x2E, 0xCE, 0x56, 0x16, 0x66, 0xE4, 0x5E, 0x4E, 0xE1, 0xDB, 0x11, 0x2F, 0x7D, 0x4A, 0xFE, 0x0D,
+ 0xBE, 0x90, 0xCD, 0x49, 0xF0, 0x23, 0xA9, 0xA9, 0xAE, 0xC0, 0xAC, 0x26, 0x8F, 0x6D, 0x55, 0x61, 0x22, 0xD8, 0xB8, 0x2B,
+ 0x13, 0xE9, 0x72, 0xAE, 0xDD, 0x39, 0xBB, 0xEC, 0x75, 0x87, 0x19, 0xFF, 0x00, 0x27, 0x7E, 0x23, 0x74, 0xCA, 0x3F, 0x32,
+ 0xAF, 0x6B, 0x06, 0x2C, 0x59, 0x12, 0x60, 0x50, 0x75, 0x0E, 0xD8, 0x43, 0x5A, 0x97, 0xA7, 0x34, 0xE7, 0x95, 0x1D, 0x2D,
+ 0x5C, 0xD6, 0xEC, 0x63, 0x4D, 0x44, 0x55, 0x5D, 0x0F, 0xFC, 0xBD, 0xE6, 0x1C, 0xED, 0xD6, 0x4D, 0x2D, 0x2C, 0xB0, 0xBC,
+ 0xCD, 0x2C, 0x05, 0x54, 0xCB, 0x10, 0x45, 0x41, 0x09, 0xB8, 0x1B, 0xB4, 0xC5, 0x67, 0x53, 0x33, 0x6B, 0x34, 0xD5, 0xFE,
+ 0xBA, 0x2A, 0x5F, 0x65, 0x5B, 0xB4, 0xFB, 0x95, 0x25, 0xFA, 0x73, 0xAF, 0x41, 0x16, 0x8F, 0x83, 0x0F, 0x0B, 0x1F, 0x48,
+ 0xA5, 0x1A, 0x5D, 0xEB, 0xE0, 0x7E, 0xEF, 0xB7, 0x3C, 0x3E, 0xEB, 0x7C, 0xBA, 0x12, 0x6F, 0x3B, 0x97, 0xC1, 0xEE, 0xA0,
+ 0x57, 0x19, 0xB8, 0x74, 0xCA, 0xB5, 0x4C, 0x98, 0x9F, 0x31, 0x57, 0xB7, 0x87, 0x1D, 0x4D, 0xA2, 0x32, 0xFA, 0xAA, 0x5A,
+ 0x5F, 0x55, 0x90, 0xA2, 0x69, 0xD3, 0x29, 0x34, 0xFA, 0xED, 0x12, 0x84, 0xFB, 0xC8, 0xA5, 0xD7, 0xAD, 0xFD, 0x38, 0x90,
+ 0x81, 0x4C, 0x46, 0x6D, 0x7B, 0x9B, 0x2C, 0x6E, 0x4D, 0x74, 0x5B, 0xA7, 0x72, 0x9E, 0x69, 0x88, 0x3A, 0x8B, 0x88, 0xE3,
+ 0xA8, 0x85, 0xF2, 0x89, 0xAC, 0xFF, 0x00, 0xFA, 0x8A, 0xF6, 0x5A, 0x69, 0xDD, 0x5D, 0xDD, 0xBC, 0x53, 0xB8, 0x09, 0x59,
+ 0x68, 0xE9, 0xAE, 0x95, 0x89, 0x09, 0x91, 0x59, 0x8F, 0x66, 0xA4, 0x27, 0x5C, 0x80, 0xF1, 0x31, 0xE0, 0x9B, 0x57, 0xF4,
+ 0x72, 0xEE, 0x9D, 0xA7, 0xFA, 0xA3, 0xA7, 0xF5, 0xEB, 0x02, 0xF2, 0x69, 0xA7, 0x24, 0xB7, 0x4C, 0xAB, 0xB2, 0xD3, 0xF0,
+ 0x2B, 0x10, 0x52, 0xE2, 0x9A, 0x15, 0x6B, 0x62, 0xB7, 0x01, 0xD9, 0x54, 0x4B, 0x9E, 0x8C, 0xB7, 0x12, 0x52, 0x9A, 0x9D,
+ 0x16, 0x6C, 0xB6, 0x5B, 0x51, 0x0C, 0x4A, 0x11, 0xA4, 0xA5, 0x6C, 0x23, 0x5A, 0x6A, 0xA2, 0xA0, 0xAC, 0x69, 0x7B, 0x23,
+ 0xDC, 0xE7, 0x0F, 0xC1, 0x27, 0x5D, 0x74, 0x6E, 0x6D, 0x6F, 0x53, 0x22, 0x41, 0x07, 0x51, 0x05, 0x54, 0xA5, 0xFD, 0xA9,
+ 0x8C, 0x11, 0x26, 0x1C, 0x8C, 0x26, 0xA1, 0xCF, 0x0D, 0x1E, 0x01, 0xF5, 0x2B, 0x58, 0x6E, 0xBB, 0x8F, 0x47, 0x69, 0x54,
+ 0xC9, 0x72, 0x5D, 0xD5, 0x8D, 0x53, 0xD0, 0x34, 0xC0, 0x8C, 0xC4, 0x75, 0xAF, 0xC9, 0x91, 0x42, 0x99, 0x7B, 0xC9, 0xB9,
+ 0x6A, 0x2A, 0xC2, 0x4E, 0x19, 0x89, 0x6A, 0xB6, 0xDB, 0xB3, 0x9D, 0x50, 0x0D, 0xB4, 0xCB, 0x71, 0xC2, 0xD4, 0x39, 0xD1,
+ 0x95, 0x4D, 0x34, 0x51, 0x46, 0xF0, 0xFB, 0x5D, 0x55, 0x51, 0x55, 0xE3, 0xD9, 0x69, 0xEA, 0xEA, 0x89, 0x3F, 0xD3, 0x96,
+ 0x78, 0xD6, 0x55, 0xD3, 0xB3, 0xB7, 0x57, 0xE6, 0x35, 0x15, 0x52, 0x53, 0xB9, 0x53, 0x38, 0xEA, 0x0A, 0x7A, 0x60, 0xA5,
+ 0x89, 0x59, 0x85, 0x91, 0xF4, 0x9D, 0x3D, 0xBC, 0x74, 0xF8, 0x09, 0xB9, 0x7C, 0x1B, 0x78, 0x85, 0xB9, 0x34, 0xEE, 0x43,
+ 0x0F, 0x2E, 0x8F, 0x4C, 0x91, 0x32, 0x45, 0x15, 0xE2, 0x8C, 0x34, 0xFD, 0x0E, 0xE6, 0x6E, 0x3D, 0xCF, 0x4E, 0x2C, 0xAC,
+ 0x24, 0x25, 0x48, 0x62, 0xA6, 0xED, 0xD5, 0x1C, 0x04, 0x92, 0x94, 0x96, 0x79, 0x49, 0xCF, 0x50, 0x36, 0xE2, 0x9A, 0xB6,
+ 0xE2, 0x11, 0x84, 0x98, 0x86, 0xAE, 0xA2, 0x4B, 0xBE, 0xF4, 0xF9, 0xBC, 0x13, 0xC3, 0xD9, 0xFC, 0xBD, 0xFA, 0x3F, 0x30,
+ 0xF6, 0x2B, 0x40, 0xF6, 0x5F, 0x67, 0xAA, 0x8A, 0xA1, 0x2A, 0x15, 0x6E, 0x34, 0xE3, 0x0A, 0xA7, 0x9A, 0x80, 0x86, 0x14,
+ 0xCF, 0xD9, 0xE5, 0xC0, 0xCF, 0xDD, 0xE8, 0x47, 0x51, 0xDB, 0x61, 0xD0, 0x7A, 0x8F, 0x53, 0xB6, 0x38, 0xAB, 0xDF, 0x33,
+ 0x62, 0xE1, 0xDF, 0x33, 0xC8, 0xE4, 0x26, 0xD3, 0x16, 0x70, 0x00, 0xFB, 0x2F, 0xE6, 0x35, 0x13, 0x34, 0xD1, 0x48, 0x82,
+ 0x37, 0x85, 0x89, 0xB6, 0x59, 0xC1, 0xF2, 0x35, 0x11, 0x1D, 0x50, 0x2A, 0xE5, 0x24, 0x67, 0x18, 0xDC, 0x1E, 0x9D, 0x77,
+ 0x1B, 0x1F, 0x76, 0xFF, 0x00, 0x91, 0x1C, 0x39, 0x3B, 0xFA, 0x7C, 0x71, 0xEB, 0x9E, 0x38, 0xCC, 0x5B, 0x4E, 0xAA, 0x13,
+ 0xFE, 0x92, 0xC4, 0xD5, 0x55, 0x2C, 0xB1, 0x88, 0x1E, 0xF6, 0x66, 0xF0, 0x91, 0x7D, 0x06, 0xF3, 0x6B, 0x42, 0x8F, 0xD9,
+ 0xC7, 0x72, 0xA3, 0xB9, 0xED, 0xD7, 0xA6, 0x32, 0x09, 0xDF, 0x7E, 0x98, 0xDF, 0x83, 0xBC, 0x5A, 0x0B, 0x62, 0x3F, 0x9B,
+ 0x44, 0x3D, 0xB5, 0x35, 0x74, 0xDA, 0x2A, 0x54, 0xB4, 0x74, 0xC5, 0x30, 0x72, 0x25, 0x80, 0x88, 0x8F, 0x3C, 0xE7, 0x5A,
+ 0xC7, 0xD6, 0x12, 0x0F, 0x50, 0x72, 0x48, 0xC1, 0xFD, 0xDE, 0xA4, 0xFA, 0xFA, 0xE3, 0x1B, 0x9E, 0x09, 0x15, 0x84, 0x82,
+ 0x2F, 0xE5, 0xFA, 0x72, 0x4F, 0x3C, 0x76, 0xD4, 0xF7, 0xBF, 0xF7, 0xFB, 0x35, 0xAC, 0x71, 0xFC, 0x13, 0x93, 0xBE, 0xC7,
+ 0x23, 0x3B, 0xE7, 0xDF, 0xB6, 0x4F, 0xAE, 0x07, 0xE1, 0xBF, 0x0F, 0x46, 0x83, 0x5B, 0xDE, 0xF0, 0x3F, 0x1D, 0xFE, 0x03,
+ 0xAE, 0x77, 0xDF, 0xB6, 0xDB, 0xF0, 0x68, 0xD2, 0x5E, 0x7A, 0xBF, 0x79, 0x5F, 0x97, 0x06, 0x8D, 0x4A, 0xE6, 0x56, 0x09,
+ 0xC1, 0xEB, 0xD7, 0x7C, 0xF4, 0xF7, 0xA7, 0x6F, 0x5E, 0x98, 0xDB, 0x6E, 0x9C, 0x57, 0x53, 0xDD, 0x7B, 0x12, 0x91, 0xF2,
+ 0x8B, 0xBC, 0xFA, 0x1A, 0x6A, 0xB9, 0xF4, 0xF8, 0x18, 0x34, 0x98, 0x94, 0x02, 0xB2, 0x4F, 0x4F, 0x4D, 0xFA, 0x03, 0x9D,
+ 0xBE, 0x5E, 0xEF, 0x9E, 0x78, 0x95, 0x5E, 0x5E, 0xD6, 0x52, 0x49, 0x98, 0x5C, 0xA7, 0x86, 0x7E, 0x7A, 0x51, 0x36, 0x3F,
+ 0x7F, 0xDA, 0xFF, 0x00, 0x2D, 0x3A, 0x2D, 0x88, 0xD2, 0x6B, 0xF5, 0x8A, 0x65, 0x0A, 0x95, 0x06, 0xA1, 0x58, 0xAC, 0xD5,
+ 0xE6, 0x46, 0x81, 0x4B, 0xA3, 0xD1, 0xE0, 0xCA, 0xAA, 0xD5, 0xAA, 0x73, 0x66, 0x49, 0x6E, 0x24, 0x48, 0x54, 0xFA, 0x6C,
+ 0x26, 0x9E, 0x99, 0x2E, 0x64, 0xA9, 0x52, 0x18, 0x8B, 0x1A, 0x34, 0x76, 0x5C, 0x75, 0xF9, 0x2F, 0xB2, 0xC3, 0x28, 0x5B,
+ 0xCE, 0xB6, 0x95, 0x32, 0xA6, 0xE9, 0x90, 0xBD, 0x80, 0x39, 0xBD, 0xAD, 0xEB, 0xFC, 0x6B, 0x4D, 0xBA, 0x7D, 0xEA, 0xAA,
+ 0x80, 0x22, 0x9F, 0x6A, 0x00, 0x92, 0x58, 0x58, 0xE0, 0xF5, 0xED, 0x8D, 0x58, 0x9B, 0xFF, 0x00, 0xC3, 0xAE, 0xA7, 0x69,
+ 0x8B, 0xB0, 0xA9, 0x9A, 0xA3, 0xA6, 0xDA, 0x83, 0xA6, 0x35, 0x7A, 0x93, 0x2A, 0x7A, 0x9B, 0x4E, 0xD4, 0x4B, 0x36, 0xBF,
+ 0x67, 0xCA, 0xA9, 0xA1, 0x09, 0x2A, 0x5A, 0xA9, 0x82, 0xB7, 0x02, 0x1B, 0x35, 0x02, 0xD0, 0x27, 0xCD, 0x44, 0x27, 0x9F,
+ 0x71, 0x90, 0x0F, 0x9E, 0x84, 0x0D, 0x82, 0x37, 0x04, 0xCF, 0x51, 0x29, 0x33, 0x4B, 0x19, 0x12, 0x46, 0xDE, 0x3A, 0xA1,
+ 0x9B, 0x16, 0x9D, 0x5D, 0x2E, 0xD5, 0x63, 0xD2, 0xD1, 0x5F, 0x0F, 0x42, 0x31, 0x85, 0x58, 0xBC, 0xC2, 0x37, 0xB1, 0x95,
+ 0xB3, 0x15, 0x66, 0xEB, 0xA2, 0x48, 0x80, 0xB7, 0x1A, 0x71, 0x1C, 0xA3, 0x2A, 0x19, 0x23, 0xA8, 0xED, 0x92, 0xA2, 0x77,
+ 0x1E, 0x9D, 0x37, 0xD8, 0xE0, 0x1E, 0x1A, 0x1C, 0x36, 0x7C, 0xC3, 0xE9, 0x66, 0x71, 0xC9, 0xA5, 0x56, 0xD7, 0x4A, 0xB4,
+ 0xF5, 0x54, 0x49, 0xEC, 0x96, 0x4E, 0x51, 0xEF, 0x4D, 0x66, 0x2A, 0x9B, 0x7C, 0x75, 0x5F, 0xAE, 0x7A, 0x33, 0x72, 0x9B,
+ 0x79, 0x0E, 0x37, 0xE6, 0x36, 0xA0, 0x72, 0x92, 0x9C, 0xE4, 0x75, 0xE6, 0xED, 0x9C, 0x75, 0x1D, 0x30, 0x7A, 0x60, 0x90,
+ 0x38, 0xC7, 0x72, 0x92, 0xA1, 0xC6, 0x21, 0xF5, 0x2E, 0x77, 0xE6, 0x07, 0x98, 0xED, 0x7D, 0x64, 0x89, 0x12, 0x44, 0x92,
+ 0x1E, 0x38, 0xD7, 0xEF, 0x0E, 0x7E, 0x29, 0x6F, 0x9F, 0x05, 0x77, 0xE5, 0xBF, 0x39, 0x35, 0x2B, 0xAD, 0xED, 0x17, 0x87,
+ 0x74, 0x37, 0x72, 0x24, 0x5A, 0x95, 0x19, 0x14, 0xFB, 0xEB, 0x44, 0x2E, 0x67, 0x5D, 0x01, 0xED, 0x51, 0xD1, 0xAA, 0xB3,
+ 0x2A, 0xF6, 0x8A, 0x24, 0xF8, 0xF9, 0x2F, 0x5D, 0x56, 0x8A, 0x4A, 0xAD, 0xCB, 0xC6, 0x9C, 0x24, 0xC6, 0xA9, 0xD3, 0xDD,
+ 0x71, 0xC5, 0xAD, 0x58, 0xD3, 0xB8, 0xEC, 0xCE, 0xD6, 0xEC, 0x57, 0xB3, 0x52, 0xF6, 0xF6, 0x16, 0x30, 0xDA, 0x22, 0x61,
+ 0x26, 0x12, 0xD7, 0x8A, 0x87, 0x1A, 0xFD, 0x98, 0x52, 0x69, 0x42, 0x86, 0x4E, 0xAE, 0x93, 0x20, 0x9F, 0xD5, 0xB7, 0xC5,
+ 0x47, 0xBD, 0x47, 0xBD, 0x42, 0x45, 0x54, 0xD5, 0xFD, 0x04, 0xFC, 0x2C, 0xF8, 0xE2, 0xF0, 0xD9, 0xE3, 0xF7, 0x4D, 0xAD,
+ 0xBD, 0x03, 0xF1, 0xAC, 0xCE, 0x9E, 0x5C, 0xB7, 0x94, 0xDA, 0x14, 0x0B, 0xAB, 0x4E, 0x35, 0x38, 0x21, 0x34, 0x3B, 0x3F,
+ 0x58, 0x2D, 0xEA, 0x84, 0x46, 0xD7, 0x49, 0xD4, 0x4B, 0x1A, 0xB5, 0x0D, 0xD8, 0x92, 0xB4, 0xE6, 0xFB, 0x72, 0x2A, 0x90,
+ 0x8B, 0x9A, 0x87, 0x06, 0x74, 0x28, 0x8A, 0x98, 0x99, 0x49, 0x84, 0xB5, 0x40, 0x79, 0xCA, 0x4C, 0x63, 0x73, 0x63, 0x73,
+ 0x6A, 0xAE, 0xBD, 0xAB, 0xD2, 0xDC, 0x0B, 0x8D, 0x2E, 0x22, 0x72, 0x77, 0x33, 0x4F, 0x36, 0xD7, 0x2D, 0x5B, 0x75, 0xED,
+ 0xFF, 0x00, 0xCC, 0xDB, 0x92, 0x1E, 0x94, 0xCB, 0x42, 0x98, 0x52, 0x44, 0x73, 0x4B, 0xC9, 0x0D, 0xF3, 0xAE, 0x92, 0xE8,
+ 0x7E, 0x80, 0xF8, 0x3A, 0xF0, 0xA4, 0xF4, 0x8A, 0x86, 0x9A, 0x44, 0xA0, 0x33, 0x72, 0x55, 0x9B, 0x75, 0xB5, 0x5C, 0x35,
+ 0x2B, 0x91, 0x57, 0x75, 0xD2, 0xE4, 0x37, 0x92, 0xD8, 0x72, 0x24, 0x3A, 0x94, 0xB7, 0xDF, 0x34, 0xDA, 0x7B, 0x88, 0x6D,
+ 0xA4, 0xBE, 0x98, 0x0D, 0xC4, 0x13, 0x02, 0x1A, 0x44, 0xB7, 0x24, 0x06, 0xDB, 0x4A, 0x70, 0x4D, 0xFD, 0xD2, 0xF4, 0xD5,
+ 0x49, 0x00, 0xDB, 0xA4, 0x63, 0xBA, 0x67, 0x01, 0x7F, 0xF1, 0x8D, 0x7B, 0x95, 0xD6, 0x4D, 0x4A, 0x93, 0xC0, 0x04, 0xCC,
+ 0xE0, 0x01, 0x86, 0xE7, 0x6E, 0x35, 0x4B, 0x3E, 0x97, 0x0F, 0x05, 0x2C, 0xF8, 0xB3, 0xD2, 0x28, 0x5A, 0xCD, 0xA5, 0xF4,
+ 0xBF, 0xAF, 0xEF, 0xDB, 0x02, 0x9A, 0xF3, 0x75, 0x0A, 0x55, 0x39, 0x84, 0xC8, 0xA9, 0x5C, 0x96, 0x9C, 0x77, 0x17, 0x35,
+ 0xC4, 0xC0, 0x69, 0x80, 0xA7, 0x66, 0x55, 0xED, 0xF7, 0x17, 0x29, 0xF6, 0xE0, 0xA0, 0x2D, 0xF9, 0x94, 0xA9, 0xF5, 0x36,
+ 0xE2, 0x25, 0xC9, 0x88, 0x8B, 0x1D, 0xEB, 0xD9, 0xAD, 0xDB, 0xA9, 0xDB, 0xAE, 0xD0, 0xC9, 0xCF, 0x98, 0x99, 0x6C, 0xB3,
+ 0x09, 0x19, 0x78, 0xD6, 0xFF, 0x00, 0x85, 0xDF, 0xFC, 0x9A, 0xE1, 0xF7, 0x57, 0xE4, 0xDF, 0x0F, 0x03, 0xCB, 0xE0, 0xF5,
+ 0xD7, 0x8B, 0x0A, 0xCF, 0x87, 0x6A, 0xDA, 0xAB, 0x0A, 0x10, 0xA2, 0xBA, 0xA6, 0x5C, 0x79, 0x58, 0xC2, 0x15, 0xB6, 0x16,
+ 0x50, 0xA4, 0x91, 0x82, 0x52, 0xA4, 0x9C, 0x85, 0xA3, 0x62, 0x95, 0x85, 0x24, 0xF4, 0xE3, 0xB2, 0x69, 0x4B, 0x9E, 0xBE,
+ 0x1B, 0x19, 0xFB, 0xB1, 0xE3, 0x5E, 0xBB, 0x56, 0xD5, 0x41, 0x53, 0x03, 0x7B, 0x09, 0x2D, 0xBB, 0x99, 0x93, 0x10, 0xFD,
+ 0x2D, 0x78, 0xB4, 0x67, 0xE8, 0x9E, 0xD7, 0x9D, 0x67, 0xD0, 0x4D, 0x5A, 0xD7, 0xAB, 0x56, 0x05, 0x2E, 0x3D, 0xAF, 0xA5,
+ 0xB0, 0xE5, 0xBD, 0x12, 0x93, 0x54, 0x4D, 0x41, 0x37, 0x06, 0xA3, 0xCB, 0xA2, 0xC6, 0x35, 0x1B, 0xB2, 0x15, 0x94, 0xD3,
+ 0x11, 0xDC, 0x8E, 0xB5, 0x5B, 0x14, 0xA4, 0x97, 0xE5, 0x49, 0x9C, 0xE3, 0x6C, 0xD4, 0x2A, 0x59, 0xA1, 0xD3, 0xFC, 0xC9,
+ 0xCD, 0xC9, 0x31, 0xA2, 0xAD, 0xEA, 0x69, 0xAA, 0x9A, 0x3F, 0xD5, 0x84, 0xB8, 0x71, 0x78, 0x31, 0x38, 0xB8, 0xAF, 0x31,
+ 0xAC, 0x6B, 0xFC, 0x4E, 0xD5, 0x1B, 0x94, 0xED, 0xB3, 0x57, 0x5E, 0x64, 0xF6, 0x69, 0x92, 0x29, 0x91, 0xBC, 0x8E, 0x13,
+ 0x01, 0x36, 0x22, 0x79, 0xB3, 0x7B, 0x69, 0x25, 0x6E, 0x86, 0xA2, 0xE3, 0x71, 0x5C, 0x71, 0x85, 0xA4, 0x38, 0x83, 0xCA,
+ 0xA1, 0xF6, 0x14, 0x02, 0x81, 0x47, 0xD9, 0x24, 0x82, 0x92, 0x0E, 0x7A, 0x11, 0x92, 0x08, 0xCF, 0x17, 0x03, 0x8A, 0xA2,
+ 0x66, 0x46, 0x6E, 0xF6, 0x89, 0xB3, 0x68, 0xFE, 0xDA, 0xB2, 0x8A, 0x2A, 0x64, 0x4A, 0x23, 0xDE, 0x82, 0xCF, 0xFD, 0x5D,
+ 0x8F, 0x81, 0x0F, 0x1E, 0x2B, 0xCD, 0x71, 0x85, 0x53, 0x5D, 0x6D, 0x89, 0x5F, 0xB3, 0x7D, 0xF7, 0x3C, 0xA8, 0xEC, 0xE0,
+ 0x97, 0xE4, 0xBA, 0x4E, 0x03, 0x51, 0xD9, 0x40, 0x53, 0xAF, 0x2F, 0xA1, 0xF2, 0xDB, 0x42, 0x97, 0xB9, 0x18, 0xCE, 0x38,
+ 0x03, 0xA7, 0x38, 0x79, 0x8B, 0x09, 0xF3, 0xEF, 0x66, 0xDC, 0x27, 0x89, 0xAB, 0x6E, 0xAA, 0x6F, 0x0A, 0x1E, 0xF5, 0x44,
+ 0x74, 0x9D, 0xA7, 0x92, 0xC9, 0x33, 0x6E, 0xD0, 0x69, 0xA0, 0xEC, 0xB4, 0xAC, 0x73, 0x21, 0x43, 0x72, 0xAF, 0x8E, 0xC7,
+ 0x94, 0x8C, 0x60, 0x29, 0x04, 0x10, 0x52, 0xA4, 0x10, 0x08, 0x20, 0xA4, 0x80, 0xA1, 0xB5, 0x0D, 0xB8, 0xC4, 0xB9, 0x21,
+ 0x96, 0x46, 0x42, 0xE7, 0x2F, 0xC7, 0x59, 0xFC, 0x9F, 0x4C, 0x68, 0x25, 0x3E, 0x0F, 0x43, 0xF8, 0x1C, 0x7A, 0xFA, 0x12,
+ 0x78, 0x3A, 0xA9, 0xEE, 0x7C, 0xF4, 0x69, 0x3F, 0x38, 0x7B, 0xBF, 0x03, 0xC2, 0xEB, 0xA7, 0xBF, 0xE8, 0xFF, 0x00, 0x1A,
+ 0x35, 0x27, 0x2E, 0x48, 0xF5, 0xC0, 0xCE, 0x7E, 0x1F, 0x8F, 0xF2, 0x1F, 0x1F, 0x5A, 0xD1, 0xAD, 0x6C, 0xB9, 0xE5, 0xB0,
+ 0x70, 0xA0, 0x3A, 0x92, 0xA3, 0xBE, 0x36, 0x18, 0xEB, 0xEF, 0xEB, 0xD3, 0xE1, 0x81, 0xBA, 0x49, 0xCE, 0x3B, 0x4F, 0xDB,
+ 0xF0, 0x98, 0xD3, 0x42, 0x06, 0x6E, 0xCC, 0x84, 0x90, 0x63, 0x23, 0x79, 0xBF, 0xA7, 0xC7, 0x4D, 0x8B, 0x43, 0xC4, 0x5D,
+ 0x1B, 0x42, 0xF5, 0x36, 0x15, 0xD1, 0x77, 0xD4, 0xAF, 0xDB, 0x56, 0x92, 0x95, 0xDB, 0x95, 0x2B, 0x6F, 0x53, 0xB4, 0xD5,
+ 0xC5, 0x26, 0xEF, 0xD2, 0xCB, 0xF6, 0xCF, 0xAE, 0xAA, 0xB5, 0x6F, 0x5C, 0xF1, 0x5B, 0x42, 0x83, 0x8F, 0x40, 0x71, 0x52,
+ 0x5E, 0x6A, 0x58, 0x6B, 0x9D, 0x4D, 0xC8, 0x89, 0x0D, 0x4B, 0x6D, 0x49, 0x50, 0x29, 0xCB, 0xF3, 0x69, 0xA2, 0xB6, 0x9D,
+ 0xCA, 0x5F, 0xCA, 0xAA, 0x90, 0x9A, 0x61, 0xAA, 0x9A, 0xA9, 0x5B, 0xB3, 0x32, 0x43, 0x11, 0x86, 0xC4, 0x26, 0xB2, 0xAF,
+ 0x72, 0xAD, 0xB2, 0xE9, 0xD0, 0x8D, 0x29, 0x50, 0xB4, 0x22, 0x44, 0x55, 0x04, 0xD3, 0x25, 0xA4, 0xB0, 0x5B, 0xD7, 0xD5,
+ 0x9F, 0x87, 0xBF, 0xA7, 0x67, 0x4A, 0x3C, 0x44, 0x69, 0xAA, 0x34, 0x5F, 0xC5, 0x95, 0xBB, 0xA3, 0x3E, 0x39, 0xF4, 0xF6,
+ 0xAB, 0x19, 0xA8, 0x95, 0x2A, 0xBE, 0x9E, 0xD4, 0x2D, 0xFB, 0x2B, 0x5B, 0x4B, 0x49, 0x42, 0x92, 0x8A, 0xC5, 0x73, 0x43,
+ 0xAF, 0x79, 0xD4, 0x08, 0x35, 0x4B, 0xAE, 0x30, 0x52, 0x9F, 0x4D, 0xC1, 0xA6, 0x17, 0x2D, 0xBB, 0x5C, 0x44, 0xA6, 0xC4,
+ 0xA8, 0x11, 0x84, 0xB5, 0x82, 0xA8, 0x3F, 0x0F, 0x45, 0x75, 0x75, 0xFE, 0x1B, 0x76, 0x91, 0x99, 0xE9, 0x18, 0xBF, 0x9A,
+ 0x2A, 0x4A, 0x89, 0x42, 0xC2, 0x8D, 0xEC, 0x10, 0x6B, 0x9F, 0xF2, 0xCE, 0xAE, 0xBD, 0x9A, 0xEA, 0xDB, 0x78, 0x47, 0xAE,
+ 0x83, 0x88, 0xEB, 0xA1, 0xAA, 0xA0, 0xB6, 0x2A, 0xA7, 0x1E, 0x35, 0xCA, 0x6F, 0x1F, 0xBA, 0x69, 0xE1, 0x46, 0xDA, 0x88,
+ 0xFE, 0xAA, 0x78, 0x39, 0xF1, 0x15, 0x4D, 0xBF, 0xEC, 0x27, 0x6A, 0xD4, 0xF8, 0x17, 0x4F, 0x87, 0x4D, 0x5F, 0x6A, 0xA5,
+ 0xA7, 0x9E, 0x2A, 0x34, 0x6E, 0x5D, 0x72, 0x43, 0x8C, 0x53, 0xC2, 0x6D, 0x0B, 0xCA, 0x05, 0x0E, 0xAF, 0xAA, 0x36, 0x2A,
+ 0x26, 0x06, 0xE9, 0xEE, 0x5C, 0x74, 0x58, 0xD3, 0x2A, 0xD4, 0x17, 0x65, 0x40, 0x6E, 0xA7, 0x2A, 0xE2, 0x87, 0x21, 0xCA,
+ 0xEB, 0x5A, 0x1D, 0x61, 0x59, 0xBD, 0x4F, 0x4A, 0x05, 0xF0, 0x33, 0x11, 0xD0, 0x2C, 0xCF, 0x88, 0x4B, 0x49, 0x11, 0xAE,
+ 0xED, 0xAD, 0xDA, 0xDA, 0x6A, 0xA3, 0x7C, 0x6E, 0x56, 0x53, 0xBB, 0xB5, 0xD3, 0x5D, 0x15, 0x20, 0x44, 0xB4, 0xFB, 0xB5,
+ 0x0B, 0x99, 0x24, 0x11, 0xBD, 0xB5, 0xCA, 0xE6, 0xE4, 0x43, 0xAA, 0xF2, 0xAC, 0x3C, 0xCA, 0x19, 0x7C, 0x25, 0x48, 0x75,
+ 0x4B, 0x4A, 0x10, 0x52, 0xB1, 0x91, 0xF6, 0xD4, 0x40, 0x19, 0x07, 0x39, 0x38, 0xFB, 0x39, 0x38, 0x3C, 0xA4, 0x1B, 0x11,
+ 0xA4, 0x83, 0xA8, 0x83, 0x3C, 0xFA, 0xCF, 0xDC, 0xFC, 0xF4, 0x14, 0xD5, 0x5A, 0x40, 0xD6, 0xB7, 0xA9, 0x5E, 0xDE, 0xF2,
+ 0xBC, 0x73, 0x13, 0xA1, 0xEA, 0x7A, 0x40, 0xFD, 0xD9, 0x05, 0xC8, 0xF4, 0x90, 0xCD, 0x6D, 0xF9, 0x68, 0x28, 0x62, 0x9F,
+ 0x4A, 0x42, 0xAA, 0xF3, 0x65, 0xB8, 0xE7, 0xD9, 0x4B, 0x51, 0xE1, 0xC2, 0x4B, 0xEF, 0xBE, 0xE3, 0xA4, 0xF2, 0x36, 0x94,
+ 0x36, 0xA0, 0xA5, 0xE0, 0x1D, 0x8E, 0x44, 0x57, 0xB6, 0x54, 0x5E, 0xD6, 0x0B, 0x53, 0x28, 0x71, 0x19, 0x00, 0x0B, 0xC1,
+ 0x7B, 0xF7, 0xD6, 0xCE, 0xC5, 0x24, 0x35, 0x55, 0x1C, 0xC3, 0x49, 0x07, 0x89, 0xA9, 0x6C, 0xF6, 0xE4, 0xBC, 0xB1, 0xA9,
+ 0xC9, 0x8B, 0x93, 0x51, 0xBC, 0x37, 0x69, 0xB7, 0x87, 0xCD, 0x1C, 0xAB, 0x5B, 0xF7, 0x75, 0x12, 0xAB, 0xA6, 0x30, 0x2A,
+ 0xAF, 0xCE, 0xAC, 0xDC, 0x74, 0x6A, 0xCD, 0xB6, 0xE3, 0x4F, 0x5C, 0xD7, 0x15, 0x52, 0xE7, 0x8F, 0x41, 0xA1, 0x9A, 0xB4,
+ 0x58, 0x95, 0x39, 0x34, 0x3B, 0x4A, 0x34, 0xE8, 0xB4, 0xC3, 0x3D, 0xB8, 0xCC, 0x46, 0xA8, 0xBF, 0x1E, 0x52, 0xE9, 0xC5,
+ 0xC8, 0x26, 0x34, 0x97, 0x7A, 0x0E, 0x93, 0x6B, 0x6B, 0x6E, 0xEF, 0xE5, 0x91, 0x55, 0x51, 0x55, 0xA6, 0x50, 0x20, 0xB8,
+ 0x7F, 0x55, 0xA2, 0x63, 0x8D, 0x67, 0xB5, 0xB3, 0x45, 0x26, 0xE6, 0xE7, 0x50, 0xD0, 0x74, 0x80, 0x85, 0x49, 0x4D, 0x14,
+ 0xC1, 0xD4, 0x53, 0x24, 0xC4, 0x59, 0x94, 0x20, 0xE6, 0x35, 0x7B, 0x34, 0x8F, 0xE9, 0x04, 0xD4, 0x5A, 0x53, 0x16, 0xDA,
+ 0xDC, 0xB8, 0xAB, 0x55, 0x24, 0xCD, 0x6D, 0xD6, 0x24, 0x46, 0x55, 0xC4, 0xE5, 0x46, 0x40, 0x66, 0x90, 0x64, 0x3D, 0x33,
+ 0x31, 0x22, 0xC6, 0xA8, 0xF3, 0x79, 0x69, 0x8E, 0xDA, 0x9D, 0x66, 0x12, 0xA3, 0x35, 0x19, 0xB4, 0xBD, 0x1D, 0xF1, 0x1D,
+ 0xB4, 0xB8, 0x1E, 0xD2, 0x8D, 0xA2, 0xBA, 0x66, 0x94, 0xAA, 0x41, 0x61, 0x06, 0x55, 0x17, 0x88, 0xBE, 0x4E, 0x90, 0xCF,
+ 0x26, 0xB2, 0xAA, 0x8D, 0xAA, 0xBA, 0xA3, 0xA4, 0x48, 0x65, 0x12, 0xEC, 0x5D, 0x92, 0xC3, 0x29, 0x74, 0xB9, 0x36, 0x6C,
+ 0x7A, 0x48, 0xF0, 0x11, 0xF4, 0xB0, 0xD9, 0xB0, 0x51, 0x06, 0xD3, 0xD4, 0xF9, 0xD3, 0x21, 0xD1, 0x27, 0xA2, 0x29, 0x5C,
+ 0xE9, 0x05, 0x2F, 0x31, 0x4D, 0x7E, 0x40, 0x61, 0x11, 0xA5, 0xC5, 0x9C, 0xBF, 0x29, 0xC9, 0x49, 0x90, 0x5C, 0x0B, 0x79,
+ 0x87, 0x90, 0x56, 0xA2, 0xA5, 0x79, 0x13, 0x5F, 0x52, 0x3C, 0x86, 0x39, 0xBF, 0x13, 0xF8, 0x5E, 0xA2, 0x4F, 0x66, 0xA2,
+ 0x7D, 0xA7, 0x19, 0x8B, 0xDD, 0xB3, 0x1C, 0x58, 0x8B, 0x5B, 0x5C, 0x3B, 0x9B, 0x15, 0x13, 0x55, 0x1E, 0xD0, 0x4C, 0xDE,
+ 0x51, 0x1E, 0x4E, 0x24, 0x86, 0x71, 0x7F, 0x8E, 0xBA, 0x67, 0x5F, 0xF0, 0xA3, 0xF4, 0x7F, 0xF8, 0x84, 0xB8, 0x06, 0xAC,
+ 0xB3, 0x1A, 0xD2, 0x7E, 0x75, 0x72, 0x47, 0xD6, 0x75, 0x89, 0x56, 0x75, 0xF0, 0xF5, 0xA7, 0x02, 0xE3, 0x96, 0xEA, 0x92,
+ 0xEB, 0xB2, 0x6B, 0xD4, 0x28, 0x33, 0xA2, 0x34, 0x2A, 0x12, 0x4E, 0x4C, 0xE9, 0x2C, 0x46, 0x81, 0x3E, 0x52, 0xD6, 0xB7,
+ 0x25, 0xBE, 0xEB, 0xEA, 0x2E, 0x9F, 0x3E, 0x77, 0xE9, 0xB3, 0x4A, 0x85, 0xA9, 0xAA, 0x1A, 0xA0, 0x46, 0x4A, 0x6A, 0x8B,
+ 0x9F, 0xA2, 0x7C, 0x4D, 0x66, 0x6E, 0xEE, 0xD0, 0x14, 0x95, 0x20, 0x60, 0x41, 0x8F, 0x98, 0xDB, 0xB1, 0x83, 0x8D, 0x5D,
+ 0x7B, 0x3A, 0x4E, 0x92, 0xD9, 0xD4, 0x0A, 0x45, 0x8B, 0x65, 0x4C, 0xB2, 0xE8, 0x36, 0xF5, 0x0A, 0x03, 0x74, 0xDA, 0x3D,
+ 0xBD, 0x47, 0x99, 0x4D, 0x8F, 0x02, 0x0C, 0x24, 0x79, 0x98, 0x66, 0x3C, 0x74, 0x3A, 0x50, 0xA0, 0xEA, 0x94, 0xEB, 0xAF,
+ 0x38, 0xB5, 0x38, 0xEC, 0xA7, 0xDC, 0x79, 0xF9, 0x2E, 0x3A, 0xF3, 0xAE, 0xAD, 0x50, 0xD1, 0xB8, 0xCA, 0xD1, 0x5D, 0xB2,
+ 0xA3, 0x6E, 0x79, 0xE0, 0x3E, 0x44, 0x07, 0x06, 0xB3, 0x65, 0x56, 0xA9, 0x57, 0x33, 0x96, 0x7B, 0xEB, 0x99, 0xDA, 0xFF,
+ 0x00, 0xF4, 0x42, 0xF8, 0x43, 0xD4, 0x8A, 0x9D, 0x5E, 0xFD, 0x9F, 0x73, 0xDD, 0xBA, 0x45, 0x6D, 0xBA, 0xE4, 0xBA, 0xDD,
+ 0xCD, 0x06, 0xD7, 0xAD, 0x5A, 0x70, 0x2D, 0x18, 0xAC, 0x2D, 0x4A, 0x95, 0x51, 0x95, 0x06, 0x45, 0xCF, 0x44, 0xAA, 0x26,
+ 0xD9, 0x88, 0xAC, 0xBB, 0x21, 0xC4, 0x47, 0x96, 0xAA, 0x6C, 0x30, 0xA3, 0xEC, 0x91, 0x63, 0x32, 0x94, 0xB2, 0x34, 0xA3,
+ 0x7B, 0x70, 0x9A, 0x5A, 0x0A, 0x9B, 0x70, 0xCD, 0xB9, 0xB6, 0x3F, 0xB6, 0x59, 0x9D, 0x6F, 0x4F, 0xE2, 0x77, 0x40, 0xA4,
+ 0x8A, 0xDB, 0x47, 0x51, 0xD4, 0xD9, 0x22, 0x49, 0x3A, 0x83, 0xB3, 0x7D, 0x78, 0xEA, 0xFA, 0x52, 0x75, 0xA7, 0xC1, 0xBE,
+ 0x95, 0x45, 0x8F, 0xE1, 0xFF, 0x00, 0xC1, 0x0E, 0x8F, 0x5B, 0x2D, 0x50, 0x2E, 0x29, 0xAA, 0x7A, 0x7E, 0xBB, 0x5F, 0x31,
+ 0x9C, 0xBD, 0xB5, 0x93, 0x5A, 0x59, 0xB5, 0xAA, 0xAE, 0xC5, 0x95, 0x77, 0x37, 0x75, 0x5C, 0x88, 0x76, 0xA1, 0xA7, 0xFA,
+ 0x15, 0x4D, 0xB8, 0xA3, 0xAA, 0x15, 0xBD, 0x45, 0xB4, 0xE2, 0x5B, 0x55, 0x4D, 0x69, 0xB8, 0xE9, 0x4E, 0xBC, 0xF3, 0x74,
+ 0x2D, 0x3B, 0xA1, 0xD4, 0x13, 0x73, 0x75, 0x15, 0x57, 0x46, 0xDF, 0x5E, 0xEB, 0xED, 0x6E, 0x53, 0x14, 0x52, 0x47, 0x49,
+ 0x28, 0x2B, 0x30, 0xD5, 0x09, 0xDE, 0x54, 0x42, 0xC2, 0x3D, 0xF4, 0x9B, 0xB5, 0x51, 0x55, 0x7B, 0xD5, 0xAD, 0x40, 0xD2,
+ 0x6D, 0x8C, 0x51, 0x42, 0x94, 0xAD, 0x3D, 0x23, 0x0D, 0x68, 0xE5, 0x13, 0x6E, 0x1B, 0x2C, 0x47, 0x17, 0xA2, 0x4A, 0x70,
+ 0x34, 0x10, 0xEB, 0xCE, 0x48, 0x74, 0x95, 0xB8, 0xF3, 0xCE, 0xAC, 0x2D, 0xE7, 0xDE, 0x75, 0x4A, 0x71, 0xE7, 0xDD, 0x5E,
+ 0x00, 0x53, 0xAF, 0x3C, 0xA7, 0x1D, 0x75, 0x60, 0x00, 0xA7, 0x16, 0xA2, 0x12, 0x91, 0xB0, 0x54, 0xBE, 0xC8, 0xCA, 0xDA,
+ 0xF3, 0xFD, 0x4C, 0xDE, 0x6F, 0xDB, 0x3F, 0x6E, 0x9E, 0x3B, 0xE2, 0x49, 0x22, 0xCE, 0x38, 0x3E, 0xF3, 0xA3, 0x83, 0xD9,
+ 0x03, 0xAE, 0x31, 0xDB, 0x1F, 0xAE, 0xC7, 0x86, 0xE7, 0xEF, 0xF6, 0xE3, 0xB6, 0x8D, 0x61, 0xE6, 0x8F, 0x77, 0xFB, 0xC3,
+ 0xF9, 0x70, 0xB4, 0x6A, 0x44, 0x72, 0x4A, 0xBF, 0x78, 0xF5, 0xE8, 0x06, 0x33, 0xD7, 0xDF, 0x9D, 0xFD, 0xE4, 0x8F, 0x5D,
+ 0xF8, 0xE8, 0xFB, 0xF1, 0xF2, 0x9F, 0xEF, 0xA3, 0xBD, 0xBC, 0x4C, 0xF2, 0xE1, 0x88, 0xB9, 0x13, 0x24, 0x8C, 0x99, 0xD6,
+ 0xBA, 0x4B, 0xBE, 0x62, 0x31, 0x9C, 0xE3, 0xD0, 0xE7, 0x04, 0x7B, 0xF7, 0xE8, 0x73, 0xD7, 0x20, 0xEF, 0xDF, 0x83, 0xE3,
+ 0xF7, 0xF7, 0xFE, 0x74, 0x6A, 0x2F, 0xBA, 0x68, 0x4C, 0x55, 0x9A, 0x71, 0x89, 0x4C, 0x21, 0xC4, 0x38, 0x95, 0x05, 0x05,
+ 0xA7, 0x9D, 0x2B, 0x07, 0xD7, 0x3B, 0x10, 0x7B, 0x82, 0x4A, 0x76, 0x1D, 0xF7, 0xE3, 0x9A, 0xBA, 0x0A, 0xAC, 0xCC, 0x5F,
+ 0xE5, 0x6E, 0xE4, 0xFE, 0x87, 0xE9, 0x65, 0x17, 0x6E, 0xC3, 0x16, 0xE2, 0xDF, 0xB3, 0xCF, 0xF1, 0x6D, 0x56, 0xEA, 0xC6,
+ 0x86, 0x5A, 0xB2, 0xDE, 0x53, 0xE8, 0xA6, 0xA2, 0x3B, 0xE1, 0x7C, 0xED, 0xBF, 0x0C, 0xAE, 0x2B, 0xCD, 0x38, 0x14, 0x56,
+ 0x97, 0x10, 0xE4, 0x75, 0x36, 0xA4, 0x29, 0x2A, 0xDD, 0x25, 0x04, 0x28, 0x28, 0x05, 0x27, 0x97, 0x23, 0x8C, 0x5D, 0x90,
+ 0xB8, 0xA1, 0x30, 0x33, 0x51, 0x38, 0xC4, 0x7A, 0xC3, 0x11, 0xAC, 0xDD, 0x9D, 0xB5, 0x98, 0x86, 0x66, 0x45, 0xA5, 0x3D,
+ 0x3A, 0x50, 0xF8, 0xC6, 0xA5, 0xAB, 0x7A, 0xE2, 0xD6, 0xCA, 0x15, 0x32, 0x2D, 0xB6, 0x35, 0x5E, 0xE5, 0xAD, 0xDB, 0x94,
+ 0xF5, 0x05, 0x51, 0xE0, 0x5E, 0x70, 0xED, 0xFB, 0xEA, 0x5D, 0xB4, 0xB0, 0x92, 0x84, 0xBD, 0x68, 0xD7, 0x2E, 0xFA, 0x3D,
+ 0x62, 0xB9, 0x6B, 0x48, 0x65, 0x27, 0xFC, 0xDD, 0xEA, 0x3D, 0x46, 0x39, 0x8A, 0xAC, 0x3B, 0x18, 0x36, 0xF2, 0x10, 0xB4,
+ 0x69, 0x4D, 0x5F, 0x88, 0x0E, 0x93, 0x75, 0x48, 0x7A, 0x7A, 0x82, 0xB6, 0x99, 0xCA, 0x35, 0x8B, 0x4B, 0xD3, 0x37, 0x09,
+ 0x18, 0x88, 0x74, 0x8D, 0xA8, 0x7D, 0xFA, 0x92, 0xD2, 0x39, 0x81, 0x90, 0xEA, 0x89, 0x42, 0xF6, 0x55, 0xC5, 0xC9, 0x9D,
+ 0x4A, 0x5A, 0x43, 0xAB, 0x96, 0xA6, 0x8C, 0xEA, 0x4D, 0x97, 0x71, 0x5E, 0xEE, 0xD1, 0x69, 0xF4, 0x8A, 0x1D, 0x42, 0xDD,
+ 0xA9, 0x50, 0xEE, 0x2B, 0xC6, 0xC5, 0x63, 0x54, 0xB4, 0xFE, 0x8D, 0x71, 0xDB, 0xD5, 0x96, 0x2A, 0x11, 0xE0, 0xEA, 0x7D,
+ 0x81, 0x29, 0xC4, 0xAE, 0xE3, 0xD3, 0xFB, 0xA6, 0x3A, 0x3E, 0xAA, 0xB8, 0x1C, 0x8E, 0x5E, 0x97, 0x01, 0xC8, 0xF0, 0xDD,
+ 0x7D, 0xA9, 0x10, 0x25, 0xCF, 0x4F, 0x15, 0x46, 0xE5, 0x14, 0x55, 0xD1, 0xBA, 0xBD, 0x3D, 0x34, 0xD3, 0x4D, 0x64, 0xAD,
+ 0x0C, 0x16, 0xA8, 0x9E, 0x46, 0xED, 0x30, 0x96, 0x8C, 0x43, 0xA3, 0x5F, 0x42, 0x2C, 0x94, 0x23, 0x42, 0xD3, 0x53, 0x4A,
+ 0x75, 0x5A, 0x7A, 0x8F, 0x76, 0x33, 0x4A, 0x8D, 0x22, 0x7B, 0x50, 0x5F, 0x5E, 0xD8, 0xF4, 0x4B, 0xE9, 0xC0, 0xAA, 0x58,
+ 0xBA, 0x71, 0x42, 0xB9, 0x6E, 0x4F, 0x07, 0x7A, 0x1F, 0x5F, 0xA6, 0xCD, 0xA6, 0x34, 0x9B, 0x73, 0x55, 0xBC, 0x2F, 0x56,
+ 0x20, 0x43, 0xB0, 0x6B, 0x88, 0x0C, 0x24, 0x32, 0x63, 0xD0, 0xFE, 0xA4, 0x95, 0x55, 0xA2, 0x3A, 0xE6, 0x42, 0x97, 0x4A,
+ 0x15, 0x65, 0xAA, 0x38, 0x0E, 0xB4, 0x82, 0x92, 0xD7, 0x28, 0xD6, 0xAF, 0xC0, 0x55, 0x53, 0xD4, 0x6E, 0x55, 0x5D, 0x15,
+ 0x5F, 0xAE, 0x97, 0xAF, 0xA8, 0x57, 0x17, 0x2A, 0xF0, 0xD9, 0x73, 0x3D, 0xB5, 0xC8, 0xED, 0x51, 0x5D, 0x65, 0x3F, 0x9B,
+ 0x50, 0xC0, 0xF4, 0xEE, 0xD3, 0xED, 0x5E, 0xA4, 0xF6, 0x6A, 0x16, 0x8A, 0x80, 0x0A, 0xBA, 0x84, 0xB5, 0xE2, 0xDA, 0xF3,
+ 0xC1, 0xF4, 0x97, 0xF8, 0xC4, 0xB8, 0xBC, 0x6D, 0xEA, 0xD4, 0xAD, 0x40, 0xAF, 0xD0, 0xE8, 0xB6, 0xDB, 0x92, 0xD9, 0x11,
+ 0xE2, 0x00, 0xEB, 0x71, 0xE3, 0xC1, 0xA5, 0x42, 0x80, 0xB9, 0x8D, 0x31, 0xED, 0xBE, 0x6C, 0xB7, 0xA6, 0xAD, 0x84, 0x43,
+ 0x44, 0x46, 0x8B, 0x31, 0xD3, 0x29, 0x15, 0x36, 0xD0, 0xD3, 0x92, 0x62, 0x95, 0xB9, 0xC6, 0xCE, 0xD9, 0xB7, 0xB4, 0x6D,
+ 0xFB, 0xA6, 0x3D, 0xB6, 0x2A, 0x60, 0x2A, 0x55, 0x26, 0xD2, 0x42, 0x40, 0xF3, 0x33, 0x63, 0xB6, 0x9A, 0x69, 0xD8, 0xD9,
+ 0xAB, 0x6F, 0xA8, 0xA9, 0xAA, 0xA2, 0x52, 0x18, 0x7A, 0xA2, 0xAB, 0x62, 0xC1, 0x24, 0x4F, 0xA5, 0xB5, 0x41, 0x2D, 0x99,
+ 0xD1, 0x60, 0x4D, 0xF3, 0x11, 0x48, 0xA1, 0xCA, 0x2C, 0x4D, 0x75, 0x31, 0x90, 0xB9, 0x33, 0x1D, 0x5C, 0x1E, 0x68, 0x8D,
+ 0x35, 0x4F, 0x6D, 0x97, 0x91, 0xC9, 0x22, 0x50, 0x8E, 0xA6, 0x19, 0x71, 0xDF, 0x22, 0x62, 0x10, 0xD4, 0xC1, 0x24, 0x3C,
+ 0xE2, 0xE2, 0x48, 0xF2, 0xA3, 0x56, 0xDD, 0x6D, 0x0C, 0xD2, 0x02, 0x3E, 0xC8, 0xAB, 0xD3, 0x68, 0x29, 0xF3, 0x9F, 0x68,
+ 0x6D, 0x39, 0x52, 0x23, 0x9D, 0x9E, 0xE8, 0xF7, 0x2C, 0xF9, 0xC5, 0xA1, 0x72, 0x44, 0x63, 0xB6, 0xAC, 0x7D, 0x17, 0x59,
+ 0xE7, 0x44, 0xA9, 0xBD, 0x52, 0xF6, 0x18, 0x08, 0x54, 0xE7, 0x45, 0x51, 0xC6, 0x98, 0xA6, 0xAD, 0xA6, 0xD8, 0x2E, 0xB0,
+ 0x85, 0x30, 0x11, 0x04, 0xCF, 0x4B, 0x6D, 0x24, 0xCD, 0x68, 0xB8, 0xDC, 0x38, 0x73, 0xD9, 0x8E, 0xB8, 0x88, 0x6D, 0x4D,
+ 0x17, 0x9F, 0x0E, 0x46, 0x4F, 0x61, 0xBB, 0xB7, 0x5D, 0xAB, 0x2F, 0x79, 0x62, 0xD6, 0xF1, 0x2B, 0x93, 0xCF, 0x1F, 0x17,
+ 0x4F, 0xBB, 0xCD, 0x29, 0x00, 0x88, 0xCD, 0x23, 0xDA, 0xD7, 0x66, 0xF3, 0x29, 0x6E, 0x03, 0x56, 0xD6, 0xCF, 0xF1, 0x65,
+ 0x77, 0x5B, 0xCD, 0xC6, 0x9B, 0x4D, 0xB8, 0xDB, 0x8A, 0x3F, 0x62, 0x96, 0xE8, 0xD1, 0x59, 0x7A, 0x4C, 0xA5, 0x21, 0x2D,
+ 0x72, 0x00, 0x56, 0xF3, 0x4B, 0x72, 0x3B, 0x65, 0x2D, 0x97, 0xA4, 0x3A, 0xA4, 0x2D, 0x98, 0xE8, 0x52, 0x98, 0x8A, 0x66,
+ 0x48, 0x41, 0x68, 0x27, 0x67, 0x6E, 0xA2, 0x69, 0x88, 0x58, 0x22, 0x09, 0xF8, 0xF1, 0xCF, 0x07, 0xD3, 0x47, 0xB2, 0xC5,
+ 0x35, 0x27, 0x2C, 0xD5, 0x57, 0x4E, 0x5B, 0x3C, 0x7A, 0x44, 0xF1, 0x7E, 0xFA, 0x95, 0xE9, 0x9F, 0x48, 0x25, 0xF5, 0x44,
+ 0x4C, 0x89, 0x0F, 0x5D, 0x72, 0x21, 0xBC, 0xA9, 0x30, 0x54, 0x61, 0x42, 0x6D, 0x49, 0x90, 0xF3, 0x12, 0x1B, 0x68, 0x29,
+ 0xB5, 0xAB, 0x91, 0xA0, 0x95, 0x43, 0xA8, 0x05, 0x07, 0x63, 0x29, 0x4C, 0x14, 0xAE, 0x62, 0x1F, 0x93, 0x26, 0x34, 0x7F,
+ 0xD8, 0x89, 0x7F, 0x0F, 0x4C, 0x20, 0x8C, 0xAB, 0x12, 0x45, 0xC4, 0x0B, 0x5C, 0x06, 0xD7, 0xCC, 0x98, 0x9D, 0x1F, 0x97,
+ 0x4B, 0x1E, 0xCC, 0xA0, 0x84, 0xD4, 0x40, 0x4C, 0x73, 0xD5, 0xD4, 0x66, 0x1B, 0xB6, 0x8E, 0x63, 0x51, 0xF6, 0xBE, 0x7D,
+ 0x23, 0x7A, 0xB3, 0xA9, 0xBA, 0x57, 0x50, 0xB3, 0x59, 0xBE, 0xAB, 0xB2, 0xA2, 0xCE, 0xA6, 0xBE, 0xFC, 0x9A, 0x7B, 0x95,
+ 0x49, 0xD0, 0x59, 0xA9, 0xD3, 0x5B, 0x4B, 0x70, 0x90, 0x11, 0x02, 0x43, 0xC8, 0x21, 0x6F, 0x3A, 0xDC, 0x94, 0x08, 0x01,
+ 0xB4, 0x97, 0x52, 0x97, 0x24, 0xA1, 0x6F, 0x64, 0x3B, 0xC6, 0x3B, 0x9B, 0x25, 0x27, 0xFA, 0x4C, 0xCB, 0x27, 0xB3, 0x6A,
+ 0x6E, 0x30, 0x82, 0xAC, 0x0F, 0xD1, 0x75, 0xD1, 0xB1, 0xF8, 0x7A, 0x28, 0xAC, 0xAE, 0xAA, 0x69, 0xA6, 0xFE, 0x10, 0x59,
+ 0x44, 0x0F, 0x0A, 0xDF, 0x07, 0x9D, 0x71, 0x9B, 0x5A, 0xAE, 0xA5, 0xEA, 0x16, 0xA5, 0xD1, 0xEF, 0xC5, 0xB5, 0x22, 0x22,
+ 0x6A, 0x1A, 0x6B, 0x63, 0xD9, 0x52, 0x29, 0x32, 0xD1, 0xE5, 0x39, 0x6D, 0x57, 0x34, 0xF6, 0x1C, 0xCA, 0x45, 0x52, 0x88,
+ 0x59, 0xC0, 0x0C, 0x47, 0xA9, 0xC6, 0x91, 0x0A, 0xEC, 0xA5, 0xB8, 0x91, 0xE5, 0x54, 0x18, 0xAC, 0x4F, 0x71, 0x87, 0x1C,
+ 0x72, 0x14, 0xE0, 0xC7, 0x0E, 0xF5, 0x5D, 0x5B, 0xD4, 0xB4, 0x10, 0x74, 0x53, 0x49, 0x4B, 0x72, 0x8A, 0xE8, 0x1E, 0xA2,
+ 0x26, 0xE3, 0x34, 0xD6, 0x46, 0x44, 0xBF, 0x69, 0x24, 0x6A, 0xA7, 0xA9, 0xAA, 0x92, 0xBA, 0xEA, 0xA6, 0x0F, 0x69, 0x2A,
+ 0x56, 0x62, 0x4E, 0xAE, 0xD3, 0x78, 0xC7, 0x33, 0xA6, 0xEC, 0x71, 0xE5, 0xA4, 0x6E, 0x79, 0x48, 0xC8, 0x38, 0x07, 0x1B,
+ 0x6C, 0x37, 0x20, 0x63, 0xAE, 0xFD, 0x32, 0x47, 0x7C, 0xF0, 0x1E, 0xD6, 0x52, 0x40, 0x59, 0xCC, 0xCC, 0x32, 0x13, 0x10,
+ 0xDA, 0x3D, 0x2D, 0xA6, 0xFD, 0x39, 0xCF, 0xC3, 0xD3, 0xC1, 0xFC, 0x69, 0x75, 0x3E, 0x91, 0xDC, 0x10, 0x73, 0xD4, 0x63,
+ 0xE4, 0x72, 0x47, 0x4E, 0x9B, 0x67, 0x86, 0x53, 0x31, 0x09, 0x7E, 0x16, 0xFF, 0x00, 0x4F, 0x13, 0xE9, 0xA0, 0xBF, 0x11,
+ 0xE1, 0xCF, 0x89, 0xD7, 0xCF, 0x38, 0x7A, 0x1F, 0xC4, 0xFF, 0x00, 0xCD, 0xC1, 0xD3, 0xFF, 0x00, 0x55, 0x3F, 0x3D, 0x1A,
+ 0x90, 0x56, 0xF6, 0x47, 0x53, 0xD3, 0xAF, 0x41, 0x9C, 0xF7, 0xC9, 0xCE, 0x3D, 0xDE, 0xA7, 0x8D, 0xB4, 0x68, 0x65, 0xAF,
+ 0x98, 0x11, 0xBE, 0x37, 0xC6, 0xDD, 0x4E, 0xFB, 0xA7, 0x6E, 0x80, 0x75, 0xCF, 0x4F, 0x9F, 0x07, 0xD9, 0xFD, 0xFE, 0xFE,
+ 0x16, 0xBB, 0x62, 0x6D, 0x86, 0xE6, 0x64, 0xF0, 0xCF, 0x3F, 0x70, 0x6B, 0x5A, 0xF2, 0x12, 0xE7, 0x30, 0x50, 0x0A, 0xC6,
+ 0x70, 0x48, 0x19, 0x03, 0xD0, 0x75, 0xC7, 0xC8, 0xF5, 0xC7, 0x13, 0x50, 0x22, 0xF2, 0x1F, 0x4B, 0xE9, 0x6B, 0x52, 0xE4,
+ 0x06, 0x54, 0x4F, 0xD9, 0xEF, 0x9C, 0x8C, 0x1C, 0xF4, 0x20, 0x12, 0x06, 0xDD, 0xB2, 0x3F, 0x80, 0xE3, 0x26, 0x4B, 0x3A,
+ 0x1F, 0xBF, 0xBB, 0x68, 0x45, 0xD3, 0xD0, 0x91, 0xB2, 0x53, 0x8C, 0x75, 0x03, 0x18, 0x07, 0x39, 0xDC, 0x63, 0xAF, 0xAF,
+ 0x63, 0xD7, 0x7E, 0x83, 0x3C, 0xCB, 0x30, 0xE6, 0x73, 0x8F, 0x8F, 0xEB, 0xA5, 0x04, 0xCC, 0x5F, 0xBF, 0xDF, 0xDF, 0x18,
+ 0xD3, 0x02, 0xEA, 0xA2, 0xB1, 0x50, 0x88, 0xFC, 0x69, 0x2D, 0x25, 0xE6, 0x5D, 0x42, 0x90, 0xA4, 0x29, 0x21, 0x69, 0x29,
+ 0x5A, 0x79, 0x54, 0x0A, 0x54, 0x30, 0x46, 0x0E, 0x15, 0x9C, 0x82, 0x3F, 0x01, 0x15, 0xD1, 0xD6, 0xE2, 0x9B, 0x99, 0x6D,
+ 0x8C, 0x62, 0x03, 0x11, 0x7E, 0xFA, 0x12, 0x44, 0x4C, 0xF7, 0x24, 0x49, 0xB5, 0xAC, 0x27, 0xDB, 0x3A, 0xB4, 0x9F, 0x45,
+ 0xDD, 0xD9, 0x77, 0xE9, 0xE5, 0x77, 0xC4, 0x6E, 0x93, 0xBF, 0x50, 0x7E, 0x56, 0x8F, 0x9B, 0x0E, 0x15, 0xEC, 0xCD, 0x26,
+ 0xA6, 0xF4, 0x87, 0xE8, 0x54, 0x2B, 0x9E, 0x6D, 0x52, 0x45, 0x2D, 0xB6, 0x22, 0xB6, 0xEB, 0x8B, 0x87, 0x0D, 0x55, 0xA8,
+ 0xCD, 0xCA, 0x71, 0xC5, 0x29, 0x97, 0x0A, 0x5B, 0x84, 0xB9, 0x2D, 0xA3, 0xCF, 0x6C, 0xC8, 0x1D, 0x7F, 0xF0, 0xBA, 0xEB,
+ 0x2A, 0xDE, 0xDB, 0x56, 0xAD, 0xBA, 0x28, 0x2B, 0xCB, 0x14, 0xD4, 0xB0, 0x07, 0x07, 0x58, 0xBD, 0x46, 0x2D, 0x39, 0xBB,
+ 0xC5, 0xBB, 0x41, 0x4B, 0x07, 0x15, 0xD2, 0xD0, 0x02, 0xB4, 0x95, 0x75, 0x75, 0x53, 0x6B, 0x85, 0xA6, 0x0B, 0x3E, 0xA9,
+ 0xA6, 0xBE, 0xA8, 0xCA, 0x8B, 0x22, 0x7D, 0x56, 0xA3, 0x02, 0x36, 0x61, 0xB9, 0x35, 0xF4, 0x37, 0x30, 0x84, 0xC5, 0x9C,
+ 0x8A, 0x7C, 0x5F, 0xDA, 0xA2, 0x23, 0xED, 0x47, 0x8C, 0xA6, 0xFF, 0x00, 0xCE, 0xA4, 0xA5, 0x3E, 0xC8, 0xC8, 0x9E, 0xE7,
+ 0x90, 0xDA, 0x99, 0x75, 0xD6, 0x9A, 0x4C, 0x45, 0x29, 0x55, 0xBF, 0x57, 0x53, 0x30, 0x14, 0x1E, 0xCD, 0x30, 0x44, 0x52,
+ 0x37, 0x1E, 0x46, 0xAF, 0xD7, 0x9E, 0xC6, 0xFD, 0x55, 0x29, 0x2D, 0xC3, 0xB5, 0xBE, 0x91, 0x9B, 0xF7, 0xE7, 0x50, 0x83,
+ 0xD5, 0xB4, 0xC1, 0x92, 0xEB, 0xCD, 0xA9, 0xD4, 0xB6, 0x84, 0xF3, 0x36, 0xA5, 0x48, 0x4B, 0xCF, 0x3C, 0xDA, 0x96, 0xD2,
+ 0xCA, 0x14, 0xBF, 0x67, 0x05, 0x41, 0x2B, 0x4A, 0xDB, 0xF3, 0x0B, 0xAB, 0x05, 0x21, 0x7C, 0xD2, 0x9C, 0x58, 0x00, 0xE0,
+ 0x39, 0x8C, 0xCD, 0xB9, 0x83, 0x95, 0x56, 0x3E, 0x2F, 0x78, 0x94, 0xC0, 0x4A, 0xDB, 0x3F, 0x2F, 0xA6, 0x34, 0x92, 0x75,
+ 0x19, 0xF6, 0x5E, 0x4B, 0xA9, 0x7C, 0x73, 0x12, 0x14, 0xA3, 0xCD, 0xCD, 0xCA, 0x12, 0xA0, 0xB2, 0x81, 0xCC, 0x79, 0x0A,
+ 0x79, 0xB0, 0xE2, 0x10, 0x11, 0x90, 0x41, 0x2D, 0xE3, 0x9D, 0x45, 0x47, 0x5F, 0x32, 0x59, 0x52, 0x4B, 0xF3, 0x75, 0x9B,
+ 0x37, 0xBD, 0x89, 0x79, 0x89, 0x8A, 0xE9, 0x79, 0x40, 0x3B, 0xF6, 0xEF, 0x04, 0xE7, 0xD7, 0x8D, 0x6E, 0xE1, 0xEA, 0x9C,
+ 0xD5, 0xBA, 0xC9, 0x4D, 0x49, 0xE6, 0x14, 0x89, 0x0B, 0x79, 0x2F, 0xA9, 0xD7, 0x14, 0x86, 0x9F, 0x5E, 0x12, 0x99, 0x09,
+ 0x68, 0x2C, 0x25, 0x2E, 0xE0, 0x12, 0x1C, 0x29, 0x05, 0xA5, 0x80, 0xB0, 0x97, 0x1C, 0x52, 0x8A, 0x99, 0xB8, 0xA5, 0x37,
+ 0x83, 0x33, 0x2A, 0xB5, 0x70, 0xB7, 0x2A, 0x20, 0x20, 0xED, 0x7B, 0xDE, 0x74, 0x91, 0x99, 0xB2, 0xC0, 0x71, 0x31, 0x03,
+ 0x6F, 0x4E, 0xE6, 0xA4, 0x6A, 0x5D, 0xD0, 0xCC, 0xD7, 0xA2, 0x39, 0x1B, 0xDA, 0x23, 0xBC, 0xA7, 0x5B, 0x99, 0xE7, 0x41,
+ 0x88, 0x99, 0x6F, 0x48, 0x5A, 0x33, 0x09, 0xA6, 0xC3, 0xCB, 0x42, 0x9C, 0x85, 0x1B, 0xCD, 0x71, 0x2E, 0xC2, 0x8E, 0xD0,
+ 0x2B, 0x4C, 0xA5, 0x21, 0x28, 0xE5, 0x74, 0xA9, 0xA5, 0xE8, 0x6E, 0x32, 0x02, 0x9F, 0xD4, 0xC1, 0x75, 0x79, 0x3C, 0x36,
+ 0xE9, 0x0B, 0x88, 0xCC, 0xBA, 0x47, 0xD2, 0x39, 0x08, 0xF9, 0xF1, 0xDB, 0x00, 0xF1, 0x2D, 0xEC, 0x6E, 0x9C, 0xD9, 0xB5,
+ 0x6B, 0xD5, 0xEF, 0x66, 0xA4, 0x42, 0x95, 0x0A, 0xAC, 0xDC, 0x46, 0xD3, 0x1E, 0x1D, 0x4E, 0x96, 0x97, 0xCC, 0x38, 0xF1,
+ 0x60, 0x37, 0x11, 0x09, 0x94, 0xCA, 0xE4, 0x5B, 0xEF, 0xD3, 0x17, 0x10, 0xC9, 0x75, 0xE8, 0xCE, 0xCA, 0x6D, 0x71, 0xB9,
+ 0x17, 0xED, 0xB1, 0x63, 0x25, 0x0A, 0x4F, 0xB5, 0xF7, 0xED, 0x6D, 0x75, 0xD2, 0x54, 0xF5, 0x75, 0x24, 0x85, 0x44, 0xC0,
+ 0x90, 0x64, 0x1B, 0x8D, 0xEE, 0x5D, 0xEF, 0xAA, 0xA7, 0x77, 0xF2, 0xE6, 0xA5, 0x51, 0x6E, 0x75, 0x45, 0x52, 0x72, 0x37,
+ 0x82, 0x2C, 0xBF, 0xA9, 0x3A, 0xB7, 0x55, 0xB8, 0x36, 0x4D, 0x9B, 0xA3, 0xCF, 0x5B, 0xDE, 0x32, 0xBC, 0x24, 0xD9, 0xD5,
+ 0xFD, 0x3F, 0x4B, 0xCF, 0xC7, 0xB6, 0x35, 0xCE, 0x89, 0xAF, 0xB6, 0xB7, 0x87, 0x5D, 0x65, 0xB3, 0x66, 0x33, 0x22, 0x42,
+ 0x23, 0x2E, 0xDA, 0xB8, 0x6E, 0xE8, 0x95, 0x6B, 0x76, 0xEB, 0x8A, 0x95, 0x34, 0xB7, 0x93, 0x68, 0xDE, 0x34, 0x3A, 0x84,
+ 0x07, 0x88, 0x77, 0x91, 0x34, 0xD7, 0x94, 0xE3, 0xE9, 0xC3, 0xF1, 0x1B, 0x29, 0x4B, 0xD6, 0xED, 0x81, 0x01, 0x53, 0x5D,
+ 0x1B, 0x6E, 0x64, 0x26, 0xB8, 0xB8, 0x0D, 0xC5, 0xB3, 0x63, 0x53, 0x56, 0xFE, 0xD6, 0xE5, 0x4D, 0x74, 0x6E, 0x55, 0x4C,
+ 0x3E, 0xD6, 0xDF, 0x41, 0x5D, 0x19, 0xCF, 0x54, 0x9D, 0x29, 0x17, 0x4C, 0xA6, 0x1B, 0xEB, 0x9A, 0x4D, 0xDA, 0xFA, 0x15,
+ 0x73, 0x5C, 0xEE, 0xD3, 0xF4, 0xDB, 0x5F, 0xAB, 0xB3, 0xAD, 0xA5, 0xBC, 0xAF, 0x65, 0x6E, 0xAB, 0x6B, 0x69, 0x7E, 0xA0,
+ 0xDE, 0x10, 0x99, 0x27, 0x29, 0x66, 0x4C, 0x4D, 0x2A, 0xD6, 0x77, 0xD8, 0xAE, 0x3E, 0xD2, 0x70, 0x85, 0x4B, 0xA5, 0xD2,
+ 0xA1, 0x22, 0x41, 0x01, 0x69, 0x81, 0x1F, 0x98, 0xB6, 0x9E, 0x12, 0x9A, 0x15, 0xFC, 0xBD, 0xC2, 0xFD, 0xCD, 0xAA, 0xEA,
+ 0x96, 0xD1, 0xEC, 0x56, 0x4D, 0xF0, 0xF4, 0xDF, 0x96, 0x57, 0x54, 0x6E, 0xD3, 0x1E, 0xF5, 0x35, 0x36, 0x94, 0x58, 0xE3,
+ 0xC5, 0x97, 0x8E, 0x32, 0xE9, 0x83, 0xA8, 0x56, 0xDC, 0x9B, 0x0A, 0xA1, 0x23, 0xFF, 0x00, 0x10, 0xAA, 0x54, 0x2D, 0xF5,
+ 0x54, 0x69, 0xF4, 0xFA, 0x1D, 0x66, 0xE4, 0xB4, 0x65, 0x69, 0xE5, 0x4E, 0xE5, 0x72, 0x6B, 0x32, 0x9D, 0x90, 0xBA, 0x5D,
+ 0xAB, 0x55, 0xAA, 0x54, 0xEA, 0xDC, 0xB4, 0x8F, 0x65, 0x0B, 0xAA, 0xAD, 0xCF, 0x32, 0x2B, 0x51, 0xA4, 0x47, 0x90, 0x89,
+ 0x81, 0x4A, 0x11, 0x95, 0x9D, 0x65, 0x5B, 0x77, 0x57, 0xA7, 0xA8, 0x29, 0xEA, 0xA4, 0xA5, 0xA9, 0xCA, 0x53, 0x4C, 0xAC,
+ 0x05, 0xEA, 0x64, 0x19, 0x2E, 0x34, 0xB3, 0x65, 0x45, 0x8E, 0xFD, 0x99, 0xEF, 0xDE, 0x1C, 0x17, 0xB4, 0x4D, 0xA6, 0x67,
+ 0x4C, 0x0F, 0xF1, 0x96, 0x3F, 0xAB, 0x5F, 0x87, 0x07, 0xE6, 0x9F, 0xF5, 0xFF, 0x00, 0xDC, 0x7F, 0x1A, 0xAD, 0x4B, 0xA6,
+ 0x46, 0x08, 0xDF, 0xA7, 0x4F, 0x80, 0xDF, 0xB9, 0xE9, 0xF2, 0xDB, 0x8D, 0x9A, 0xC8, 0xB4, 0xDF, 0xE1, 0x1F, 0x5B, 0xE8,
+ 0x49, 0x13, 0xB9, 0x1A, 0x4C, 0xC8, 0xC6, 0x77, 0xF8, 0x9C, 0xF6, 0xF9, 0x03, 0x81, 0xBF, 0xAF, 0x07, 0x5D, 0xAC, 0x7C,
+ 0xD3, 0xFC, 0xBF, 0xBD, 0xF1, 0xA6, 0xB3, 0xD8, 0xF4, 0xF5, 0xD2, 0x66, 0x40, 0xDF, 0x71, 0xFC, 0x7E, 0x3B, 0x9F, 0x5E,
+ 0xBE, 0xFE, 0xDC, 0x4B, 0x5B, 0xDA, 0x0F, 0x9F, 0xD6, 0xDC, 0xF6, 0xD2, 0xD2, 0x45, 0xD4, 0xFC, 0x7E, 0x27, 0xBF, 0xC0,
+ 0x67, 0x3C, 0x4A, 0xAE, 0x63, 0xD7, 0x97, 0xD7, 0x4D, 0x9E, 0x67, 0xC4, 0xE8, 0x47, 0x5E, 0x4A, 0x41, 0xEF, 0x8E, 0xBB,
+ 0xE3, 0x1F, 0xAE, 0x3B, 0x75, 0xE8, 0x37, 0x38, 0x1C, 0x2B, 0xDB, 0x8E, 0xD6, 0xFF, 0x00, 0x1C, 0xFF, 0x00, 0x1A, 0x20,
+ 0x89, 0x50, 0x78, 0x32, 0xBD, 0xFD, 0x22, 0xF6, 0x72, 0x5F, 0x4C, 0x9A, 0xC4, 0xDC, 0xB7, 0x28, 0xA3, 0xCB, 0xC4, 0x76,
+ 0x83, 0xF2, 0xA4, 0x3A, 0xB2, 0xD4, 0x48, 0x2C, 0x2D, 0x61, 0xA4, 0x3D, 0x35, 0xFE, 0x47, 0x4B, 0x49, 0x75, 0xD3, 0xE4,
+ 0xC7, 0x69, 0xB6, 0xDE, 0x99, 0x31, 0xEF, 0xD8, 0x41, 0x8B, 0x25, 0xF3, 0xE5, 0x85, 0x51, 0x4C, 0x22, 0x2B, 0x66, 0xA1,
+ 0xB5, 0x24, 0x36, 0x5E, 0x7D, 0x69, 0x87, 0xA9, 0xE2, 0x72, 0x94, 0x0F, 0x3C, 0x1F, 0xF4, 0x83, 0x85, 0x82, 0xD6, 0x93,
+ 0x83, 0x1A, 0x94, 0x34, 0x62, 0xCB, 0xD6, 0x5B, 0xBE, 0x2B, 0xF6, 0xC6, 0x9A, 0xDA, 0x57, 0x33, 0x56, 0xC5, 0x66, 0xA3,
+ 0x1E, 0xB3, 0x74, 0x56, 0xD3, 0x45, 0xA8, 0xC5, 0x99, 0x76, 0x4B, 0x8C, 0x81, 0x1D, 0x89, 0x32, 0xC2, 0x19, 0x5B, 0x8C,
+ 0xD0, 0x68, 0x74, 0xFE, 0x78, 0x94, 0x6A, 0x2B, 0x6A, 0x7D, 0x31, 0x98, 0x91, 0x52, 0xA8, 0xCA, 0x7A, 0x4D, 0x56, 0xA3,
+ 0x2D, 0x51, 0xFA, 0x7F, 0x0B, 0xB5, 0xB9, 0xB9, 0xEC, 0x53, 0x4D, 0x54, 0x6D, 0xD7, 0x57, 0xE6, 0x6E, 0x56, 0x8D, 0x2D,
+ 0x49, 0x6B, 0x5F, 0xDD, 0x86, 0x29, 0xA6, 0x67, 0xA9, 0x6A, 0x4B, 0xDB, 0x0A, 0xEB, 0xA0, 0x46, 0xAA, 0xCA, 0x52, 0x49,
+ 0x88, 0xE9, 0xB7, 0x03, 0x79, 0x98, 0xF1, 0xDF, 0xCD, 0x88, 0xD5, 0x5D, 0x1A, 0xAD, 0x59, 0x74, 0x3A, 0x0D, 0x26, 0x7B,
+ 0x14, 0xF8, 0xD3, 0xA3, 0x53, 0x1B, 0xA9, 0x55, 0x63, 0xD3, 0x8C, 0xA9, 0x2E, 0xC6, 0x9B, 0x52, 0x3F, 0x5C, 0x3C, 0xF3,
+ 0xAF, 0x21, 0x58, 0x6E, 0x7C, 0xF8, 0x4F, 0xC4, 0x69, 0xF3, 0x36, 0x71, 0x7E, 0x98, 0x96, 0x55, 0x89, 0x2E, 0x38, 0xA0,
+ 0xE3, 0x9D, 0xDB, 0xBF, 0x86, 0x4A, 0x4E, 0x89, 0x20, 0xAA, 0xA6, 0x97, 0x96, 0x45, 0x66, 0xED, 0x55, 0x46, 0x2F, 0x07,
+ 0x90, 0xD4, 0xD0, 0x9B, 0x9D, 0x4D, 0x2D, 0x49, 0x31, 0x4F, 0x50, 0x52, 0xA1, 0x97, 0xB4, 0xE7, 0xBC, 0x97, 0x89, 0xD7,
+ 0x3D, 0x6F, 0x6A, 0x5C, 0x98, 0x52, 0x5D, 0x61, 0xB5, 0x2F, 0x08, 0x49, 0x0A, 0x09, 0x53, 0x89, 0x0B, 0x64, 0x82, 0xEB,
+ 0x0E, 0x29, 0x6F, 0xA1, 0x05, 0x28, 0x0D, 0xA8, 0x15, 0x25, 0x08, 0x08, 0x0A, 0x50, 0x08, 0x2E, 0x36, 0x09, 0x47, 0x8F,
+ 0xB9, 0x25, 0xAF, 0xE6, 0x0E, 0x12, 0xC5, 0xAD, 0x7B, 0x0D, 0xFE, 0x7A, 0xDA, 0x99, 0xBA, 0x04, 0x67, 0x30, 0x09, 0x98,
+ 0x61, 0xE2, 0x3C, 0x1D, 0xF5, 0x0D, 0x4A, 0xF6, 0xE2, 0xE1, 0x09, 0xF3, 0x76, 0xC9, 0xC6, 0xF8, 0x18, 0x1F, 0xBA, 0xA4,
+ 0xFA, 0x80, 0x01, 0x3B, 0x90, 0x36, 0x1C, 0xA5, 0x3C, 0x61, 0x52, 0xF9, 0x56, 0xC7, 0xF3, 0x7B, 0x58, 0xBF, 0x9D, 0x32,
+ 0x92, 0xCD, 0xB1, 0xC1, 0x9F, 0x87, 0x13, 0xCD, 0xA7, 0x89, 0xEE, 0xB4, 0x17, 0x26, 0xF9, 0x99, 0xFD, 0xA1, 0x00, 0x8C,
+ 0x9C, 0x64, 0x0F, 0xB6, 0x08, 0x04, 0x02, 0x3A, 0xA8, 0xA4, 0x00, 0x33, 0xCE, 0xA5, 0x04, 0x60, 0x1C, 0x80, 0xE9, 0x52,
+ 0x1E, 0x70, 0xFD, 0xC7, 0xED, 0xA2, 0x01, 0x18, 0x0B, 0xBC, 0xDB, 0x1C, 0xDA, 0xDF, 0x43, 0x32, 0xEA, 0xD1, 0x69, 0x64,
+ 0x07, 0xAA, 0x73, 0x19, 0x8A, 0xDB, 0xCC, 0x22, 0x51, 0x54, 0x59, 0x02, 0xA6, 0xF2, 0xA4, 0xE2, 0x0A, 0x0A, 0x10, 0x5D,
+ 0x92, 0x9E, 0x47, 0x59, 0x6A, 0x4B, 0x81, 0x28, 0xF2, 0x18, 0x8E, 0xF1, 0x41, 0x6A, 0x52, 0x82, 0x50, 0xE2, 0x12, 0x54,
+ 0xD9, 0xED, 0xD8, 0x1A, 0xEB, 0x29, 0xA6, 0xF5, 0x35, 0x28, 0xDC, 0x02, 0x61, 0x65, 0x60, 0x00, 0xB8, 0x1D, 0xA2, 0xD1,
+ 0x19, 0xA2, 0xCF, 0x48, 0xCE, 0x22, 0x03, 0xDA, 0xE0, 0x8E, 0x06, 0x18, 0x6F, 0x3D, 0xF9, 0xD7, 0x70, 0xFC, 0x2D, 0xDB,
+ 0xF4, 0xFA, 0x53, 0xB4, 0xA9, 0x93, 0xD8, 0x72, 0x44, 0x86, 0x56, 0x84, 0xCC, 0x44, 0xEA, 0x6D, 0x45, 0x97, 0x5D, 0x4A,
+ 0x14, 0xE2, 0xA5, 0xD5, 0x62, 0xB0, 0xD4, 0xF7, 0x98, 0x6D, 0x6F, 0xC2, 0x90, 0x89, 0x0F, 0x33, 0x25, 0x99, 0x08, 0x90,
+ 0xE4, 0x99, 0x0E, 0x37, 0x1F, 0xCD, 0x25, 0xF7, 0xFD, 0xFA, 0x08, 0x04, 0x9C, 0x86, 0x2A, 0x88, 0xC1, 0x67, 0x93, 0x2D,
+ 0xEC, 0xAE, 0x6D, 0x3C, 0xDB, 0xE9, 0x36, 0x98, 0xB4, 0x34, 0xB3, 0x4F, 0x22, 0x3F, 0x19, 0x33, 0x18, 0x09, 0xD7, 0x24,
+ 0x7E, 0x95, 0xEA, 0x9D, 0xDD, 0xAB, 0x5E, 0x37, 0xAE, 0x4B, 0x6E, 0xEC, 0x97, 0x21, 0xDB, 0x07, 0x4B, 0xEC, 0xDB, 0x1A,
+ 0x1E, 0x9E, 0x5B, 0xA0, 0xA4, 0x51, 0x58, 0x83, 0x70, 0xD1, 0xBE, 0xBA, 0x99, 0x55, 0x62, 0x1B, 0x63, 0xD9, 0x9E, 0x91,
+ 0x2E, 0x5B, 0xAF, 0x47, 0x71, 0xF2, 0x16, 0x53, 0xEC, 0xDE, 0xCA, 0xA2, 0x93, 0x14, 0xB6, 0x3E, 0x7F, 0xFE, 0x24, 0xD7,
+ 0x5F, 0xE2, 0x29, 0xDB, 0xBF, 0x45, 0x1B, 0x74, 0x34, 0x8E, 0x26, 0xB5, 0x54, 0x8C, 0xB6, 0x89, 0x8E, 0x23, 0xC6, 0xAB,
+ 0xF0, 0xFB, 0x54, 0xD7, 0x45, 0x2F, 0x4F, 0x13, 0x51, 0x71, 0xAB, 0x71, 0x5F, 0x69, 0xB7, 0x14, 0x94, 0xD2, 0x46, 0x21,
+ 0xB0, 0xBA, 0xA3, 0x67, 0x4F, 0xE8, 0x52, 0x59, 0x43, 0x4F, 0xD2, 0x62, 0x3C, 0xDA, 0x31, 0xC8, 0x97, 0x63, 0x32, 0xE7,
+ 0x21, 0x03, 0x00, 0xA4, 0x2D, 0xB5, 0x04, 0x9D, 0xF7, 0x23, 0x04, 0x76, 0x23, 0x1C, 0x70, 0x74, 0x01, 0x7B, 0x7D, 0x08,
+ 0xE2, 0xFC, 0x7A, 0xEB, 0xAB, 0xA0, 0x48, 0x4A, 0x78, 0x0B, 0x7D, 0x3E, 0x9F, 0x09, 0xB8, 0xC6, 0xB7, 0xD4, 0x6B, 0x3A,
+ 0x93, 0x45, 0x74, 0x48, 0x85, 0x05, 0x96, 0x9F, 0xE4, 0x0D, 0x07, 0x42, 0x79, 0x9D, 0x0D, 0x8C, 0xA8, 0x34, 0x16, 0x41,
+ 0x52, 0x5A, 0x18, 0x04, 0x36, 0x08, 0x40, 0x56, 0x0F, 0x28, 0xC6, 0x78, 0xA0, 0x2C, 0xC4, 0x29, 0x69, 0xCE, 0x03, 0x9C,
+ 0x62, 0xF1, 0xCF, 0x9D, 0x32, 0x8A, 0x69, 0x94, 0x01, 0xE5, 0xE6, 0x3F, 0x63, 0x94, 0x3E, 0x5A, 0x70, 0xFB, 0x10, 0xFD,
+ 0xD5, 0xFE, 0x23, 0xF9, 0x70, 0x41, 0xD8, 0xF9, 0x1A, 0x26, 0xAF, 0xF4, 0xFF, 0x00, 0xF2, 0x35, 0x3A, 0x2A, 0x46, 0x06,
+ 0x4F, 0xC3, 0xF8, 0x01, 0xDF, 0xE5, 0x8C, 0xF1, 0xD3, 0x9D, 0x56, 0x81, 0x91, 0x50, 0x6D, 0x94, 0xAD, 0x6E, 0x2C, 0x25,
+ 0x09, 0x49, 0x52, 0x94, 0xB5, 0x84, 0x24, 0x04, 0xEE, 0x54, 0x54, 0xAC, 0x00, 0x00, 0xDF, 0x24, 0xA4, 0x6D, 0xE8, 0x37,
+ 0x69, 0x01, 0x73, 0xBE, 0x70, 0x3D, 0xF8, 0x3F, 0xBF, 0x64, 0xD3, 0xE3, 0x82, 0x79, 0x81, 0x4F, 0xDF, 0xE1, 0x69, 0xD0,
+ 0x48, 0xAB, 0x07, 0xDD, 0x43, 0x31, 0xE3, 0xBE, 0xFB, 0x8E, 0x14, 0xA1, 0xB4, 0x36, 0xC3, 0xAB, 0x5B, 0x85, 0x5F, 0x71,
+ 0x2D, 0x24, 0xA1, 0x2A, 0x75, 0x6E, 0x67, 0x0D, 0xA1, 0xA0, 0xE2, 0xDC, 0x27, 0x0D, 0xA5, 0x44, 0xA4, 0x70, 0x0A, 0x90,
+ 0x4C, 0x66, 0x0F, 0xD3, 0xE1, 0x3F, 0xCD, 0xF4, 0x0B, 0x70, 0xAE, 0xAC, 0xF1, 0x34, 0x91, 0x30, 0x93, 0xD4, 0x90, 0xF2,
+ 0x27, 0xAF, 0x2E, 0x96, 0x66, 0x72, 0x5D, 0x4F, 0x3A, 0x56, 0x14, 0x08, 0x18, 0x20, 0x91, 0x9D, 0x89, 0xCE, 0x0E, 0xE9,
+ 0xC7, 0x70, 0x7A, 0x67, 0xA0, 0x24, 0xF0, 0x8B, 0x84, 0x4D, 0xEE, 0x59, 0x08, 0x6D, 0x2A, 0xC4, 0x71, 0xF6, 0x20, 0x9F,
+ 0x8D, 0xFB, 0xF7, 0xE7, 0xED, 0xD2, 0x72, 0x5F, 0x25, 0x0A, 0xC2, 0xBA, 0xFC, 0x77, 0xCF, 0x4F, 0x87, 0xE3, 0x9F, 0x5E,
+ 0xBC, 0x0D, 0xA6, 0x78, 0x17, 0x3E, 0x3C, 0x4F, 0xDF, 0x6D, 0x1A, 0x8B, 0x2B, 0x17, 0x9E, 0xAC, 0xD9, 0xDF, 0x5B, 0x7F,
+ 0x93, 0x6B, 0xAA, 0x25, 0x03, 0xEB, 0x77, 0x60, 0xCA, 0x94, 0x67, 0x5A, 0xF4, 0x0B, 0x85, 0xE6, 0xA6, 0xD3, 0x98, 0x91,
+ 0x1E, 0x2C, 0xEA, 0x5C, 0x8A, 0xCC, 0x39, 0x4F, 0x53, 0x24, 0x26, 0x3C, 0x97, 0x59, 0x5A, 0xE3, 0x92, 0x85, 0x21, 0x7C,
+ 0xC1, 0xB6, 0xDE, 0x2B, 0x71, 0x79, 0xF5, 0xEF, 0xED, 0x4F, 0x45, 0x41, 0xD6, 0x8D, 0x50, 0x53, 0x54, 0x21, 0x02, 0x54,
+ 0x8C, 0x59, 0x4B, 0x5E, 0xD3, 0x9D, 0x67, 0x5D, 0x35, 0x55, 0x3D, 0x28, 0x0E, 0x7A, 0x89, 0xE2, 0x2C, 0x11, 0x7B, 0xF2,
+ 0xB8, 0x3B, 0x6B, 0x7D, 0xA2, 0x5F, 0x48, 0x8F, 0x8D, 0x2F, 0x0D, 0x77, 0xD5, 0x1E, 0xED, 0xB8, 0x2F, 0x97, 0x35, 0x4F,
+ 0x4F, 0xA3, 0xCD, 0x61, 0xBB, 0xCA, 0xC9, 0xB9, 0xA9, 0x94, 0xB7, 0xE0, 0xD5, 0xED, 0x97, 0x1E, 0x6C, 0x55, 0xE1, 0xC6,
+ 0x53, 0x30, 0xA1, 0xCB, 0xA6, 0xBE, 0xEC, 0x20, 0xEA, 0x18, 0x7A, 0x24, 0xC4, 0x21, 0xB5, 0x10, 0x97, 0x1B, 0xF2, 0x56,
+ 0xE7, 0x17, 0xB1, 0xF8, 0xFD, 0xFD, 0xBD, 0xCA, 0x4A, 0xF7, 0x1A, 0xE8, 0x6A, 0x06, 0x9A, 0xA1, 0xCC, 0x13, 0x4A, 0x0A,
+ 0x54, 0x71, 0x1E, 0x91, 0xAE, 0x3A, 0xF6, 0x9C, 0xEE, 0x14, 0xD5, 0x4C, 0x9E, 0xD5, 0x27, 0x4D, 0x74, 0xE3, 0xDA, 0x12,
+ 0x04, 0xA6, 0xD3, 0x4C, 0x55, 0x38, 0xF4, 0xF5, 0xD9, 0xAB, 0xB6, 0x0D, 0x95, 0xAE, 0x5A, 0x67, 0x68, 0xEA, 0x25, 0x9D,
+ 0x6A, 0x51, 0x28, 0xF4, 0xAD, 0x40, 0xB5, 0xE8, 0x57, 0xAD, 0x36, 0x8F, 0x16, 0xD6, 0x7E, 0x5B, 0x10, 0x95, 0x59, 0xA7,
+ 0xC1, 0xA8, 0x47, 0x8B, 0x51, 0xA8, 0xA5, 0x94, 0x2D, 0xD7, 0x52, 0xF3, 0xAD, 0xC6, 0x53, 0x9E, 0x4B, 0xCD, 0x53, 0x12,
+ 0xCB, 0x52, 0xE4, 0xBB, 0x24, 0xB8, 0x5F, 0x8F, 0xF4, 0x65, 0x42, 0x46, 0x66, 0x2A, 0x17, 0xCD, 0xA5, 0xF1, 0x10, 0xF2,
+ 0x5C, 0xCF, 0x1C, 0xF4, 0x57, 0x56, 0xDD, 0x68, 0xB3, 0x55, 0x15, 0x74, 0xFB, 0xD1, 0x3D, 0x28, 0x79, 0x11, 0x2E, 0x4D,
+ 0xD1, 0x33, 0x1A, 0xF3, 0xFB, 0xAF, 0x3E, 0x18, 0xEB, 0x74, 0x7A, 0xAD, 0x46, 0x7B, 0x8C, 0x34, 0xCC, 0x64, 0x4F, 0xA8,
+ 0x45, 0x50, 0x82, 0x2A, 0x13, 0xA4, 0xB6, 0xEC, 0x4E, 0x64, 0xF9, 0x2D, 0xB8, 0xE4, 0x44, 0x38, 0x63, 0xBA, 0xEA, 0xDF,
+ 0x53, 0x02, 0x3B, 0x2E, 0x08, 0xE7, 0xCA, 0x69, 0x2F, 0x37, 0x4F, 0x42, 0x65, 0xBF, 0xE7, 0xFE, 0x27, 0xF0, 0xA5, 0x6B,
+ 0x55, 0x16, 0x99, 0x9A, 0x41, 0x65, 0xE1, 0xA6, 0x3F, 0x73, 0x37, 0xF4, 0xF5, 0x76, 0xEB, 0xA7, 0x70, 0x23, 0xDE, 0xB6,
+ 0x52, 0x1C, 0xAC, 0x19, 0xB3, 0x03, 0x2D, 0xED, 0x05, 0xB5, 0x4C, 0x6A, 0x3A, 0x62, 0xEC, 0x62, 0xB0, 0xEB, 0x4A, 0x8C,
+ 0x3C, 0xE7, 0x1B, 0x1E, 0x73, 0x6E, 0xBA, 0xEA, 0x56, 0x16, 0x86, 0x94, 0xA7, 0x79, 0x46, 0x53, 0xC8, 0xB7, 0x08, 0x50,
+ 0x71, 0xB6, 0xD0, 0xDA, 0x81, 0x40, 0x23, 0x64, 0x27, 0xCC, 0xAF, 0xF0, 0xF1, 0x66, 0x68, 0xCC, 0x95, 0x17, 0x62, 0x2F,
+ 0xDE, 0x4B, 0x4D, 0xA0, 0xEC, 0x91, 0xAB, 0xC6, 0x6D, 0xEB, 0x9C, 0x4F, 0xF3, 0xDF, 0x58, 0xC7, 0xD3, 0x07, 0x70, 0x30,
+ 0x5B, 0x47, 0x92, 0xA5, 0x2D, 0xC3, 0xE6, 0x29, 0xD5, 0xF9, 0x4C, 0xF2, 0xF3, 0xCA, 0x0D, 0xA5, 0xA2, 0x84, 0xB2, 0x85,
+ 0xAD, 0x0D, 0xBB, 0x2B, 0xCE, 0x48, 0x61, 0x4F, 0xB2, 0x14, 0x1A, 0x0A, 0xE6, 0x35, 0x46, 0xC5, 0x49, 0x61, 0xAA, 0xAB,
+ 0x36, 0x16, 0x70, 0x90, 0x18, 0x9C, 0x37, 0xFD, 0xCD, 0x1C, 0x0E, 0x67, 0x11, 0x9F, 0x90, 0x2F, 0xC2, 0xDD, 0xFD, 0x6E,
+ 0xEF, 0x84, 0xAD, 0x16, 0x7E, 0xB5, 0xA8, 0x94, 0x8A, 0x64, 0xA8, 0xD1, 0x1E, 0x8F, 0x53, 0x90, 0xC2, 0x1B, 0x71, 0xE4,
+ 0xBA, 0xDD, 0x3D, 0xD6, 0x56, 0x03, 0xAF, 0xB0, 0xFB, 0x6D, 0xC5, 0x90, 0xA7, 0xE3, 0x36, 0x12, 0xE9, 0x96, 0x5B, 0x41,
+ 0x9D, 0xEC, 0xCD, 0x3E, 0xFC, 0x26, 0xFC, 0xF6, 0xD8, 0x4C, 0xBF, 0x53, 0xF0, 0x9B, 0x1F, 0x97, 0xED, 0x56, 0x5D, 0x22,
+ 0x92, 0x09, 0xA4, 0x62, 0x66, 0x26, 0xFC, 0x46, 0x42, 0x4C, 0xE3, 0x0D, 0xEA, 0xBA, 0x28, 0x6A, 0xF6, 0x86, 0xE5, 0xAD,
+ 0x50, 0x7A, 0x88, 0x8B, 0x08, 0x07, 0x74, 0x60, 0x35, 0xDB, 0xFD, 0x49, 0xA2, 0x78, 0x76, 0xF0, 0xED, 0x65, 0xC6, 0x63,
+ 0x57, 0xB5, 0x4E, 0xC5, 0xD3, 0x76, 0xE4, 0x25, 0xF9, 0x14, 0xF6, 0x2E, 0x1B, 0x8D, 0x98, 0x0E, 0x4A, 0x9C, 0xD7, 0x97,
+ 0x4F, 0x8D, 0xEC, 0x71, 0xBF, 0x65, 0x2E, 0x1C, 0x16, 0x16, 0x95, 0x42, 0x87, 0x10, 0x34, 0xA0, 0x21, 0x25, 0xDA, 0x95,
+ 0x40, 0xA1, 0xE9, 0x5E, 0xC8, 0xC7, 0x65, 0x7B, 0x94, 0x51, 0x2D, 0x4D, 0x34, 0x04, 0xCD, 0x55, 0x21, 0x19, 0xE5, 0xB0,
+ 0x67, 0x04, 0xBE, 0xBA, 0xF3, 0x4F, 0xCD, 0xDC, 0x5A, 0xA9, 0x14, 0xCD, 0x55, 0x16, 0x0E, 0x73, 0x55, 0xBD, 0x26, 0x15,
+ 0x10, 0x1C, 0xEB, 0x81, 0x7E, 0x31, 0x69, 0x0C, 0xDD, 0xD5, 0xBA, 0x3E, 0xA7, 0x5B, 0xD5, 0x6A, 0x2D, 0xEF, 0x46, 0x81,
+ 0x4B, 0x9B, 0x4B, 0xA3, 0xDE, 0xB6, 0xAC, 0xD6, 0x6A, 0xF4, 0x8B, 0xB3, 0x4F, 0xE3, 0x4C, 0x91, 0x54, 0x6A, 0x3F, 0xB5,
+ 0x44, 0x53, 0xA9, 0x15, 0xEB, 0x12, 0x5C, 0x9A, 0x84, 0xD5, 0xC1, 0x77, 0xCB, 0x95, 0x26, 0xD5, 0xAB, 0x54, 0x1C, 0x6D,
+ 0xA1, 0xF5, 0x12, 0x5A, 0x57, 0x93, 0xFF, 0x00, 0x10, 0x0D, 0xD6, 0x8D, 0xFA, 0x3A, 0x6A, 0xA6, 0x91, 0xA5, 0xDC, 0xA1,
+ 0xEA, 0xA6, 0xAA, 0x4B, 0xC0, 0x96, 0xEB, 0xA1, 0x6A, 0x43, 0x2D, 0x2B, 0x7B, 0x4E, 0xBB, 0xF6, 0x52, 0x3A, 0x59, 0xA1,
+ 0x8B, 0xD3, 0x84, 0x62, 0xC8, 0xCC, 0x34, 0xB7, 0xF4, 0x60, 0x9C, 0x85, 0x33, 0x61, 0xA6, 0x9C, 0x42, 0x4A, 0x4A, 0x14,
+ 0x92, 0x32, 0x08, 0xE5, 0x29, 0x52, 0x4E, 0xE1, 0x49, 0xC1, 0xC2, 0xB6, 0x3B, 0x28, 0x64, 0x11, 0x8D, 0xC8, 0x3C, 0x79,
+ 0xEB, 0x4F, 0xB2, 0x9D, 0x99, 0x96, 0xEB, 0xC3, 0x27, 0x7C, 0xFD, 0x6D, 0xAE, 0x99, 0xC6, 0x3E, 0x7F, 0x28, 0xB5, 0xE7,
+ 0x4B, 0x79, 0x48, 0x3B, 0x1C, 0x9E, 0x9B, 0x02, 0x13, 0xD0, 0x77, 0xDB, 0xB7, 0x7F, 0x86, 0x4F, 0x4E, 0x17, 0x53, 0xD8,
+ 0x5F, 0x8A, 0xFE, 0xAC, 0xE8, 0xCE, 0x38, 0x7C, 0x9F, 0xE4, 0xFD, 0x1D, 0x25, 0xE4, 0xA3, 0xF7, 0xFF, 0x00, 0x4E, 0x1F,
+ 0x53, 0xFF, 0x00, 0xEA, 0x7E, 0x46, 0x88, 0x3C, 0xFC, 0xDF, 0xE7, 0x4F, 0xC7, 0x64, 0x10, 0x9D, 0x8E, 0xE0, 0x7F, 0xD0,
+ 0xC1, 0xFE, 0xE1, 0xDB, 0xAF, 0x4D, 0x7F, 0x4F, 0x3A, 0x7F, 0x7F, 0x7F, 0xE1, 0xD3, 0x7C, 0x5C, 0xD1, 0xAD, 0xAA, 0xE5,
+ 0x2E, 0xB3, 0x56, 0xB7, 0x25, 0xDD, 0xB4, 0x78, 0xA9, 0x9C, 0x26, 0x51, 0xE9, 0xF3, 0x62, 0x53, 0xEA, 0x05, 0xE9, 0x10,
+ 0x5E, 0x8F, 0x02, 0xA5, 0x05, 0xFA, 0x8B, 0x6F, 0x40, 0x72, 0x55, 0x26, 0x5B, 0x8D, 0xCA, 0x62, 0x3C, 0xD6, 0xFC, 0x95,
+ 0x2D, 0x29, 0x79, 0x2A, 0x4B, 0xF1, 0xD8, 0x26, 0x3A, 0xA8, 0x2A, 0xA5, 0x68, 0x6A, 0xA4, 0xEA, 0xA5, 0x24, 0xBC, 0x8F,
+ 0x4A, 0x0B, 0x0F, 0x4B, 0xCB, 0x99, 0x7D, 0x35, 0x35, 0x2C, 0x7B, 0x22, 0xDE, 0x19, 0x41, 0xC0, 0xC9, 0x72, 0xCF, 0xA9,
+ 0x68, 0xCE, 0x9B, 0xAF, 0xDE, 0xD1, 0x27, 0x4A, 0x6C, 0xD9, 0x3A, 0x6E, 0xAB, 0x39, 0x48, 0x7C, 0xC9, 0x6E, 0xE5, 0xBD,
+ 0x2E, 0xC9, 0xD7, 0xED, 0xD7, 0x12, 0x41, 0x51, 0x57, 0xB5, 0xD1, 0xE1, 0xA9, 0x31, 0x6D, 0x8A, 0x3D, 0x49, 0x0B, 0xFD,
+ 0xA3, 0x15, 0x69, 0x11, 0xAB, 0xD3, 0xA2, 0x3C, 0x11, 0x22, 0x12, 0xA3, 0x49, 0x43, 0x4F, 0x36, 0xBA, 0xC5, 0xFF, 0x00,
+ 0x97, 0xB5, 0xD2, 0xDB, 0xDA, 0xAD, 0x6B, 0xAE, 0xD7, 0x50, 0xF7, 0x69, 0x78, 0x98, 0x6D, 0xE9, 0xA9, 0x29, 0xA9, 0x01,
+ 0xF6, 0x48, 0x84, 0x61, 0x5F, 0x58, 0x63, 0xC6, 0x5B, 0x5B, 0xD5, 0xC3, 0x4B, 0xC4, 0x78, 0xCD, 0x34, 0x0A, 0xD7, 0xE5,
+ 0xA4, 0x27, 0x2B, 0x52, 0x94, 0xE2, 0xF6, 0xC8, 0x2B, 0x52, 0xCA, 0x94, 0xA5, 0x91, 0x9E, 0x75, 0xAC, 0x95, 0xA9, 0x44,
+ 0xA9, 0x45, 0x4A, 0x24, 0x9A, 0xA7, 0xAB, 0xD9, 0x3D, 0x92, 0x94, 0x73, 0x33, 0x9A, 0x8E, 0xF6, 0xC2, 0xB9, 0x21, 0x6C,
+ 0x26, 0xB4, 0x24, 0xED, 0x80, 0xB7, 0xDE, 0x31, 0xAD, 0x9A, 0xD7, 0xCC, 0x83, 0x9E, 0xE7, 0x3B, 0x8D, 0xF6, 0xEB, 0xB0,
+ 0xEC, 0x00, 0x27, 0xFE, 0xFC, 0x3A, 0x9E, 0x9E, 0x7E, 0x4C, 0xDB, 0x9C, 0x77, 0x2D, 0xF1, 0xBD, 0xB4, 0xD6, 0xC7, 0x19,
+ 0x83, 0x31, 0xF1, 0xF3, 0x13, 0x1F, 0xCE, 0x9A, 0x75, 0x87, 0x21, 0xA5, 0x3F, 0xB6, 0x75, 0x09, 0x51, 0xD9, 0x09, 0x39,
+ 0x52, 0xD4, 0x54, 0x79, 0x40, 0x0D, 0xA4, 0x17, 0x09, 0x52, 0xF2, 0x94, 0xA4, 0x03, 0xCC, 0xAD, 0x80, 0x2A, 0xC6, 0x33,
+ 0x9A, 0x25, 0xF6, 0x5B, 0xF0, 0x22, 0x8D, 0xAC, 0x4D, 0xB1, 0x8C, 0x5E, 0xF1, 0x1A, 0x99, 0x08, 0xBE, 0x66, 0xF1, 0x6F,
+ 0x17, 0xFE, 0x4F, 0x8F, 0x72, 0x2D, 0x4D, 0x37, 0xA5, 0xDC, 0x57, 0x75, 0x2E, 0x99, 0xA9, 0x54, 0xEA, 0x85, 0xBF, 0x62,
+ 0x45, 0x61, 0xAB, 0x9A, 0xF3, 0x5D, 0x69, 0xA7, 0x2D, 0xB4, 0x0B, 0x2E, 0x23, 0xE8, 0x72, 0x64, 0xCA, 0xDD, 0x56, 0xA8,
+ 0x86, 0x5B, 0xB5, 0xAD, 0xAA, 0x82, 0x40, 0x86, 0xE5, 0x62, 0x4A, 0x17, 0x52, 0xAA, 0x21, 0xE5, 0x53, 0x6D, 0x7A, 0x7C,
+ 0xEA, 0x9C, 0x96, 0x9E, 0x8B, 0x5B, 0x5B, 0x45, 0x7B, 0x94, 0x1B, 0x83, 0x4D, 0x07, 0xB7, 0x5C, 0xD9, 0x28, 0xA5, 0x65,
+ 0xA9, 0x6D, 0x45, 0x32, 0x47, 0x53, 0x7A, 0x94, 0x29, 0x1D, 0x67, 0xB8, 0x85, 0x0A, 0x45, 0xC8, 0x2E, 0x5F, 0x96, 0xD3,
+ 0x0C, 0x3C, 0xB6, 0x2E, 0xBE, 0xCC, 0xCF, 0xA3, 0x2F, 0x0C, 0x1F, 0x4E, 0x0F, 0xD1, 0xF7, 0x22, 0xB5, 0x41, 0xD1, 0x8B,
+ 0xD9, 0xEA, 0xF5, 0x0A, 0x8F, 0x02, 0x64, 0x3A, 0x15, 0xB9, 0x7C, 0x55, 0x2D, 0xF9, 0x34, 0xEB, 0x1E, 0x33, 0x0C, 0xB6,
+ 0xDD, 0x22, 0x28, 0x69, 0xA5, 0x4E, 0x8F, 0x26, 0x1C, 0x16, 0x58, 0x75, 0x6D, 0xC7, 0x7A, 0xA6, 0xB8, 0xC9, 0x55, 0x39,
+ 0xA6, 0x61, 0x8F, 0x66, 0x0E, 0x3A, 0xF0, 0xF6, 0x28, 0xFC, 0x7F, 0xE1, 0xEB, 0x7A, 0x29, 0xAC, 0x16, 0xAF, 0x65, 0xAE,
+ 0x96, 0x8A, 0x53, 0x19, 0xE0, 0x70, 0x12, 0x36, 0xC1, 0x83, 0xCB, 0xAF, 0x69, 0xAA, 0xA6, 0xAA, 0x77, 0x69, 0x6B, 0x6E,
+ 0xD3, 0x28, 0xB5, 0x66, 0xCD, 0x41, 0x4B, 0x57, 0x6B, 0xB2, 0x31, 0x4C, 0xEB, 0xA9, 0x1A, 0xC5, 0xE0, 0xCB, 0x4F, 0xF5,
+ 0x86, 0x93, 0x4F, 0xBD, 0x74, 0xC1, 0xB7, 0xAA, 0x90, 0x2A, 0x6B, 0x4D, 0x55, 0xF9, 0xF1, 0x98, 0x75, 0xFB, 0x6A, 0x5D,
+ 0x3A, 0x7C, 0x90, 0xA8, 0xDE, 0xD0, 0xFB, 0x0A, 0x92, 0x86, 0x55, 0x3E, 0x24, 0xBC, 0x46, 0x89, 0x4F, 0x4A, 0x22, 0xC7,
+ 0x53, 0x71, 0x9A, 0x62, 0x3C, 0x96, 0x50, 0x24, 0xAB, 0xAC, 0xA8, 0x6C, 0x84, 0x8F, 0x7E, 0x08, 0x3C, 0x49, 0xC7, 0xCB,
+ 0x12, 0xCC, 0xED, 0xEE, 0xEE, 0x6D, 0xA9, 0x72, 0x31, 0xC5, 0x42, 0x99, 0x93, 0x9E, 0x6F, 0x1F, 0x3D, 0x50, 0x0A, 0xBF,
+ 0xD1, 0x9D, 0x70, 0x55, 0x5A, 0x7A, 0x48, 0xB6, 0xA2, 0xC5, 0x7A, 0x0C, 0xA6, 0xDC, 0x54, 0x97, 0x0A, 0x61, 0x2A, 0x5B,
+ 0xE8, 0x12, 0x42, 0x25, 0x46, 0xA9, 0x9F, 0x6D, 0xA7, 0x54, 0x1F, 0x8A, 0xB4, 0x49, 0x95, 0x36, 0x0B, 0x12, 0x18, 0x66,
+ 0x24, 0x4F, 0x2A, 0x3A, 0x22, 0x49, 0x9A, 0xCF, 0x2B, 0x29, 0xA2, 0x9A, 0xB8, 0x33, 0x9B, 0x0F, 0xAB, 0x9E, 0xF7, 0xF1,
+ 0x3E, 0x75, 0xD6, 0x7E, 0x39, 0xA7, 0x15, 0x29, 0x0F, 0x98, 0x01, 0xB2, 0x18, 0xEC, 0x66, 0x53, 0x9B, 0x1A, 0xD8, 0xD2,
+ 0xBE, 0x8B, 0x54, 0xDB, 0x0A, 0x55, 0x62, 0xEC, 0xFA, 0xB6, 0x0D, 0x11, 0xE9, 0x48, 0xF3, 0x65, 0xCD, 0xA8, 0xBF, 0x43,
+ 0x5C, 0xAF, 0x3D, 0x4A, 0x90, 0x1C, 0xA8, 0xAA, 0xAA, 0x89, 0x09, 0x7E, 0x95, 0x0E, 0xA5, 0x1C, 0x39, 0x29, 0xC7, 0xDD,
+ 0x61, 0x0A, 0x3C, 0xAE, 0xD5, 0xE3, 0x84, 0xA4, 0x40, 0x7C, 0x29, 0xA6, 0xF4, 0xE6, 0xF0, 0x96, 0x7B, 0x41, 0x78, 0xB4,
+ 0x62, 0x7F, 0x98, 0x97, 0xF1, 0xF5, 0xD5, 0x11, 0xC7, 0x00, 0x31, 0x21, 0x10, 0x4C, 0x8E, 0x12, 0x3F, 0x89, 0xB1, 0x36,
+ 0x17, 0x85, 0x8D, 0x39, 0xD1, 0x67, 0x60, 0x6A, 0x15, 0x26, 0xE4, 0xB4, 0x2E, 0x99, 0xF1, 0xE3, 0x35, 0x2A, 0x43, 0xCC,
+ 0xD7, 0x22, 0xCF, 0x08, 0x7E, 0x4C, 0x26, 0x82, 0xC2, 0xC5, 0x36, 0x5B, 0xE1, 0xC7, 0x98, 0x90, 0xCF, 0x94, 0x5C, 0x52,
+ 0xE1, 0xAE, 0x1A, 0x04, 0x61, 0xEC, 0xF5, 0x04, 0xB2, 0xE3, 0x6C, 0xD7, 0x3E, 0xCC, 0xF7, 0x64, 0x8F, 0x89, 0xC4, 0x7A,
+ 0x63, 0xBE, 0xB0, 0xAF, 0x76, 0xBD, 0xC3, 0xA2, 0xA1, 0x88, 0xE6, 0x99, 0x22, 0x66, 0x31, 0x97, 0xCA, 0xB6, 0xBB, 0xC9,
+ 0xE3, 0x67, 0xE9, 0x07, 0x99, 0x7B, 0x6B, 0x9F, 0x8D, 0x5D, 0x77, 0xAB, 0xEA, 0x2B, 0xF3, 0x93, 0x1E, 0xD9, 0xB9, 0xDB,
+ 0xB7, 0x6D, 0x3A, 0x0A, 0x9F, 0x92, 0x29, 0xF4, 0x8B, 0x6D, 0xAA, 0x5C, 0x09, 0x90, 0x57, 0x4E, 0x69, 0xE7, 0x56, 0xA4,
+ 0x31, 0x52, 0x4C, 0x9F, 0xAC, 0x56, 0xEA, 0x54, 0x95, 0x49, 0x75, 0xF5, 0xA9, 0xDC, 0xF2, 0x36, 0x86, 0xFE, 0x77, 0xF1,
+ 0xF5, 0x57, 0xB9, 0xF8, 0x9D, 0xCA, 0x27, 0xD9, 0xDB, 0xE9, 0x29, 0x2E, 0x04, 0xD2, 0x2B, 0x0A, 0xCC, 0xB5, 0x44, 0xC7,
+ 0x6D, 0x75, 0xED, 0xED, 0x15, 0x05, 0x3F, 0xD3, 0x4D, 0x14, 0x14, 0xDD, 0x85, 0x69, 0x9A, 0x95, 0x8B, 0xB2, 0xB0, 0xB1,
+ 0x62, 0xF6, 0x0D, 0x44, 0xDA, 0x2D, 0x74, 0x5E, 0xFA, 0x09, 0x59, 0x75, 0xDB, 0x65, 0x4E, 0x5C, 0x16, 0x35, 0x59, 0xE6,
+ 0x17, 0x75, 0xE9, 0xDD, 0x52, 0x5A, 0xFE, 0xAB, 0xAA, 0x96, 0x15, 0x96, 0x6A, 0x94, 0x87, 0x9C, 0x4B, 0xA9, 0xA2, 0x5C,
+ 0xF4, 0xF1, 0x95, 0xC0, 0xAA, 0xB6, 0xDA, 0xDB, 0x79, 0x21, 0x50, 0x6A, 0x01, 0xDA, 0x7B, 0xEE, 0xB6, 0x9E, 0x7D, 0x9D,
+ 0xDA, 0xF6, 0x2A, 0x90, 0x2A, 0xA5, 0x86, 0xBA, 0x24, 0xB9, 0xC3, 0x0C, 0xA2, 0x70, 0xC4, 0x87, 0x72, 0xDA, 0xD8, 0xD9,
+ 0xE8, 0x84, 0x9A, 0x86, 0xCD, 0x37, 0xF6, 0x67, 0x35, 0x51, 0x50, 0xC9, 0x1D, 0x99, 0x1C, 0x37, 0x84, 0x95, 0xDF, 0xAB,
+ 0x51, 0x2A, 0x15, 0xAA, 0xD4, 0xBB, 0x62, 0x9B, 0x52, 0xA3, 0x5B, 0x32, 0xAA, 0x2E, 0x48, 0xA1, 0xD2, 0xAA, 0xE8, 0x8A,
+ 0xCD, 0x42, 0x9D, 0x0E, 0x4B, 0x6C, 0xBC, 0xEC, 0x15, 0xB7, 0x12, 0x44, 0xB8, 0xED, 0xC6, 0x89, 0x35, 0x72, 0x99, 0x82,
+ 0x86, 0xE4, 0x38, 0x11, 0x4F, 0x44, 0x64, 0x92, 0x12, 0x94, 0x81, 0xA9, 0x15, 0x35, 0xB4, 0x52, 0xD3, 0x42, 0xF5, 0x05,
+ 0x44, 0xF4, 0xDF, 0xDD, 0x21, 0x8C, 0x62, 0x66, 0xC0, 0x78, 0xD6, 0xD9, 0xB3, 0x61, 0x32, 0xDF, 0xD2, 0x47, 0x9F, 0x5B,
+ 0x2D, 0xA7, 0x44, 0x17, 0x93, 0x8C, 0x13, 0x80, 0x7F, 0x7B, 0xAF, 0xBF, 0x7E, 0x87, 0xF9, 0x71, 0x45, 0x08, 0xCA, 0x54,
+ 0xB9, 0x3A, 0x69, 0x21, 0xED, 0x79, 0xB7, 0x17, 0xEF, 0x31, 0x36, 0xD5, 0x02, 0xD8, 0x15, 0xF1, 0x79, 0xEF, 0x62, 0x5F,
+ 0x9F, 0xEB, 0xAC, 0x7C, 0xC4, 0x7E, 0xF0, 0xE2, 0xE1, 0xEC, 0xFC, 0x9D, 0x57, 0x4D, 0x5D, 0xAA, 0xFF, 0x00, 0xB3, 0x73,
+ 0xFF, 0x00, 0x4D, 0x3B, 0x56, 0xBE, 0x6D, 0xB3, 0x8C, 0x93, 0x8C, 0x9C, 0x13, 0xD7, 0x6E, 0xA3, 0xD7, 0x24, 0x03, 0xF3,
+ 0xE2, 0x5A, 0xA0, 0x71, 0xD5, 0x0A, 0x81, 0x21, 0x38, 0x14, 0x23, 0x8C, 0x71, 0x99, 0x9D, 0x4D, 0xA1, 0x1B, 0xDB, 0x1D,
+ 0xBC, 0xC5, 0xE7, 0x1F, 0x1D, 0x6A, 0xE5, 0x46, 0x0E, 0x27, 0x04, 0x02, 0x37, 0x3D, 0x70, 0x73, 0xBF, 0x53, 0x92, 0x46,
+ 0x46, 0xDD, 0x70, 0x47, 0xE1, 0xC6, 0x4D, 0x4C, 0xCD, 0xAE, 0x44, 0x24, 0x89, 0x98, 0x47, 0x3A, 0x06, 0x7E, 0x69, 0xF7,
+ 0xEB, 0x9D, 0x00, 0xD4, 0x26, 0xD2, 0xBC, 0xF2, 0xE7, 0x07, 0x60, 0x72, 0x47, 0x6E, 0xD8, 0x1F, 0x68, 0x76, 0xEB, 0xD3,
+ 0x63, 0xC0, 0xAF, 0x6A, 0x49, 0x1C, 0x44, 0xDE, 0x2D, 0xCC, 0x1D, 0xFE, 0x1A, 0x3E, 0xFE, 0xFE, 0xFB, 0x6B, 0x6E, 0xDA,
+ 0x54, 0xD8, 0x03, 0xB8, 0x3D, 0x48, 0x1E, 0x9D, 0xF6, 0x1D, 0x7A, 0xED, 0x8C, 0xF0, 0x0D, 0x3C, 0xD2, 0xB3, 0xDA, 0xA8,
+ 0x0F, 0xAA, 0xCF, 0xE9, 0xA5, 0x6B, 0xC8, 0xCE, 0x08, 0x62, 0xDD, 0xF0, 0xDE, 0xF6, 0x19, 0xF0, 0x0E, 0x85, 0x99, 0x29,
+ 0x4D, 0xB4, 0xB2, 0x14, 0x09, 0xC7, 0xDD, 0x1B, 0x76, 0xEC, 0x46, 0x08, 0x1E, 0xF0, 0x31, 0x93, 0x92, 0x30, 0x0F, 0x0E,
+ 0x69, 0x6C, 0x51, 0x60, 0x66, 0x6F, 0x62, 0x59, 0x66, 0xC3, 0x29, 0x0E, 0x4B, 0x04, 0xB1, 0xA7, 0x63, 0x12, 0x7C, 0x6D,
+ 0xF2, 0xE6, 0xA5, 0x73, 0xE6, 0xDA, 0xD2, 0xD2, 0xB5, 0xB6, 0xD5, 0xB1, 0x23, 0x52, 0xA4, 0xC7, 0xB2, 0xF5, 0x69, 0xFD,
+ 0x48, 0xA3, 0xA2, 0xA7, 0x15, 0x52, 0xED, 0x5B, 0xA2, 0x89, 0x6B, 0x5B, 0x35, 0x59, 0x12, 0x6A, 0x12, 0x9E, 0x8F, 0x5A,
+ 0x72, 0xE3, 0xF6, 0x39, 0xF7, 0x14, 0x07, 0x97, 0x4F, 0x76, 0x24, 0x15, 0xB7, 0x05, 0x86, 0x27, 0xD3, 0x99, 0x89, 0xE4,
+ 0x53, 0x64, 0x36, 0x87, 0x4B, 0xEE, 0xBA, 0x77, 0x76, 0xA8, 0xA6, 0x91, 0xA3, 0x72, 0xAD, 0xCA, 0x67, 0x15, 0x14, 0x52,
+ 0xB2, 0xBD, 0x56, 0xA5, 0xAA, 0x5E, 0x21, 0x12, 0xF7, 0xE3, 0x59, 0x54, 0xD5, 0x82, 0x8A, 0x95, 0x8F, 0xF4, 0xA6, 0x0C,
+ 0xAD, 0x5F, 0xAB, 0x4A, 0x91, 0x9B, 0xC6, 0xA2, 0x2B, 0xD2, 0xE1, 0xBF, 0x35, 0x70, 0xBA, 0xD5, 0xDA, 0xF4, 0x5A, 0x35,
+ 0xB0, 0xEC, 0xFF, 0x00, 0xAD, 0x93, 0x65, 0x50, 0xDE, 0xAA, 0x3B, 0x4C, 0x97, 0x55, 0x00, 0xA5, 0x15, 0x9B, 0xA6, 0xB1,
+ 0x59, 0x99, 0x3E, 0xE4, 0xBF, 0x2E, 0x34, 0xA1, 0x45, 0xB1, 0x5B, 0xBA, 0xEA, 0x93, 0x9C, 0x8C, 0x95, 0x38, 0x8A, 0x6C,
+ 0x68, 0x0C, 0xAC, 0xB4, 0x72, 0xAE, 0xBA, 0xF7, 0x24, 0x62, 0x8A, 0x66, 0x7A, 0x29, 0xB8, 0xF9, 0x6F, 0x55, 0x55, 0x3E,
+ 0x6A, 0x55, 0x4E, 0xDA, 0x5F, 0x96, 0xD5, 0x7D, 0xC6, 0x7B, 0x50, 0x41, 0x44, 0x18, 0x9B, 0x7B, 0x49, 0xDD, 0xB1, 0xC1,
+ 0xA8, 0xB2, 0xE2, 0xD3, 0x58, 0x32, 0x20, 0x18, 0x34, 0xDA, 0x49, 0x7E, 0xA3, 0x2D, 0x6D, 0xC3, 0xA6, 0x46, 0x85, 0x18,
+ 0x2A, 0x6C, 0xAA, 0x94, 0xA7, 0x13, 0x1E, 0x04, 0x48, 0x8D, 0xB4, 0x8F, 0x35, 0xD9, 0x32, 0x65, 0x2D, 0xA6, 0x1A, 0x65,
+ 0x20, 0xF9, 0xAB, 0x58, 0x47, 0x2F, 0x29, 0x56, 0x32, 0x69, 0xBC, 0x0A, 0xAA, 0x01, 0x08, 0xAB, 0xC7, 0xD2, 0x0D, 0x45,
+ 0x7B, 0x54, 0xF4, 0xA7, 0x4D, 0xED, 0x70, 0x09, 0xB5, 0xA3, 0xCF, 0x1C, 0xF3, 0x3A, 0xBE, 0x9A, 0x27, 0xF4, 0xC1, 0x78,
+ 0xF5, 0xF0, 0x89, 0x67, 0x41, 0xF0, 0xF5, 0xA7, 0x97, 0x04, 0x39, 0xF0, 0x34, 0xFD, 0x08, 0xB7, 0xA6, 0xC4, 0xBA, 0x45,
+ 0x42, 0xBD, 0x0E, 0x2B, 0xB4, 0xF7, 0xDA, 0x78, 0xD3, 0x53, 0x18, 0x4F, 0x89, 0x15, 0x2D, 0x53, 0xA6, 0xB0, 0xDB, 0x49,
+ 0x79, 0xC7, 0x1D, 0x79, 0xE5, 0xC7, 0x29, 0x0A, 0xF2, 0x42, 0x10, 0x3B, 0x28, 0xFC, 0x76, 0xFE, 0xD0, 0x6D, 0xD4, 0x6D,
+ 0xD7, 0xD1, 0x34, 0xFB, 0x54, 0xAD, 0x51, 0x38, 0xEA, 0x11, 0xB7, 0x0F, 0xC7, 0x5C, 0xD5, 0x53, 0x4D, 0x4F, 0x4B, 0xB7,
+ 0x55, 0x55, 0x81, 0xD5, 0x51, 0x52, 0x4A, 0x52, 0x13, 0x87, 0x18, 0x97, 0x2E, 0xBA, 0x63, 0xA5, 0x5F, 0xE1, 0x4D, 0x6B,
+ 0x9D, 0x36, 0xDE, 0x16, 0xC7, 0x88, 0x0D, 0x1A, 0xA3, 0xD7, 0x6B, 0x94, 0xD8, 0x25, 0x30, 0xEE, 0x8B, 0x62, 0xA2, 0xEC,
+ 0x75, 0x48, 0x9C, 0xC4, 0x09, 0xF1, 0x61, 0xBF, 0x26, 0x85, 0x57, 0x62, 0x62, 0x61, 0xB8, 0x91, 0x26, 0x3B, 0x2D, 0xC8,
+ 0xA6, 0x54, 0x92, 0x84, 0x43, 0x61, 0xE6, 0x59, 0x0D, 0x2E, 0x4B, 0xCE, 0x1E, 0x8A, 0x7F, 0xE2, 0x54, 0x7F, 0x5E, 0xC7,
+ 0x2A, 0xF4, 0x57, 0x12, 0xDE, 0x33, 0x4A, 0x99, 0xE1, 0xFE, 0x0C, 0x1D, 0x9D, 0xB9, 0x47, 0xAB, 0x6E, 0xE3, 0xD2, 0x8D,
+ 0x45, 0x91, 0x49, 0x21, 0xB8, 0x5B, 0x8F, 0x3C, 0x6B, 0x8E, 0x1E, 0x2B, 0x3E, 0x91, 0x0F, 0x16, 0xDE, 0x3C, 0x2F, 0x1A,
+ 0xA5, 0x52, 0xE4, 0xD4, 0x2B, 0x9A, 0xCB, 0xD3, 0x34, 0xD4, 0xA5, 0x3D, 0x6F, 0x69, 0xD5, 0xB9, 0x70, 0x56, 0x62, 0xD0,
+ 0xE1, 0x34, 0xF3, 0xE5, 0xD5, 0x7B, 0x5A, 0xDA, 0x96, 0xC4, 0x8A, 0xCC, 0xB5, 0x3A, 0x4B, 0xCE, 0x3B, 0x31, 0xC3, 0x0E,
+ 0x2B, 0xAA, 0x2D, 0x43, 0x8A, 0x95, 0x05, 0xB8, 0xE7, 0x2E, 0xF7, 0xE3, 0x77, 0xF7, 0xB1, 0x53, 0xB7, 0x41, 0xC5, 0x0A,
+ 0x4C, 0x63, 0xAE, 0xA2, 0x1A, 0x93, 0x89, 0xC4, 0xEB, 0x6D, 0xBD, 0xB9, 0x22, 0x81, 0xA2, 0x8A, 0x5F, 0x7A, 0x26, 0xBA,
+ 0x9B, 0x73, 0x3E, 0x1B, 0x16, 0x3C, 0xA0, 0xEA, 0xBC, 0xE9, 0xCE, 0xAB, 0x6B, 0xC7, 0x87, 0xAB, 0x92, 0x9F, 0x79, 0x59,
+ 0x57, 0xFD, 0xD3, 0x2A, 0x14, 0x09, 0x51, 0xDF, 0xAC, 0xD0, 0x5D, 0xAC, 0xD4, 0x9D, 0xA7, 0x55, 0xE9, 0xCD, 0x14, 0xA6,
+ 0x54, 0x49, 0x50, 0x9E, 0x94, 0xFC, 0x77, 0x02, 0xE2, 0x05, 0xB2, 0x97, 0x9B, 0x43, 0x52, 0x19, 0x49, 0x1C, 0x85, 0x6D,
+ 0xA5, 0x4D, 0xAB, 0x2D, 0xBF, 0xC4, 0xFE, 0x23, 0x66, 0xA2, 0xA3, 0x72, 0xBB, 0x27, 0x50, 0xD6, 0xB4, 0xAF, 0x66, 0x6C,
+ 0xCC, 0xC7, 0xCC, 0x7B, 0x6B, 0x4A, 0xB6, 0xEB, 0xA2, 0x55, 0x6B, 0xA4, 0xBB, 0x4D, 0x43, 0x30, 0x8D, 0xC9, 0xC2, 0x66,
+ 0x4B, 0xE7, 0x5D, 0x0B, 0xF1, 0x59, 0x32, 0x85, 0x7E, 0xDD, 0xF6, 0x3E, 0xB6, 0xDB, 0xEB, 0x6D, 0xD8, 0x3A, 0x9D, 0x60,
+ 0xDA, 0x8B, 0xAC, 0xF2, 0x29, 0x2A, 0x52, 0x65, 0x9A, 0x73, 0xD2, 0xED, 0x8A, 0x93, 0xBC, 0xA7, 0x74, 0xCF, 0xA4, 0xAA,
+ 0xA1, 0x42, 0x75, 0xD3, 0xB7, 0xD6, 0x36, 0xCA, 0x98, 0x59, 0x0E, 0x3C, 0xD2, 0x0F, 0x67, 0xE3, 0x22, 0xBA, 0xE8, 0xDF,
+ 0xA4, 0x1A, 0x77, 0x68, 0x3A, 0xE6, 0xCA, 0xD3, 0x2D, 0x1D, 0xC9, 0xA8, 0x9A, 0x67, 0x1D, 0x54, 0x46, 0x43, 0x5B, 0xEC,
+ 0x09, 0xD4, 0x5A, 0xC9, 0x10, 0xD9, 0x18, 0xB8, 0xC6, 0x01, 0x8B, 0x48, 0xBA, 0xAE, 0x88, 0xA7, 0xB4, 0x12, 0x95, 0x72,
+ 0x8E, 0xBD, 0x48, 0x00, 0x1F, 0xC3, 0x3D, 0x73, 0x93, 0x8D, 0xFB, 0x63, 0xAE, 0x39, 0x03, 0x80, 0xB1, 0x6B, 0x4B, 0x07,
+ 0x1C, 0x1F, 0x43, 0xD3, 0x5D, 0x11, 0x38, 0x2E, 0xDA, 0xD9, 0x5E, 0x23, 0xCF, 0x6D, 0x1E, 0xD3, 0x61, 0x18, 0xE5, 0x04,
+ 0x01, 0x9E, 0xA3, 0x1F, 0x01, 0x83, 0xD8, 0x0D, 0x86, 0xDD, 0xBA, 0x71, 0xB5, 0x34, 0xB4, 0xF5, 0x5C, 0x1B, 0x49, 0x9B,
+ 0x0E, 0x1E, 0x99, 0x89, 0xB8, 0x4C, 0x43, 0x7D, 0x0E, 0x13, 0x86, 0xC9, 0xF7, 0x7F, 0xBB, 0xE8, 0x8E, 0x62, 0x91, 0xD7,
+ 0x03, 0xDF, 0xBF, 0xBF, 0x6C, 0xFE, 0x83, 0x8B, 0x59, 0x67, 0xEF, 0xC6, 0x9E, 0x59, 0x82, 0xEF, 0x07, 0xCB, 0xE3, 0x6F,
+ 0x8E, 0xBE, 0x79, 0xBF, 0xED, 0x7E, 0x5F, 0xDD, 0xC2, 0xD5, 0x74, 0xBF, 0xE9, 0x3E, 0x6F, 0xFE, 0xDA, 0x77, 0x29, 0xC1,
+ 0xBE, 0xE4, 0x9E, 0xDB, 0x0C, 0x7C, 0xF0, 0x47, 0xC7, 0xBF, 0x5E, 0xBC, 0x60, 0xB6, 0x80, 0x03, 0xC7, 0x3E, 0xAF, 0x3A,
+ 0x83, 0x49, 0x95, 0xAB, 0x27, 0x7E, 0xBB, 0x74, 0x1D, 0x31, 0x8E, 0xF9, 0xED, 0xDB, 0x85, 0xA3, 0x5F, 0x3C, 0xD0, 0x37,
+ 0xD8, 0x9D, 0xBA, 0x0D, 0xCF, 0x6E, 0xA3, 0x6D, 0xBD, 0xFB, 0xF7, 0xDF, 0x87, 0x0C, 0x4F, 0x13, 0x1F, 0x1F, 0xBF, 0xBB,
+ 0x9A, 0x35, 0xF0, 0xBA, 0x0F, 0xAA, 0x71, 0x9C, 0x01, 0xDF, 0xE7, 0x9E, 0xDF, 0x9E, 0x76, 0xF7, 0xAE, 0xFF, 0x00, 0x3F,
+ 0xDB, 0xF7, 0xD2, 0xBF, 0x3F, 0xC1, 0x8E, 0xD2, 0xCF, 0xC7, 0xBD, 0xB5, 0xAF, 0x95, 0xFB, 0x40, 0x40, 0x19, 0xEB, 0x90,
+ 0x4E, 0xDD, 0x37, 0x19, 0xEF, 0xD3, 0x1E, 0xBF, 0x3C, 0xF1, 0x45, 0x4D, 0x89, 0xE9, 0x18, 0x14, 0x3C, 0xE5, 0xEF, 0xE6,
+ 0xF1, 0xA7, 0xA6, 0xCC, 0x8A, 0x63, 0x4F, 0x2C, 0xA8, 0xB4, 0x0A, 0x89, 0x56, 0xE4, 0x02, 0x46, 0x4E, 0xC3, 0x9B, 0xAE,
+ 0x3A, 0x63, 0x20, 0x10, 0x76, 0x27, 0x6C, 0xF0, 0x55, 0x44, 0x66, 0x11, 0x27, 0xCB, 0xE0, 0x09, 0x64, 0x6D, 0xA5, 0x11,
+ 0xCE, 0x3E, 0x1F, 0x3E, 0xEE, 0x6F, 0xCE, 0x62, 0x74, 0x8A, 0xE3, 0x47, 0x8A, 0xDA, 0x96, 0xE8, 0x4A, 0x12, 0xD9, 0xCF,
+ 0xBF, 0x9B, 0x20, 0x72, 0x80, 0x01, 0x52, 0x8A, 0x94, 0x79, 0x52, 0x94, 0x82, 0xA5, 0x28, 0x80, 0x9C, 0xA8, 0x80, 0x53,
+ 0x49, 0x4C, 0x76, 0x73, 0x07, 0x1E, 0x1E, 0x7F, 0x5D, 0x38, 0xB3, 0x9B, 0xCC, 0x2F, 0xCA, 0xC1, 0x04, 0x63, 0x96, 0xF9,
+ 0x8E, 0x5F, 0xD4, 0xBB, 0x6E, 0xB9, 0xA6, 0xD3, 0x28, 0x5A, 0x97, 0x73, 0x41, 0x34, 0x96, 0x29, 0x76, 0xE4, 0x8D, 0x47,
+ 0x8B, 0x4F, 0x7D, 0x3C, 0xB5, 0x83, 0x6C, 0xA1, 0xE4, 0xD2, 0xAD, 0x62, 0xC3, 0x2E, 0x24, 0x9A, 0x74, 0xBD, 0x49, 0xBA,
+ 0x24, 0xC3, 0xB6, 0xA8, 0x35, 0x07, 0x31, 0x2A, 0x4D, 0x21, 0xCA, 0xCC, 0xEA, 0x3A, 0x44, 0x06, 0x9F, 0xAA, 0x3F, 0xAD,
+ 0x03, 0xB6, 0x9B, 0xAF, 0xF4, 0x53, 0xF9, 0x95, 0x52, 0xF1, 0x48, 0xC5, 0x00, 0x47, 0xBD, 0xB9, 0x5C, 0x03, 0x76, 0x26,
+ 0x31, 0xA9, 0xAD, 0x69, 0x07, 0x33, 0x70, 0x3C, 0x49, 0x33, 0xD9, 0xAA, 0x0F, 0x84, 0x43, 0xCD, 0x62, 0x8B, 0x6D, 0x48,
+ 0x96, 0xEC, 0xFA, 0xD5, 0x54, 0xA2, 0x55, 0x6E, 0xBB, 0x51, 0x9B, 0x5B, 0xAC, 0x49, 0x09, 0xFF, 0x00, 0x49, 0xAA, 0xD5,
+ 0xA4, 0xBB, 0x36, 0xA0, 0xE0, 0xD8, 0xE1, 0xB5, 0x48, 0x7D, 0xC4, 0xB0, 0x93, 0xF7, 0x18, 0x4B, 0x4D, 0xA7, 0x01, 0x03,
+ 0x8E, 0x56, 0x95, 0x5A, 0xAD, 0x28, 0xB8, 0xE6, 0xA6, 0x62, 0xF8, 0xEC, 0x39, 0x02, 0xF7, 0x6F, 0x06, 0xD8, 0x43, 0x79,
+ 0x57, 0xA9, 0x9C, 0xAF, 0x3F, 0x3F, 0x91, 0x63, 0x4C, 0xBB, 0xA3, 0x4B, 0x9B, 0xAE, 0x3C, 0xC3, 0xC1, 0x4E, 0x46, 0x71,
+ 0xA5, 0x14, 0xF9, 0x8D, 0x25, 0x25, 0x4A, 0x69, 0x5B, 0xA9, 0xB3, 0x90, 0x46, 0xC4, 0x65, 0x0A, 0xDC, 0xA0, 0xE7, 0x1C,
+ 0xC0, 0xA8, 0x11, 0xDB, 0xBD, 0x9B, 0x5F, 0x8C, 0x76, 0xE6, 0xFA, 0x8D, 0xCD, 0x8A, 0x6B, 0x7D, 0xE8, 0x8F, 0x3F, 0xA7,
+ 0x3E, 0x2E, 0xCD, 0xDE, 0xCD, 0x9F, 0xF6, 0xE5, 0xA1, 0x1E, 0x95, 0x11, 0x98, 0xAD, 0x34, 0x10, 0x86, 0x5B, 0x4A, 0x00,
+ 0xC0, 0x24, 0x01, 0xD7, 0x72, 0x0F, 0x53, 0xF7, 0x8E, 0x09, 0x51, 0x24, 0xF1, 0x54, 0xD2, 0x07, 0x37, 0x59, 0xF3, 0xC4,
+ 0x7A, 0x72, 0x7C, 0xF5, 0xAD, 0x14, 0x53, 0x48, 0x74, 0xF6, 0x2F, 0x8E, 0xDF, 0x73, 0x9F, 0xA6, 0x9C, 0x52, 0xE8, 0x4D,
+ 0x2D, 0x95, 0x21, 0x48, 0x0A, 0x0A, 0x04, 0x6C, 0x31, 0x81, 0xD0, 0x8C, 0x7D, 0xDC, 0x8D, 0xBA, 0xFA, 0x1E, 0xC3, 0x81,
+ 0x2C, 0x04, 0x45, 0xED, 0xC5, 0xCB, 0x3F, 0x30, 0xC5, 0xFE, 0x5A, 0x7D, 0x23, 0x32, 0x67, 0xCC, 0xC7, 0xA3, 0x02, 0x6A,
+ 0x79, 0xD0, 0x7B, 0x7E, 0x81, 0xA8, 0x54, 0x7A, 0x0E, 0x9C, 0x5E, 0x77, 0x42, 0x6D, 0x0A, 0x5E, 0x9F, 0xDC, 0x28, 0xB6,
+ 0x26, 0xDD, 0x72, 0x50, 0xEC, 0x88, 0x36, 0xC6, 0x97, 0x6A, 0xAD, 0x61, 0xBF, 0xF1, 0x72, 0xE9, 0xAC, 0xC5, 0x63, 0x9A,
+ 0x4C, 0x9B, 0x63, 0x4D, 0x35, 0x58, 0x32, 0xCD, 0x7D, 0xC8, 0xA1, 0x53, 0x28, 0xF6, 0xF5, 0xCD, 0x0A, 0xA1, 0x08, 0xF9,
+ 0xB4, 0xF6, 0x9B, 0x7B, 0x6D, 0xA0, 0xAE, 0x82, 0x8A, 0xAA, 0x87, 0x65, 0x85, 0x9C, 0x6D, 0xEE, 0x27, 0x4B, 0x39, 0xE9,
+ 0xA3, 0x70, 0x07, 0x92, 0x44, 0x85, 0x9D, 0x67, 0x40, 0x53, 0x55, 0x54, 0x44, 0x80, 0xB4, 0x78, 0x9B, 0x84, 0xB3, 0x6A,
+ 0x59, 0xB4, 0xCD, 0xCC, 0x11, 0xA7, 0x46, 0xB2, 0xE8, 0x96, 0xA4, 0x78, 0x75, 0xD5, 0x0B, 0xBB, 0x45, 0xF5, 0x82, 0x84,
+ 0x6D, 0xFB, 0xF6, 0xCC, 0x96, 0xDB, 0x32, 0x9B, 0x43, 0x8D, 0xCD, 0xA4, 0xD7, 0x69, 0x33, 0x18, 0x6E, 0x65, 0x0E, 0xEB,
+ 0xB5, 0xEA, 0xCC, 0x7F, 0x9A, 0x57, 0x6D, 0x6B, 0x9A, 0x95, 0x22, 0x25, 0x66, 0x83, 0x5A, 0x80, 0xA5, 0xC5, 0xA8, 0x53,
+ 0xA5, 0xB0, 0xF3, 0x65, 0x0A, 0x52, 0x9A, 0x6A, 0x6A, 0xA6, 0xBD, 0xAA, 0x9A, 0x6A, 0x3A, 0x5A, 0x61, 0x2A, 0x96, 0x1E,
+ 0x54, 0x7B, 0x4E, 0x73, 0xE7, 0x99, 0xD4, 0x1C, 0xCD, 0x8E, 0x4C, 0x4A, 0xB1, 0x1F, 0x0E, 0x39, 0xF2, 0x9A, 0x88, 0xD6,
+ 0x42, 0x41, 0x1D, 0x14, 0x37, 0x19, 0x39, 0xDB, 0x24, 0x7C, 0xF7, 0x1D, 0x7A, 0x1E, 0xA3, 0x6E, 0xAD, 0x89, 0x56, 0xC3,
+ 0x16, 0x12, 0xEC, 0x0F, 0xC9, 0x97, 0x05, 0xB8, 0xE1, 0x5D, 0xB2, 0xCB, 0x72, 0x41, 0xBB, 0x79, 0xFD, 0x79, 0x7E, 0x76,
+ 0xB8, 0x81, 0x50, 0xC9, 0xC9, 0xC9, 0xC7, 0xA1, 0xEF, 0xFC, 0xBF, 0x4D, 0xC0, 0xE9, 0xC2, 0xEB, 0x62, 0x00, 0x31, 0x73,
+ 0x2C, 0x62, 0xED, 0xCE, 0xD6, 0xE3, 0xE3, 0xAA, 0x6B, 0xA8, 0x22, 0x9A, 0x4A, 0x0E, 0x2A, 0x63, 0xDA, 0xBB, 0xC4, 0x32,
+ 0xCB, 0x13, 0x33, 0xFA, 0xE9, 0x3F, 0x33, 0xDD, 0xF9, 0xFF, 0x00, 0x77, 0x0A, 0x5E, 0xEF, 0xCD, 0xD3, 0xEA, 0x7F, 0xD4,
+ 0x7C, 0x9F, 0xFD, 0x74, 0xEC, 0x2E, 0xFF, 0x00, 0xB4, 0x3E, 0x5B, 0xFE, 0x99, 0xFC, 0xF8, 0x21, 0xC6, 0x3D, 0x6D, 0xF5,
+ 0xD4, 0x6B, 0x12, 0xE0, 0xF7, 0x9F, 0xC7, 0x19, 0xF9, 0x9F, 0xD0, 0x70, 0x3D, 0xE4, 0x78, 0xB7, 0x62, 0xC4, 0xD8, 0xE3,
+ 0x46, 0xB1, 0x2E, 0x74, 0xC6, 0x07, 0xA9, 0x27, 0x61, 0xFF, 0x00, 0x5E, 0xBF, 0x97, 0x0A, 0x0B, 0xB0, 0xA8, 0x4E, 0x24,
+ 0xCF, 0x6B, 0xF0, 0x1C, 0x66, 0x2F, 0xA3, 0x49, 0x29, 0xCF, 0x53, 0x9D, 0xCE, 0xC3, 0xF9, 0x8C, 0x8C, 0x63, 0xB9, 0xCF,
+ 0xCF, 0xA7, 0x15, 0xD2, 0xC4, 0xB0, 0x66, 0xED, 0xAF, 0xDA, 0x33, 0xF0, 0xD1, 0xA4, 0x94, 0xE0, 0xC6, 0x09, 0x19, 0xEF,
+ 0xF1, 0xCF, 0x40, 0x37, 0x39, 0xEF, 0xEE, 0x00, 0xEF, 0x9E, 0x28, 0xA7, 0x98, 0x93, 0x8A, 0x5C, 0xB8, 0xBB, 0x68, 0x0B,
+ 0xE5, 0xE6, 0x02, 0x73, 0xA1, 0xB1, 0x92, 0xF3, 0x12, 0xC7, 0xCD, 0xE0, 0xF2, 0xFF, 0x00, 0x12, 0x13, 0x8E, 0x73, 0x02,
+ 0x33, 0x90, 0x49, 0x24, 0xE7, 0xA7, 0x62, 0x01, 0xF4, 0xF5, 0xF7, 0xFB, 0xC6, 0xD7, 0x05, 0x25, 0xDE, 0x98, 0x11, 0xE2,
+ 0x56, 0xE4, 0x9F, 0xEA, 0x6C, 0x5D, 0xC6, 0x0E, 0xE1, 0x03, 0x72, 0xDE, 0xD2, 0x86, 0x54, 0x3F, 0x5E, 0x5B, 0x66, 0x2D,
+ 0x9D, 0x11, 0x48, 0x69, 0x6D, 0x4B, 0xA1, 0xD6, 0x5D, 0xA1, 0x3F, 0x71, 0x26, 0x7D, 0x72, 0x45, 0x3A, 0x83, 0x42, 0x69,
+ 0x0E, 0x2B, 0xEB, 0x99, 0x14, 0x9F, 0x20, 0xD5, 0x9F, 0x78, 0xA0, 0x73, 0x08, 0x62, 0x6C, 0x98, 0x96, 0xFB, 0x0B, 0x49,
+ 0x49, 0x2E, 0x39, 0x5D, 0x79, 0x0A, 0x4C, 0x8A, 0x74, 0x75, 0xA6, 0x6F, 0x53, 0x4D, 0x45, 0x35, 0x56, 0x55, 0x5F, 0x4D,
+ 0x14, 0x91, 0x90, 0xBD, 0x56, 0x58, 0xA5, 0x64, 0x2F, 0x13, 0x53, 0x10, 0x94, 0xA2, 0x5B, 0xDE, 0x20, 0x65, 0x25, 0xB8,
+ 0xDA, 0x3C, 0xE1, 0x9E, 0xF6, 0x3C, 0xEB, 0x7B, 0xE2, 0x12, 0xE0, 0xAE, 0x4C, 0xBB, 0x63, 0x69, 0xFD, 0x7E, 0xA8, 0x2B,
+ 0x17, 0x73, 0x4F, 0x52, 0xEF, 0xFD, 0x67, 0xAA, 0x34, 0x53, 0xEC, 0xEE, 0xDE, 0xD2, 0xA9, 0x42, 0x35, 0x91, 0x60, 0xC2,
+ 0x43, 0x67, 0xCA, 0x8D, 0x6F, 0xE9, 0x75, 0x9C, 0xEA, 0x19, 0xA7, 0xD2, 0x58, 0x08, 0x8B, 0x0E, 0xA1, 0x59, 0x05, 0xB6,
+ 0x92, 0xE4, 0x26, 0xCA, 0x5F, 0xE2, 0x2A, 0x4A, 0x8D, 0xA1, 0x3A, 0x87, 0xF3, 0x37, 0x13, 0x9D, 0xC6, 0x90, 0xA6, 0x88,
+ 0xC7, 0x4E, 0xD8, 0xC8, 0x44, 0x8D, 0xFC, 0x6B, 0x31, 0x2B, 0xA9, 0x59, 0x8A, 0x6F, 0x49, 0xC8, 0x37, 0xA6, 0xD9, 0x6D,
+ 0x73, 0x37, 0xCD, 0xF5, 0x1C, 0x45, 0x8E, 0x0A, 0x53, 0xB0, 0xC7, 0xA7, 0x5C, 0x7C, 0x07, 0x73, 0xD3, 0x72, 0x06, 0xE7,
+ 0x8C, 0x02, 0x00, 0x75, 0xAE, 0x8B, 0x30, 0xDB, 0x27, 0x74, 0x8F, 0x7E, 0xD8, 0xC7, 0x7C, 0x63, 0xE5, 0xBE, 0x7D, 0x3B,
+ 0xF0, 0xF4, 0xA3, 0x16, 0x96, 0xDE, 0xBF, 0x05, 0xD6, 0x69, 0x8E, 0xDA, 0x3A, 0x0C, 0x7A, 0x63, 0x18, 0xFE, 0x3D, 0x7A,
+ 0xFC, 0x7A, 0x75, 0xE0, 0xD3, 0x44, 0x71, 0xEB, 0xF2, 0xFF, 0x00, 0x06, 0x85, 0x92, 0x94, 0x80, 0x52, 0x06, 0x33, 0xD8,
+ 0xE3, 0x62, 0x76, 0x00, 0xEF, 0xEB, 0x92, 0x08, 0xDB, 0x18, 0xC6, 0xFC, 0x1D, 0xDF, 0xF1, 0xF2, 0xC1, 0xA3, 0xE9, 0x07,
+ 0x8C, 0xE4, 0x8F, 0x1A, 0xD6, 0x5B, 0xD7, 0xCB, 0x7A, 0x5B, 0x7C, 0x51, 0x2F, 0xA9, 0x94, 0xD3, 0x5A, 0xB6, 0xDB, 0x6A,
+ 0xA3, 0x6D, 0xEA, 0x0D, 0xBA, 0x51, 0xCC, 0xDD, 0xC9, 0xA7, 0x37, 0x33, 0x02, 0x9D, 0x77, 0x52, 0x94, 0xD9, 0xCF, 0x99,
+ 0x21, 0xA8, 0x65, 0xAA, 0xCD, 0x38, 0x9C, 0x96, 0xAA, 0x94, 0x98, 0x2E, 0x36, 0x42, 0xB0, 0x41, 0x46, 0xE7, 0xE5, 0x6E,
+ 0x53, 0x52, 0x7B, 0x37, 0xA2, 0xAA, 0x5F, 0xEA, 0xA2, 0xA2, 0xE5, 0xF2, 0x24, 0xA1, 0x8B, 0x5A, 0x35, 0x8E, 0xE8, 0x81,
+ 0x58, 0xC7, 0x4A, 0x2A, 0x67, 0xA5, 0xB2, 0x72, 0x41, 0xEF, 0x36, 0x64, 0x22, 0xDC, 0xF4, 0xE3, 0x5E, 0xF5, 0x56, 0x97,
+ 0xA8, 0x7A, 0x0F, 0xA7, 0xBA, 0x69, 0xAA, 0xF5, 0x17, 0x2E, 0x7A, 0xD6, 0x94, 0x51, 0x5A, 0x57, 0x84, 0xCF, 0x12, 0xAD,
+ 0xE6, 0x74, 0x8B, 0xCF, 0x43, 0x65, 0xAD, 0xC9, 0xAD, 0xE8, 0xB5, 0xFF, 0x00, 0x3F, 0xED, 0x39, 0x32, 0x75, 0x9B, 0xED,
+ 0x2B, 0x97, 0x67, 0x48, 0x98, 0xF2, 0x9E, 0x8C, 0xA1, 0x3E, 0x88, 0x54, 0xDC, 0x5A, 0xB2, 0xD4, 0xDF, 0x66, 0xF7, 0x4B,
+ 0xB7, 0x41, 0x54, 0xA1, 0x4C, 0xEC, 0x6F, 0x12, 0x8D, 0x08, 0x7B, 0x1B, 0x93, 0x07, 0x5D, 0x17, 0xB5, 0xD7, 0x0A, 0xE4,
+ 0xBA, 0x6A, 0xEA, 0x51, 0x71, 0x68, 0xB2, 0x46, 0x4A, 0xA6, 0x2F, 0xD4, 0x5E, 0x62, 0x29, 0xC0, 0xCE, 0x39, 0xC4, 0xEB,
+ 0xEE, 0x21, 0xE7, 0x58, 0x7C, 0x25, 0xB9, 0x2C, 0x29, 0x01, 0xE4, 0xB6, 0xAF, 0x31, 0xB5, 0xA1, 0xD6, 0x5B, 0x7D, 0x89,
+ 0x11, 0xDD, 0xCE, 0x1F, 0x89, 0x36, 0x2B, 0xAC, 0x4B, 0x84, 0xF8, 0xD9, 0xE8, 0xAF, 0xB4, 0xE0, 0x09, 0x51, 0x52, 0x53,
+ 0xC6, 0xC8, 0xA6, 0x52, 0x32, 0x91, 0x7C, 0x43, 0xDB, 0xA6, 0x11, 0x89, 0x86, 0x32, 0x6A, 0x86, 0x6F, 0xCD, 0xC8, 0xE4,
+ 0xBF, 0xF8, 0x9D, 0x21, 0xE7, 0x0E, 0xCA, 0xFC, 0x32, 0x7E, 0x43, 0x39, 0x03, 0x7F, 0x4C, 0x6F, 0xC1, 0xA7, 0xAF, 0x9C,
+ 0xE7, 0xD1, 0x7F, 0x9F, 0xF3, 0xE0, 0xD1, 0xA7, 0x49, 0x78, 0x76, 0x3F, 0x0C, 0x0D, 0x8F, 0x4E, 0xE7, 0xA6, 0x7F, 0x3C,
+ 0x71, 0xA9, 0x45, 0xA7, 0xA6, 0x93, 0xBF, 0x55, 0x5C, 0x79, 0x84, 0x8F, 0xD2, 0x22, 0xFA, 0x70, 0xC3, 0x8B, 0x74, 0xFF,
+ 0x00, 0x55, 0x3C, 0xCC, 0xDA, 0x7C, 0x66, 0x7E, 0x0E, 0xB1, 0x2E, 0x93, 0xD3, 0x98, 0x9E, 0x9E, 0x9D, 0xFF, 0x00, 0xEF,
+ 0xEB, 0x9E, 0xDC, 0x28, 0x8B, 0x4D, 0x07, 0x92, 0xFE, 0x73, 0x29, 0xE0, 0xE3, 0xD1, 0xD2, 0xF5, 0x63, 0x33, 0x71, 0x23,
+ 0xBB, 0x6F, 0x89, 0x11, 0xE4, 0xC6, 0xB0, 0x53, 0xBE, 0xA4, 0x0F, 0xEB, 0x1C, 0xFC, 0x7D, 0x3F, 0xBB, 0xDF, 0xC3, 0xF5,
+ 0xAE, 0xAB, 0xD8, 0x29, 0x33, 0xE0, 0xB8, 0x3E, 0x9E, 0x9A, 0x0B, 0xC4, 0x3D, 0x44, 0x33, 0x02, 0x19, 0xF3, 0x2D, 0xBB,
+ 0xE3, 0x58, 0x17, 0x7A, 0xFD, 0xAC, 0x82, 0x31, 0xCA, 0x9D, 0x81, 0x1B, 0x77, 0xC1, 0xCF, 0xC7, 0x27, 0xBE, 0xDE, 0xA2,
+ 0x65, 0x69, 0x4A, 0x96, 0xF5, 0xD4, 0x92, 0x4C, 0x3E, 0xEA, 0x47, 0x07, 0x7E, 0xD2, 0x5A, 0x1F, 0x4B, 0xE9, 0x6B, 0x35,
+ 0x39, 0xF5, 0x7B, 0xF3, 0x82, 0x7E, 0x6E, 0x87, 0x53, 0xBD, 0x40, 0x38, 0xEF, 0x84, 0x83, 0xF8, 0x67, 0x1D, 0xF7, 0x2A,
+ 0x3B, 0xE0, 0xEC, 0x06, 0x0F, 0x14, 0x54, 0x52, 0x37, 0x73, 0x3E, 0xD3, 0xD3, 0x26, 0x15, 0x0B, 0x84, 0xCF, 0x48, 0x65,
+ 0x6F, 0xE0, 0x2D, 0x4B, 0x13, 0xDF, 0x80, 0x38, 0x26, 0xD3, 0xE8, 0x41, 0xFE, 0xAB, 0xF3, 0xA5, 0xA8, 0x4D, 0x31, 0xDA,
+ 0x52, 0xB3, 0x92, 0x90, 0x4F, 0x5E, 0xB8, 0x23, 0x60, 0x01, 0xC0, 0x1B, 0x9C, 0x67, 0xA0, 0x07, 0xD7, 0x3C, 0x65, 0x55,
+ 0x52, 0xA9, 0x61, 0x6D, 0xF0, 0xC5, 0xF3, 0x3E, 0x74, 0x99, 0x6D, 0x24, 0x2F, 0x24, 0xB1, 0x11, 0x13, 0xFC, 0xDB, 0xC5,
+ 0xB5, 0x2B, 0xE9, 0xF7, 0x8C, 0xDD, 0x2A, 0xD3, 0x6D, 0x29, 0xB5, 0xA3, 0xB9, 0x6B, 0x35, 0x50, 0xD4, 0xAB, 0x52, 0x8B,
+ 0x51, 0xA4, 0x32, 0xA9, 0x0D, 0xA5, 0xD5, 0x8A, 0xBF, 0xD6, 0xF5, 0x59, 0x8A, 0x53, 0x6D, 0xA8, 0x73, 0x07, 0x66, 0x4E,
+ 0x98, 0x5E, 0x52, 0xC2, 0x47, 0x32, 0x9D, 0xE6, 0x2A, 0x38, 0x2A, 0xE3, 0xA3, 0x6F, 0xF1, 0x9B, 0x7B, 0x7B, 0x54, 0x05,
+ 0x0B, 0xB9, 0x45, 0x31, 0x3C, 0x2F, 0x53, 0x55, 0x8C, 0x11, 0x33, 0xE7, 0xE1, 0x1A, 0xE5, 0x6B, 0xA5, 0x16, 0xAA, 0x98,
+ 0x73, 0x41, 0x6A, 0xBA, 0x85, 0xF6, 0x56, 0x66, 0x38, 0x00, 0x9F, 0x31, 0x1A, 0xAD, 0x76, 0xEC, 0xBA, 0xC5, 0x6E, 0x45,
+ 0x4E, 0xE7, 0xB8, 0xE4, 0x19, 0x97, 0x15, 0xD1, 0x55, 0xA8, 0x5C, 0x15, 0xE9, 0x4E, 0x12, 0xA5, 0xBF, 0x54, 0xAB, 0x48,
+ 0x5C, 0xB9, 0x23, 0x27, 0x7E, 0x46, 0x4A, 0x91, 0x15, 0x84, 0x92, 0x42, 0x23, 0xC7, 0x6D, 0x09, 0xC0, 0x48, 0x1C, 0x71,
+ 0x13, 0x52, 0xD6, 0xD4, 0xAD, 0x55, 0x35, 0x2C, 0xF2, 0xD9, 0xF8, 0x29, 0x7E, 0xC9, 0x6D, 0x6B, 0x45, 0x27, 0x4D, 0xFD,
+ 0xEA, 0x9E, 0xA5, 0xC5, 0xF8, 0x88, 0xEC, 0x20, 0x7A, 0x46, 0xA4, 0x58, 0xC4, 0x25, 0x03, 0x20, 0x60, 0xF5, 0xDF, 0x04,
+ 0x01, 0xD0, 0x1C, 0x7B, 0xC0, 0x3E, 0xFD, 0xB7, 0x39, 0xE2, 0xF5, 0xAF, 0x6F, 0x53, 0xCA, 0xDF, 0x1D, 0xEE, 0x73, 0xC6,
+ 0x74, 0xB7, 0x9A, 0x9E, 0xC7, 0xE3, 0x91, 0xB0, 0xEB, 0xD7, 0x23, 0x23, 0xE1, 0x8E, 0xB8, 0x1B, 0xEC, 0x78, 0x35, 0x51,
+ 0x50, 0xC9, 0xEC, 0xD2, 0xDD, 0x1A, 0x81, 0x0B, 0xC1, 0x76, 0x99, 0xC3, 0xC3, 0x3E, 0x2D, 0xAF, 0xDC, 0xE4, 0xFB, 0xC9,
+ 0xF8, 0xFE, 0x5B, 0xE4, 0xFF, 0x00, 0x0F, 0xD0, 0xD4, 0x11, 0x92, 0x61, 0xBF, 0x1D, 0xFD, 0x54, 0xC4, 0xC7, 0x97, 0x9D,
+ 0x08, 0xF9, 0xC8, 0x29, 0x39, 0xE9, 0x93, 0xF1, 0x38, 0xEF, 0x8E, 0xBD, 0x3B, 0xFE, 0x1B, 0xF0, 0x69, 0xF3, 0xFB, 0x7D,
+ 0xFD, 0xDB, 0x4C, 0xCA, 0xDB, 0x1E, 0xD2, 0xC3, 0xAD, 0xA9, 0x29, 0x21, 0x68, 0x29, 0x39, 0xDD, 0x3D, 0x30, 0x08, 0xFC,
+ 0x40, 0xEA, 0x7B, 0xE7, 0x19, 0xC7, 0x13, 0x54, 0xC4, 0x03, 0x7B, 0x4F, 0x07, 0x79, 0xD0, 0xE1, 0xF4, 0xF1, 0xFB, 0xDB,
+ 0xE7, 0x6D, 0x63, 0xA4, 0xBE, 0x26, 0xAA, 0x3A, 0x23, 0x4F, 0x9D, 0xA5, 0x5A, 0x87, 0x6C, 0x35, 0xA8, 0x5A, 0x3B, 0x50,
+ 0x96, 0xFC, 0xAA, 0x65, 0x2A, 0x7A, 0x03, 0xD2, 0xAD, 0xE7, 0x9F, 0x59, 0x5B, 0xE8, 0xA5, 0x3C, 0xBC, 0xA9, 0x84, 0xA1,
+ 0x6A, 0x52, 0xDB, 0x65, 0xA2, 0x95, 0x25, 0x2A, 0xFB, 0x00, 0xA3, 0x21, 0x1A, 0xEC, 0xFE, 0x25, 0xDA, 0x1D, 0xBA, 0xE9,
+ 0x37, 0x36, 0x97, 0xDD, 0xAB, 0xFA, 0x72, 0x4D, 0x3D, 0xBC, 0x84, 0x6B, 0x8D, 0xAC, 0xDB, 0xA8, 0x2B, 0x9E, 0x91, 0x4A,
+ 0x2B, 0xA5, 0xC1, 0x96, 0x96, 0xF7, 0x0F, 0xE9, 0x9C, 0x5A, 0x3B, 0x69, 0xC7, 0x76, 0xEA, 0x86, 0x9C, 0xDF, 0x97, 0x2D,
+ 0x1D, 0xCD, 0x2A, 0xA4, 0xD4, 0xE9, 0x56, 0xED, 0x22, 0xD3, 0x8D, 0x4A, 0x9A, 0x2A, 0x7C, 0xEA, 0x71, 0x53, 0xC5, 0x56,
+ 0xA5, 0x3A, 0x2C, 0x36, 0xDD, 0x50, 0x0A, 0x75, 0xBA, 0x5C, 0x19, 0x9E, 0xCC, 0x95, 0x9C, 0x94, 0x34, 0xA6, 0x23, 0xE7,
+ 0x91, 0x96, 0xD0, 0x95, 0xBB, 0xBB, 0x45, 0x6D, 0x3F, 0x95, 0x47, 0x48, 0x53, 0x0C, 0xCA, 0xC0, 0xA9, 0x3E, 0x93, 0x05,
+ 0xAC, 0x45, 0x38, 0x0D, 0x6F, 0x45, 0x65, 0x72, 0x53, 0x54, 0xC1, 0xEF, 0x04, 0x02, 0xB2, 0x17, 0x99, 0x7C, 0xE1, 0xBC,
+ 0xCF, 0x09, 0x37, 0x20, 0xAB, 0x24, 0x13, 0xEF, 0x38, 0xF8, 0x60, 0x0D, 0xC7, 0x4F, 0x5E, 0xBC, 0x67, 0x3C, 0xB3, 0xE9,
+ 0x09, 0x16, 0xBB, 0xCA, 0x92, 0xC4, 0xD8, 0xB7, 0x9D, 0x6A, 0x11, 0xF7, 0xF7, 0xFA, 0x69, 0x4F, 0x37, 0xDE, 0xAF, 0xC7,
+ 0xFB, 0xF8, 0xAD, 0x1A, 0x79, 0x70, 0x68, 0x71, 0x4F, 0xFB, 0xAA, 0xFF, 0x00, 0xC7, 0x58, 0xAF, 0xEE, 0x9F, 0x97, 0xEA,
+ 0x38, 0xBA, 0x32, 0xFA, 0x7E, 0xE6, 0xA7, 0x6F, 0xDD, 0xAB, 0xEF, 0x9A, 0x74, 0x81, 0xE9, 0xF3, 0x4F, 0xEA, 0x38, 0xD5,
+ 0xF7, 0x6B, 0xFF, 0x00, 0x6B, 0xF5, 0x35, 0xB5, 0x3E, 0xE5, 0x5F, 0x1F, 0xA1, 0xAC, 0x87, 0x5F, 0x92, 0xBF, 0x43, 0xC7,
+ 0x3E, 0xEF, 0xBA, 0x7F, 0xB6, 0x9F, 0xAE, 0xA7, 0x73, 0xDF, 0x3F, 0xDA, 0xFD, 0x4D, 0x0A, 0xAE, 0x87, 0xE0, 0x7F, 0x4E,
+ 0x1D, 0x7F, 0xFD, 0xDD, 0xCF, 0x53, 0xE9, 0xA2, 0xAC, 0xD7, 0xFE, 0xEA, 0x7F, 0xF0, 0xD3, 0x6A, 0xB5, 0xFE, 0x8C, 0xEF,
+ 0xF5, 0x57, 0xFA, 0x2B, 0x85, 0xA9, 0xD5, 0x23, 0xA8, 0x7F, 0xEA, 0x03, 0xDF, 0xFE, 0xF3, 0x7F, 0xDA, 0x47, 0x1C, 0xFA,
+ 0xF2, 0xEB, 0xFF, 0x00, 0xF2, 0x7F, 0xFE, 0x94, 0xFD, 0x6A, 0xD5, 0xBE, 0xB7, 0xFF, 0x00, 0xD1, 0xA3, 0x7C, 0xBF, 0x44,
+ 0xF1, 0xAD, 0x18, 0x7D, 0x7F, 0x63, 0x5E, 0x91, 0x8A, 0x3E, 0x1F, 0xF8, 0xBA, 0x7A, 0x23, 0xFF, 0x00, 0x28, 0x7F, 0x58,
+ 0xFF, 0x00, 0x1E, 0x2F, 0x5A, 0xD1, 0x97, 0xD3, 0xF7, 0x34, 0x07, 0xFE, 0xE8, 0xBF, 0xFE, 0xB0, 0xFF, 0x00, 0x88, 0x78,
+ 0x0F, 0x78, 0xFF, 0x00, 0x6D, 0x7F, 0x43, 0x58, 0xF3, 0x57, 0xAD, 0x1F, 0x53, 0x5B, 0x14, 0x7D, 0xE1, 0xF3, 0xFD, 0x0F,
+ 0x06, 0xAF, 0x49, 0xBB, 0xD1, 0x5F, 0xD6, 0x1F, 0xDB, 0x1C, 0x1A, 0x34, 0xDB, 0xA8, 0x7D, 0xC5, 0x7C, 0xBF, 0xE2, 0x0E,
+ 0x0D, 0x1A, 0xAF, 0x7A, 0x9B, 0xFE, 0xAF, 0x7F, 0xFF, 0x00, 0x99, 0xBF, 0xED, 0xAB, 0x8E, 0x63, 0x1F, 0x1A, 0xBE, 0xAE,
+ 0xB8, 0x37, 0x7D, 0xCF, 0x8D, 0x5F, 0xF9, 0x1A, 0xDB, 0x69, 0x47, 0xFA, 0xA9, 0x8F, 0xEB, 0x3B, 0xFD, 0xA5, 0x71, 0xAD,
+ 0x3E, 0xE5, 0x5F, 0x1F, 0xA1, 0xAD, 0xF6, 0x3D, 0xDA, 0x7F, 0xDB, 0xFB, 0x9A, 0x9C, 0xD9, 0xE8, 0x9F, 0x8A, 0xFF, 0x00,
+ 0x55, 0x70, 0x51, 0x93, 0xFD, 0xAF, 0xFE, 0x4E, 0xBA, 0x34, 0x4F, 0x1D, 0x9A, 0x35, 0xFF, 0xD9
+};
+
+NPT_UInt8 Platinum_120x120_png[26577] =
+{
+ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x81,
+ 0x00, 0x00, 0x00, 0x81, 0x08, 0x02, 0x00, 0x00, 0x00, 0x68, 0xC2, 0x4E, 0x07, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
+ 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC,
+ 0x61, 0x05, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00,
+ 0xFA, 0x00, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00,
+ 0x17, 0x70, 0x9C, 0xBA, 0x51, 0x3C, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x12, 0x00, 0x00,
+ 0x0B, 0x12, 0x01, 0xD2, 0xDD, 0x7E, 0xFC, 0x00, 0x00, 0x67, 0x3A, 0x49, 0x44, 0x41, 0x54, 0x78, 0x5E, 0x9D, 0xBD, 0x05,
+ 0x98, 0x9D, 0xD5, 0xD5, 0xF7, 0x3D, 0x68, 0x21, 0x68, 0x84, 0x84, 0xE8, 0x44, 0x67, 0x26, 0xE3, 0xEE, 0xEE, 0xEE, 0xEE,
+ 0x92, 0xF1, 0x89, 0x4D, 0xDC, 0x85, 0xB8, 0x13, 0x08, 0x10, 0xDC, 0xDD, 0x9D, 0x42, 0xA1, 0x58, 0xA1, 0x2D, 0xA5, 0x50,
+ 0xA1, 0x85, 0xB6, 0xB4, 0x94, 0xEA, 0x5B, 0x6F, 0xE9, 0x53, 0x8A, 0xE5, 0xFD, 0xAD, 0xBD, 0xEE, 0x7B, 0xCF, 0x3D, 0x93,
+ 0xC0, 0xF3, 0xBD, 0xDF, 0x5C, 0xFB, 0x3A, 0xD7, 0x7D, 0xCE, 0x9C, 0x39, 0x73, 0xCE, 0x92, 0xFF, 0xB2, 0xFF, 0xDE, 0xE7,
+ 0xB4, 0xC1, 0xAE, 0x61, 0x9F, 0x91, 0x9F, 0x2F, 0xB8, 0x3C, 0x71, 0xE2, 0x34, 0xCF, 0x23, 0xCE, 0xE5, 0x89, 0x13, 0x9F,
+ 0xFB, 0xF8, 0x9C, 0x3E, 0xFA, 0x99, 0x72, 0xF7, 0x8B, 0xCF, 0x4F, 0x9C, 0xE6, 0x79, 0x98, 0x3F, 0x3D, 0xED, 0x84, 0x3C,
+ 0xAC, 0xCF, 0x3C, 0x71, 0x42, 0xEE, 0x98, 0x9F, 0xD3, 0x3D, 0xD7, 0xA3, 0x7E, 0x7B, 0xDA, 0x69, 0x67, 0x98, 0x5F, 0xF1,
+ 0xA0, 0xBC, 0x10, 0xFF, 0xE8, 0xB4, 0xD3, 0x9C, 0x37, 0xA0, 0x7F, 0xA2, 0x77, 0xB9, 0xD5, 0x9F, 0xD3, 0x4F, 0x3F, 0xFD,
+ 0x8C, 0x33, 0xCE, 0xE0, 0xF6, 0xCC, 0x33, 0xCF, 0x3C, 0xFD, 0x74, 0x1F, 0xAE, 0x4F, 0x3B, 0xFD, 0xC4, 0xE9, 0xA7, 0x9D,
+ 0xC9, 0xDB, 0xFE, 0xFC, 0xF3, 0xCF, 0x4F, 0xF8, 0x7C, 0xFA, 0xF9, 0x67, 0x27, 0xBE, 0xF8, 0xE2, 0x8B, 0x13, 0x9F, 0x9D,
+ 0xF8, 0xE4, 0xF3, 0xCF, 0x7C, 0x3E, 0xFB, 0xFC, 0xD3, 0x13, 0x5F, 0xF0, 0x3A, 0x3C, 0x72, 0xFA, 0x17, 0x27, 0x3E, 0xF9,
+ 0xE2, 0x73, 0x1F, 0x9E, 0xFA, 0x85, 0xBC, 0x31, 0x1E, 0xD5, 0x77, 0x28, 0xAF, 0xEF, 0xBE, 0xB9, 0xD3, 0xCF, 0xE0, 0x21,
+ 0x7D, 0x1B, 0xCE, 0xBF, 0xE6, 0xC2, 0xF9, 0x25, 0x8F, 0x9C, 0x76, 0x1A, 0xAF, 0x63, 0x3F, 0xD8, 0xE7, 0x3C, 0xF5, 0xC4,
+ 0xC8, 0x33, 0xF5, 0x4A, 0x5F, 0xD0, 0xFE, 0xD5, 0x17, 0xA7, 0x7D, 0x71, 0x26, 0x22, 0x39, 0xF1, 0xF9, 0x17, 0x3E, 0xE6,
+ 0x53, 0xF0, 0x17, 0xA7, 0x8D, 0xFA, 0xF8, 0xF2, 0x47, 0x03, 0x9D, 0xCB, 0xCD, 0x5A, 0xCA, 0x6D, 0x7F, 0xC7, 0x32, 0xBD,
+ 0x30, 0xB7, 0x4B, 0xB9, 0xEB, 0x59, 0x4B, 0xFA, 0x3B, 0x96, 0xF4, 0xB5, 0x2F, 0x75, 0xD7, 0x62, 0xEF, 0x75, 0x6F, 0xDB,
+ 0x50, 0x6F, 0xDB, 0x12, 0x59, 0xAD, 0x4B, 0x9D, 0x8B, 0xB6, 0x25, 0x3D, 0xAD, 0x8B, 0xCD, 0x1A, 0x74, 0x2F, 0xFA, 0xB9,
+ 0xEE, 0x6E, 0x19, 0xEA, 0x6E, 0x19, 0xD0, 0xD5, 0xD5, 0xD4, 0xB7, 0xA8, 0xB9, 0x9F, 0x8B, 0x45, 0xCD, 0x83, 0x5C, 0xF4,
+ 0x34, 0xF5, 0x73, 0xAB, 0x0F, 0xEA, 0xD2, 0x6B, 0x6E, 0x79, 0x8E, 0x79, 0x9D, 0xC1, 0xBE, 0xF6, 0xC5, 0x43, 0x1D, 0x4B,
+ 0x97, 0xF4, 0xAC, 0x58, 0xDE, 0xBF, 0x7A, 0xD5, 0xE2, 0xF5, 0xEB, 0x96, 0x6F, 0xDC, 0xB0, 0x62, 0xF3, 0xDA, 0xE5, 0xEB,
+ 0xD6, 0xAF, 0xD8, 0xB0, 0x71, 0xE5, 0x96, 0xCD, 0x6B, 0xB6, 0x70, 0xBB, 0x76, 0xD9, 0x86, 0x15, 0x83, 0xAB, 0x97, 0xF5,
+ 0xAD, 0x5A, 0xBA, 0x68, 0x78, 0xA8, 0x9D, 0xB7, 0x31, 0xD8, 0xD5, 0xD2, 0xDF, 0xDD, 0xD0, 0xDB, 0x55, 0xDF, 0xD3, 0x51,
+ 0xBB, 0xA8, 0xB5, 0xB6, 0xAB, 0xB3, 0xBA, 0xAB, 0xBD, 0xBA, 0xB3, 0xAD, 0xAA, 0xA3, 0x95, 0x55, 0xD9, 0xCE, 0xAD, 0x73,
+ 0xCD, 0x05, 0x8F, 0x57, 0x77, 0xCA, 0x23, 0x35, 0xED, 0xED, 0xB5, 0x1D, 0x9D, 0xB5, 0x9D, 0xDC, 0xB6, 0xD7, 0xB6, 0xB5,
+ 0x56, 0xB7, 0xF1, 0x78, 0x4B, 0x65, 0x7B, 0x73, 0x45, 0x47, 0x73, 0x79, 0xAB, 0xAC, 0x8A, 0xB6, 0xA6, 0xF2, 0xD6, 0x86,
+ 0x92, 0xA6, 0x86, 0xD2, 0xE6, 0xC6, 0xE2, 0xA6, 0xFA, 0xA2, 0xE6, 0xFA, 0x92, 0x16, 0x59, 0xC5, 0x8D, 0x75, 0x25, 0xF5,
+ 0x75, 0xDC, 0x16, 0x37, 0xF3, 0xA0, 0x5C, 0x14, 0xD5, 0xD5, 0x16, 0x35, 0xC8, 0x2A, 0xAE, 0xAB, 0x2D, 0xAE, 0xA9, 0x29,
+ 0xAA, 0x95, 0x8B, 0xC2, 0x5A, 0x2E, 0xAA, 0x0B, 0x6B, 0x58, 0x3E, 0x56, 0xCA, 0x7C, 0x3C, 0x73, 0x2D, 0x82, 0xE6, 0xA2,
+ 0xAF, 0x6D, 0x99, 0x47, 0xCA, 0x2A, 0x7A, 0x91, 0x3B, 0x02, 0x45, 0xCA, 0x5C, 0x1B, 0xB9, 0x0F, 0x99, 0x8B, 0x25, 0x3D,
+ 0x2D, 0xA2, 0x00, 0x2B, 0x74, 0x34, 0xE1, 0x5E, 0x2F, 0xF6, 0x0A, 0x5D, 0x45, 0x6F, 0xE4, 0xDB, 0xEB, 0x15, 0xB4, 0x48,
+ 0xB9, 0xD1, 0x59, 0x9D, 0x8D, 0xBD, 0x2C, 0x1E, 0xB1, 0xCB, 0x3E, 0xB3, 0xBB, 0xCD, 0xE8, 0x60, 0xD1, 0xD2, 0xA5, 0xBD,
+ 0xC3, 0x2B, 0x87, 0xD6, 0xAC, 0x59, 0xBC, 0x76, 0x79, 0xFF, 0xCA, 0xE5, 0x03, 0xC3, 0xDB, 0x37, 0xED, 0xD8, 0xBB, 0x63,
+ 0xFF, 0xC6, 0x35, 0x9B, 0x56, 0x2E, 0x5D, 0xBD, 0x69, 0xF5, 0x66, 0xD6, 0xDA, 0x65, 0x9B, 0x56, 0x0C, 0xAD, 0x1C, 0xEE,
+ 0x5B, 0xBE, 0xA4, 0x6B, 0x79, 0x6F, 0xF3, 0x50, 0x67, 0x63, 0x7F, 0x77, 0x7D, 0x3F, 0x02, 0xED, 0xAC, 0x5D, 0xD4, 0x51,
+ 0xD3, 0xD5, 0x52, 0xD3, 0xD9, 0x54, 0xD5, 0x8E, 0xF4, 0x8D, 0x4C, 0xDB, 0x74, 0x71, 0xCD, 0x72, 0x54, 0x62, 0x14, 0xC0,
+ 0xEA, 0xA8, 0xEB, 0x64, 0x71, 0x81, 0x4A, 0x58, 0xAD, 0x95, 0x22, 0xFD, 0xA6, 0xB2, 0x16, 0x56, 0x23, 0xA2, 0x2F, 0x6D,
+ 0x46, 0x07, 0x35, 0x25, 0x8D, 0xC8, 0xBD, 0xBE, 0xB8, 0x5E, 0x44, 0xAF, 0xD2, 0x97, 0x8B, 0x5A, 0x11, 0x7A, 0x61, 0xBD,
+ 0x91, 0x7B, 0x9D, 0xC8, 0xDD, 0x08, 0xBD, 0xA6, 0xA8, 0x1A, 0xA1, 0x9B, 0x0B, 0xD1, 0x04, 0xD7, 0x55, 0x05, 0xD5, 0xA2,
+ 0x83, 0xD1, 0xD6, 0x8D, 0xA0, 0x47, 0xD9, 0xB8, 0x2B, 0x6E, 0xA4, 0x3C, 0x60, 0x6C, 0x5C, 0x44, 0xCF, 0xF2, 0x18, 0xF8,
+ 0x20, 0x3A, 0xB0, 0xA6, 0x6A, 0x04, 0x3D, 0x62, 0xEC, 0x6A, 0xE3, 0x1E, 0x89, 0x0F, 0xA8, 0xB8, 0x8D, 0x88, 0x7B, 0x54,
+ 0xD0, 0x56, 0xEE, 0x8B, 0x1A, 0x44, 0x01, 0xCE, 0xDD, 0xFA, 0x1E, 0xBD, 0xCB, 0xDF, 0x1A, 0xAD, 0xF4, 0x74, 0xB6, 0x0D,
+ 0x0C, 0xB6, 0x0D, 0x2E, 0x59, 0xB4, 0x74, 0x59, 0xDF, 0x8A, 0x95, 0x03, 0x2B, 0x10, 0xF1, 0x65, 0x5B, 0x77, 0xBF, 0xFD,
+ 0xFD, 0x1F, 0xFC, 0xF5, 0xAF, 0x7F, 0xFD, 0xC7, 0x3F, 0xFE, 0xF5, 0xBB, 0xDF, 0xFC, 0xFE, 0x89, 0x47, 0x9F, 0xD9, 0xB8,
+ 0x6A, 0xD3, 0x86, 0xE5, 0xEB, 0x37, 0xAC, 0xDE, 0x24, 0xDE, 0x80, 0x86, 0xBA, 0x97, 0x0F, 0x76, 0x0C, 0xC9, 0x7F, 0x6F,
+ 0xEC, 0xEE, 0xAC, 0xEB, 0x6E, 0xAF, 0xE9, 0x62, 0x61, 0xE6, 0x22, 0x71, 0x0C, 0xB9, 0xCA, 0x51, 0x03, 0x16, 0x6D, 0xD5,
+ 0xA0, 0x1E, 0xA0, 0xD2, 0x6F, 0xAB, 0xEB, 0xEC, 0xAA, 0xEB, 0x52, 0x7D, 0xB4, 0x57, 0xB7, 0xB7, 0x55, 0xA1, 0xAD, 0x8E,
+ 0xA6, 0xB2, 0x26, 0x91, 0x7E, 0x29, 0x86, 0xDF, 0xC4, 0x32, 0x26, 0x2F, 0x6A, 0x40, 0xE8, 0xAA, 0x00, 0x84, 0x6B, 0x6F,
+ 0xAB, 0x8A, 0xB8, 0x5B, 0x53, 0x57, 0xE4, 0xC8, 0x5D, 0x0D, 0x5F, 0x17, 0xD2, 0x67, 0x95, 0xE7, 0x57, 0xF9, 0x9C, 0x6C,
+ 0xEC, 0x16, 0x4C, 0xDC, 0x8B, 0x21, 0x35, 0x73, 0x5D, 0x2E, 0xBC, 0x38, 0x08, 0x83, 0x88, 0x79, 0x44, 0x85, 0xBE, 0xA8,
+ 0x55, 0x16, 0xD7, 0x8A, 0x30, 0xAE, 0xC9, 0xA3, 0x83, 0x41, 0x8B, 0x30, 0x5E, 0xA1, 0x5B, 0x89, 0x77, 0x34, 0xF4, 0xE8,
+ 0x42, 0xD6, 0xDC, 0xB6, 0xD7, 0x77, 0xEB, 0x6D, 0x5B, 0xDD, 0x22, 0x7D, 0x1C, 0x18, 0xE1, 0x57, 0x3D, 0xCD, 0xBD, 0x03,
+ 0xED, 0xFD, 0xE8, 0x60, 0x71, 0xD7, 0x92, 0x65, 0x3D, 0x4B, 0xB6, 0xAE, 0xDB, 0xF6, 0xA7, 0x3F, 0xFE, 0x19, 0x3C, 0xFD,
+ 0xF8, 0xE3, 0xFF, 0xF9, 0xF8, 0xE3, 0x8F, 0x3F, 0xFB, 0xE4, 0x53, 0xAE, 0x7F, 0xFA, 0xD3, 0xF7, 0xB6, 0xAC, 0xDF, 0xB6,
+ 0x6E, 0x78, 0x3D, 0xE8, 0xB4, 0x7A, 0x68, 0xE5, 0xD2, 0xEE, 0x25, 0xFC, 0x49, 0x37, 0xCA, 0x6E, 0x10, 0x90, 0xE9, 0xA8,
+ 0x12, 0x08, 0x72, 0xCC, 0xBF, 0xBC, 0xB5, 0xB1, 0xB2, 0x4D, 0x8C, 0x1A, 0xD3, 0x36, 0xF0, 0x82, 0x56, 0x5A, 0xAA, 0x5A,
+ 0x81, 0x9D, 0x96, 0xDA, 0xD6, 0x8E, 0x1A, 0x11, 0x7A, 0x43, 0x59, 0x63, 0x59, 0x4E, 0x79, 0x43, 0x49, 0x43, 0x73, 0x65,
+ 0x8B, 0xFE, 0x8A, 0x67, 0x36, 0x96, 0x37, 0x18, 0xD8, 0x71, 0xA4, 0x8F, 0x2B, 0xA8, 0xB1, 0x8B, 0xBD, 0x1B, 0x05, 0x28,
+ 0xE6, 0x00, 0x41, 0x18, 0x7B, 0x15, 0xAB, 0xA0, 0x5A, 0x0C, 0xBF, 0x60, 0x44, 0xF4, 0x95, 0xF9, 0x55, 0x15, 0x46, 0x01,
+ 0x5C, 0x8C, 0xE8, 0xC0, 0x35, 0x70, 0x31, 0xF3, 0x93, 0x70, 0x5C, 0x80, 0xB8, 0xA7, 0x55, 0xD0, 0xDC, 0x8A, 0x5B, 0x44,
+ 0xDC, 0xAC, 0xA2, 0x47, 0xE2, 0x6A, 0xE9, 0x22, 0x68, 0x90, 0x57, 0xEF, 0x8E, 0x11, 0x7A, 0x57, 0x93, 0xA0, 0x7F, 0x27,
+ 0xC6, 0xE8, 0x9A, 0xB9, 0x88, 0xBB, 0xA9, 0xDF, 0x4A, 0x7F, 0x94, 0xE8, 0x1B, 0xBA, 0xDB, 0x1A, 0xBA, 0x55, 0x07, 0xBA,
+ 0xC0, 0xF1, 0x45, 0xA2, 0x86, 0xEE, 0xFE, 0xB6, 0x3E, 0x64, 0x3A, 0xD0, 0x3E, 0xB8, 0xAC, 0x67, 0xE9, 0x83, 0xF7, 0x3C,
+ 0x84, 0xD0, 0x3F, 0xFA, 0xE8, 0xA3, 0xFF, 0x9A, 0x1F, 0x34, 0xF1, 0xEF, 0x7F, 0xFF, 0x9B, 0x47, 0x5E, 0x7F, 0xFD, 0x3B,
+ 0xAB, 0x96, 0xAD, 0x5E, 0xBB, 0x62, 0xDD, 0xAA, 0x25, 0xAB, 0x89, 0x1C, 0x3C, 0x19, 0x1D, 0x88, 0x21, 0xE3, 0x01, 0x2E,
+ 0xFE, 0x08, 0x94, 0x03, 0x26, 0x8A, 0x2A, 0xEE, 0x6A, 0xA9, 0x40, 0xD0, 0xCD, 0x66, 0xB5, 0x36, 0x54, 0x36, 0x56, 0xE6,
+ 0x56, 0x82, 0x30, 0x9B, 0x56, 0x6D, 0x6D, 0xAA, 0x68, 0xAE, 0xC8, 0x29, 0xAB, 0x2F, 0xAD, 0xE3, 0xA2, 0xB9, 0x5C, 0xF0,
+ 0xA7, 0xA1, 0x44, 0x2C, 0xDD, 0x2E, 0x47, 0xE8, 0xE0, 0x4F, 0x71, 0x8D, 0x62, 0xBD, 0xEA, 0x80, 0x0B, 0x07, 0x79, 0x8C,
+ 0x02, 0x44, 0xE2, 0x85, 0xD5, 0x48, 0x9F, 0x8B, 0xAA, 0xDC, 0x72, 0x75, 0x02, 0xAE, 0x7D, 0x8C, 0x69, 0xAB, 0x94, 0x91,
+ 0x29, 0xA1, 0x4F, 0x03, 0xA9, 0x77, 0x11, 0x48, 0x35, 0x8A, 0x8A, 0xC4, 0xDD, 0xA5, 0x81, 0x54, 0x6D, 0x7C, 0x00, 0xC0,
+ 0x15, 0x87, 0x68, 0x32, 0x16, 0x27, 0xF0, 0x22, 0x12, 0x77, 0x4D, 0x1E, 0xB9, 0xA3, 0x12, 0x9E, 0x03, 0xB0, 0x88, 0x0E,
+ 0x3C, 0x72, 0xEF, 0x43, 0xD0, 0xBA, 0xC4, 0x09, 0xEA, 0x44, 0xE8, 0xC4, 0x4C, 0x15, 0x3A, 0xC0, 0xDD, 0x55, 0x23, 0xB7,
+ 0xD8, 0x2F, 0xE2, 0x13, 0x28, 0x6F, 0xEC, 0xC4, 0x15, 0x3A, 0xEB, 0xDB, 0xB1, 0xEE, 0x25, 0x3D, 0xCB, 0x1F, 0x7D, 0xE8,
+ 0x49, 0x72, 0x9B, 0x4F, 0x3E, 0xF9, 0xF8, 0x33, 0x7E, 0xBE, 0xF8, 0x94, 0x9B, 0x4F, 0x3F, 0xFD, 0x54, 0x7D, 0xE2, 0xD8,
+ 0xA1, 0x63, 0xC3, 0x83, 0x2B, 0x56, 0x2E, 0x5E, 0x45, 0xE4, 0x40, 0x07, 0xBD, 0x4D, 0xFC, 0x95, 0x04, 0xDE, 0x96, 0xF2,
+ 0x0E, 0x81, 0x20, 0x83, 0xE9, 0x88, 0x1E, 0x35, 0xA8, 0x26, 0x04, 0x58, 0x4A, 0x1B, 0x1A, 0x4A, 0xB1, 0xF1, 0xA6, 0xA6,
+ 0x8A, 0x46, 0x2C, 0xBD, 0x32, 0xBF, 0xA2, 0x2A, 0xAF, 0xEA, 0x95, 0x97, 0x5F, 0xFF, 0xE4, 0xD3, 0xCF, 0xBF, 0xF3, 0xFA,
+ 0xF7, 0xEA, 0x0B, 0xEB, 0xCA, 0x73, 0x51, 0x43, 0x43, 0x63, 0xA9, 0x22, 0x4F, 0xAD, 0xA2, 0x8D, 0x22, 0xBB, 0x77, 0x21,
+ 0x6B, 0xD1, 0x41, 0x51, 0x03, 0x1E, 0x50, 0x59, 0x58, 0x83, 0xD0, 0xB9, 0x15, 0xA1, 0x1B, 0xD1, 0xEB, 0x05, 0xA2, 0xAF,
+ 0xC8, 0x2B, 0xE7, 0xB6, 0x34, 0x97, 0x8B, 0x4A, 0x1F, 0xD7, 0xC0, 0x55, 0x0D, 0x62, 0xEF, 0xAE, 0x75, 0x0B, 0x88, 0x8F,
+ 0x81, 0x14, 0x2B, 0x77, 0x0B, 0x2F, 0x08, 0x57, 0xD5, 0xC0, 0x12, 0xA0, 0x57, 0x40, 0x6F, 0x50, 0x89, 0xCB, 0x52, 0x84,
+ 0x41, 0x0D, 0x1D, 0x0D, 0x7D, 0xAC, 0xF6, 0xFA, 0xDE, 0xF6, 0xC6, 0x1E, 0x59, 0x22, 0xFA, 0x5E, 0xAF, 0xB1, 0xB7, 0xD5,
+ 0xF5, 0x38, 0x78, 0x5D, 0x2B, 0xA8, 0x8D, 0xC8, 0x24, 0x7B, 0x71, 0x17, 0x20, 0xDE, 0x51, 0xD7, 0xBE, 0xA8, 0xBE, 0x13,
+ 0x1B, 0x5C, 0xBD, 0x74, 0xCD, 0x40, 0xD7, 0xE0, 0xD5, 0x57, 0x5E, 0xF7, 0xD1, 0x47, 0xFF, 0x83, 0xE1, 0x93, 0x91, 0x92,
+ 0x32, 0x92, 0x98, 0xF2, 0xF3, 0xDF, 0x4F, 0x3F, 0xE6, 0x91, 0x27, 0x1F, 0x7F, 0x6A, 0xD5, 0xE0, 0xCA, 0x15, 0xFD, 0xC3,
+ 0xC3, 0x3D, 0xCB, 0xAC, 0x1F, 0x34, 0x55, 0x99, 0x64, 0x46, 0xAD, 0xDE, 0x44, 0x54, 0xF0, 0x44, 0x61, 0xBD, 0xAE, 0x08,
+ 0x78, 0x01, 0xDC, 0x5B, 0x54, 0xCA, 0x35, 0x05, 0x55, 0x39, 0x89, 0x99, 0x5B, 0xD6, 0x6F, 0xFD, 0xF8, 0xE3, 0x4F, 0x7E,
+ 0xFD, 0xC1, 0x2F, 0xFF, 0xF5, 0xAF, 0x7F, 0xAD, 0xE8, 0x5D, 0x9E, 0x97, 0x92, 0x5B, 0x99, 0x5B, 0x2E, 0xD6, 0xED, 0xE2,
+ 0x8C, 0x57, 0xF4, 0x6A, 0xF2, 0xDE, 0x05, 0xF8, 0x38, 0x26, 0x5F, 0x50, 0x5D, 0x9D, 0x2F, 0xE6, 0x2F, 0x2B, 0xAF, 0x52,
+ 0x6D, 0xBF, 0x22, 0x47, 0xA4, 0x5F, 0x9A, 0x5B, 0x51, 0x96, 0x5F, 0xEE, 0xA3, 0x06, 0x6E, 0x70, 0x7C, 0xA0, 0xB7, 0x59,
+ 0x96, 0x1B, 0x3F, 0xC5, 0xC6, 0x7B, 0x9A, 0x9C, 0x88, 0xDA, 0xD5, 0x32, 0xD8, 0xD5, 0x28, 0xB2, 0x36, 0x38, 0x23, 0x86,
+ 0xEF, 0x45, 0x76, 0xEE, 0x9A, 0xD5, 0xAB, 0x10, 0x6F, 0x2D, 0x5D, 0xD2, 0x41, 0x01, 0xF4, 0xBE, 0xF6, 0x46, 0x16, 0x96,
+ 0x8E, 0xD0, 0xE5, 0xB7, 0x22, 0x6E, 0x03, 0x35, 0x6A, 0xF5, 0x8E, 0xED, 0x9B, 0x80, 0xA9, 0x56, 0x6F, 0x45, 0xAF, 0xD8,
+ 0x8D, 0xF1, 0x72, 0xDB, 0x56, 0x25, 0x58, 0x51, 0x95, 0x57, 0xB1, 0x61, 0xD5, 0xB6, 0xDE, 0xF6, 0xBE, 0x0D, 0x2B, 0x37,
+ 0x7E, 0xF7, 0x3B, 0xDF, 0xD7, 0x4C, 0x1C, 0x1D, 0x98, 0x1F, 0x71, 0x09, 0x94, 0xF2, 0xE6, 0xF7, 0x7E, 0xB0, 0x7E, 0xD9,
+ 0x3A, 0xF0, 0x6A, 0x69, 0xE7, 0x50, 0x7F, 0x4B, 0x2F, 0xC1, 0xA0, 0xB5, 0xBA, 0x45, 0xA0, 0xA6, 0xCC, 0x11, 0xBD, 0xEB,
+ 0x04, 0x24, 0x97, 0x0D, 0x62, 0xD1, 0xE8, 0xA0, 0xD8, 0x81, 0x72, 0xA4, 0x5C, 0x9A, 0x59, 0x9C, 0x1D, 0x9F, 0x79, 0x60,
+ 0xF7, 0x21, 0x20, 0xEE, 0x9F, 0x7F, 0xFF, 0xC7, 0xCF, 0xDE, 0xFB, 0x65, 0x73, 0x4D, 0x4B, 0x61, 0x7A, 0x41, 0x49, 0x7A,
+ 0x21, 0xD2, 0x44, 0x43, 0x55, 0x05, 0x95, 0x1A, 0x51, 0x59, 0x56, 0xEE, 0xD8, 0x3B, 0x77, 0x55, 0xD6, 0xF6, 0xB7, 0x62,
+ 0xF5, 0x05, 0x15, 0x88, 0xBB, 0x4C, 0xA4, 0x5F, 0x63, 0x56, 0x15, 0x72, 0xE7, 0xAE, 0xAC, 0xFC, 0xF2, 0xD2, 0xBC, 0x32,
+ 0x1F, 0x91, 0x69, 0x8B, 0x23, 0xE8, 0xCE, 0x66, 0x81, 0x91, 0xEE, 0x16, 0xCD, 0xCA, 0x07, 0x10, 0x7A, 0x67, 0xB3, 0xA0,
+ 0x8A, 0x49, 0x63, 0xC4, 0xD2, 0x55, 0xD0, 0x8E, 0x81, 0x37, 0x01, 0xE8, 0xB2, 0xAC, 0xBD, 0x7B, 0xC1, 0xDD, 0xB9, 0xAE,
+ 0x5D, 0xA4, 0xF6, 0x0E, 0xBE, 0x1B, 0x84, 0x21, 0x43, 0x97, 0x24, 0x1D, 0x84, 0xC1, 0xC6, 0x2D, 0xCE, 0xA8, 0xC4, 0x35,
+ 0x63, 0x91, 0xA4, 0xA5, 0x46, 0x32, 0x74, 0xC1, 0x6E, 0xC5, 0x0D, 0x85, 0x8E, 0xF2, 0x06, 0x56, 0x43, 0x59, 0x7D, 0x51,
+ 0x7A, 0xFE, 0xA6, 0x35, 0x97, 0x2D, 0xEE, 0x5E, 0xD6, 0xDF, 0xD6, 0x7B, 0xFD, 0xD5, 0x37, 0x7E, 0xF8, 0xE1, 0x6F, 0xAD,
+ 0x0E, 0xB8, 0x30, 0x3A, 0x38, 0xF1, 0xEE, 0xBB, 0x3F, 0xDB, 0xB4, 0x62, 0x23, 0x90, 0xD5, 0xD3, 0xB8, 0xA8, 0xB7, 0xA5,
+ 0x07, 0x07, 0x22, 0xA8, 0x36, 0x95, 0xB6, 0x39, 0xC9, 0x4C, 0xA9, 0xC8, 0x1D, 0x93, 0x37, 0x90, 0x22, 0x08, 0x6E, 0x53,
+ 0x75, 0x8C, 0x97, 0x30, 0x90, 0x9B, 0x98, 0x5B, 0x94, 0x56, 0x84, 0xF2, 0xBE, 0xFB, 0x9D, 0xB7, 0xBE, 0xF3, 0xDA, 0x9B,
+ 0x3B, 0xB7, 0xEE, 0xCE, 0x49, 0xCA, 0xE6, 0xF1, 0x9C, 0xB8, 0xEC, 0x8A, 0x9C, 0x8A, 0xCA, 0xFC, 0x72, 0xC4, 0x6A, 0x64,
+ 0x2A, 0x11, 0x55, 0xE3, 0xAA, 0x48, 0x56, 0x1F, 0x01, 0x7C, 0x3C, 0xC8, 0xC3, 0x23, 0xAA, 0x18, 0x15, 0xBA, 0xFC, 0x21,
+ 0x0A, 0x30, 0xA2, 0x2F, 0xC9, 0x2D, 0x2D, 0xC9, 0x2D, 0xC1, 0x15, 0xC4, 0x0F, 0x14, 0x73, 0x3C, 0x08, 0x3E, 0x92, 0x20,
+ 0x1A, 0xAD, 0x38, 0xB9, 0xA3, 0xCA, 0x1A, 0x4B, 0x17, 0xD1, 0x9B, 0x74, 0xA5, 0xB5, 0xC9, 0xC9, 0x67, 0xD4, 0xDE, 0x15,
+ 0xD9, 0x91, 0xB5, 0x45, 0xF9, 0x96, 0xC6, 0x91, 0xE8, 0x8A, 0xE8, 0x91, 0xB2, 0x73, 0x6B, 0x92, 0x74, 0x91, 0xBB, 0x5B,
+ 0x13, 0x8D, 0x14, 0x4D, 0x9A, 0x38, 0x1A, 0xF3, 0x37, 0xE9, 0x4A, 0x33, 0xB9, 0x20, 0xF9, 0x09, 0x21, 0x11, 0xC1, 0x55,
+ 0x17, 0x56, 0x65, 0xC6, 0xA5, 0xE1, 0x07, 0x9B, 0xD6, 0x6C, 0x5B, 0xD4, 0xD2, 0xBD, 0x71, 0xD5, 0xC6, 0x47, 0x1F, 0x78,
+ 0xEC, 0xFF, 0xFC, 0xF1, 0xAF, 0x56, 0x0D, 0x9F, 0x7D, 0xF6, 0x09, 0xD7, 0xEF, 0xFC, 0xE8, 0xDD, 0x75, 0x2B, 0x37, 0x90,
+ 0xBC, 0x52, 0x5E, 0x2D, 0x6A, 0x44, 0xDF, 0x02, 0xF4, 0x0A, 0xFA, 0x9A, 0xBC, 0x4B, 0xFE, 0x6E, 0x93, 0x99, 0x42, 0x5E,
+ 0x56, 0xCC, 0x53, 0x05, 0x84, 0x13, 0xA4, 0x45, 0xA4, 0x22, 0xC7, 0xCC, 0x98, 0xB4, 0xE1, 0xBE, 0x15, 0x4B, 0xBB, 0x97,
+ 0x25, 0x87, 0x25, 0x94, 0x67, 0x96, 0x15, 0xA7, 0x17, 0x67, 0xC4, 0xA4, 0x89, 0xEC, 0xF2, 0x4B, 0x49, 0x96, 0x14, 0x46,
+ 0x54, 0xFA, 0xE5, 0x5C, 0x17, 0x38, 0x9A, 0x50, 0xD0, 0xAF, 0xC8, 0x15, 0xA1, 0x03, 0xF7, 0xDC, 0x12, 0x5A, 0x04, 0x76,
+ 0xF2, 0xCA, 0xCC, 0x23, 0x15, 0xBA, 0xE4, 0x3A, 0xAF, 0x4C, 0x97, 0x8F, 0x06, 0x4C, 0x37, 0x8A, 0x5A, 0x1C, 0x17, 0x7B,
+ 0x17, 0x28, 0x6F, 0x76, 0x14, 0xE0, 0xDA, 0xB8, 0x44, 0x51, 0x27, 0x5F, 0x6C, 0x02, 0xDF, 0x47, 0x44, 0xAF, 0xD2, 0x27,
+ 0x72, 0x4A, 0xF0, 0xAC, 0x75, 0xF2, 0x19, 0x1B, 0x5D, 0x15, 0xE8, 0xB5, 0x4C, 0xB5, 0xD7, 0xAA, 0x06, 0xC1, 0xFD, 0x4A,
+ 0x53, 0xB2, 0xAA, 0x13, 0xB8, 0x15, 0x93, 0x93, 0xBA, 0x20, 0xBB, 0x32, 0x6C, 0xD6, 0xC9, 0x31, 0x30, 0xC6, 0x84, 0xD0,
+ 0xD8, 0xA1, 0x9E, 0x65, 0xFB, 0x76, 0x5D, 0x49, 0x48, 0x18, 0x68, 0xEF, 0xDB, 0xB6, 0x65, 0xC7, 0x73, 0xCF, 0x7C, 0xF3,
+ 0xAF, 0x7F, 0xFD, 0xFB, 0x17, 0x9F, 0x7D, 0x2E, 0x2D, 0x8A, 0x13, 0x9F, 0x7F, 0xF2, 0xC9, 0x27, 0x18, 0xEF, 0xEA, 0xA1,
+ 0x55, 0x4B, 0xFB, 0x96, 0xF1, 0x87, 0x24, 0xF5, 0x2D, 0x15, 0x64, 0xF4, 0x1A, 0x48, 0x9D, 0x58, 0x2A, 0x17, 0x45, 0x75,
+ 0x26, 0x7D, 0x74, 0x92, 0x74, 0x63, 0x9B, 0xA5, 0xC5, 0x39, 0x25, 0x05, 0x69, 0xF9, 0xF1, 0x21, 0x31, 0xD5, 0x25, 0x35,
+ 0xF1, 0x81, 0x71, 0xC9, 0x11, 0x71, 0x71, 0xC1, 0xD1, 0xE1, 0x73, 0xC3, 0xF8, 0xA4, 0x49, 0x61, 0x09, 0x19, 0x71, 0x69,
+ 0x85, 0x59, 0x45, 0xC5, 0x3C, 0x2D, 0xAF, 0x54, 0xC4, 0x87, 0x34, 0x91, 0x2C, 0x7F, 0x68, 0x64, 0x6A, 0x57, 0x69, 0x81,
+ 0xA3, 0x1B, 0x07, 0x6D, 0x0A, 0x0C, 0xF2, 0xE4, 0x97, 0x97, 0xE4, 0xC8, 0x73, 0xB0, 0xFD, 0xB2, 0x7C, 0x44, 0x2F, 0xAF,
+ 0xA0, 0xAE, 0x80, 0x0E, 0x24, 0x60, 0x7A, 0x03, 0x29, 0xF0, 0xED, 0x86, 0x50, 0x8F, 0x99, 0x1B, 0x54, 0x31, 0xC6, 0x2E,
+ 0x98, 0x2E, 0x12, 0x17, 0x78, 0x11, 0x64, 0x57, 0x34, 0xB7, 0x0A, 0x50, 0x1D, 0x88, 0xB8, 0xEB, 0x47, 0x24, 0x2E, 0x0A,
+ 0x30, 0xF8, 0x63, 0xB1, 0x9E, 0x6B, 0x2B, 0x77, 0xA7, 0x68, 0x32, 0xE0, 0x63, 0x93, 0x77, 0x0D, 0x9E, 0x6A, 0xB9, 0x54,
+ 0x3A, 0x82, 0xB0, 0x79, 0x15, 0x65, 0x59, 0x65, 0xB1, 0x81, 0xD1, 0xA4, 0x28, 0x57, 0x5C, 0x71, 0xD3, 0x9A, 0xE5, 0x9B,
+ 0x86, 0xBA, 0x17, 0x53, 0x27, 0x5F, 0xB1, 0xF7, 0xE8, 0x37, 0xBE, 0xFE, 0xE2, 0x07, 0xBF, 0xFA, 0x2D, 0xB9, 0xE9, 0xFF,
+ 0xFC, 0xCF, 0xC7, 0xBF, 0xFF, 0xDD, 0x9F, 0x9E, 0x79, 0xF2, 0x1B, 0x43, 0x9D, 0x03, 0xCB, 0x7B, 0x97, 0x01, 0xDF, 0x88,
+ 0x9E, 0xD5, 0x50, 0x54, 0xAF, 0x21, 0x14, 0x4F, 0x92, 0x34, 0xB1, 0xD8, 0xA4, 0x8F, 0x05, 0x92, 0xB6, 0x0B, 0x50, 0x28,
+ 0x38, 0xE4, 0x94, 0x23, 0xE2, 0xFC, 0xD4, 0xDC, 0xA8, 0x85, 0x11, 0x35, 0xA5, 0xB5, 0xC9, 0x91, 0x49, 0x41, 0x73, 0x16,
+ 0x06, 0xCD, 0xF5, 0xCF, 0x4E, 0xCB, 0x69, 0xAE, 0x6D, 0x0F, 0x99, 0x17, 0x94, 0x9E, 0x94, 0x99, 0x9F, 0x51, 0x50, 0x94,
+ 0x5D, 0x8C, 0xAA, 0x10, 0x9F, 0x5A, 0xB1, 0x60, 0x3D, 0x0E, 0xA1, 0xA6, 0xAD, 0xCA, 0x70, 0xD0, 0xA6, 0xD4, 0x5C, 0x94,
+ 0xF1, 0x64, 0xF1, 0x1B, 0xD7, 0xEA, 0xF5, 0x42, 0x5F, 0x41, 0x97, 0x8F, 0xD8, 0x72, 0x7D, 0xBF, 0x09, 0x95, 0x5E, 0xBB,
+ 0x16, 0x29, 0x8B, 0xD0, 0x6B, 0x25, 0x90, 0xB2, 0xD4, 0xB4, 0x79, 0x04, 0xC9, 0x5A, 0x4B, 0x57, 0x59, 0x93, 0x53, 0xEA,
+ 0x85, 0x00, 0x7A, 0xAD, 0x80, 0x8C, 0x37, 0xBD, 0x91, 0xDE, 0x8B, 0x27, 0xB7, 0xD1, 0xCE, 0x8C, 0x74, 0x05, 0xAC, 0xE1,
+ 0x1B, 0xE4, 0xB1, 0x6D, 0x03, 0x9B, 0xAD, 0x6B, 0xE2, 0x48, 0x22, 0x08, 0x68, 0x20, 0x26, 0x80, 0xA2, 0x24, 0xBF, 0xAC,
+ 0x28, 0xA3, 0x30, 0x29, 0x34, 0x3E, 0xDA, 0x3F, 0x62, 0xFF, 0x9E, 0xCB, 0xF7, 0xEE, 0xBA, 0x7C, 0xE5, 0xD0, 0xBA, 0x81,
+ 0xCE, 0xC5, 0xAB, 0x97, 0xAC, 0x3B, 0x76, 0xE4, 0xEA, 0x67, 0x9E, 0x7E, 0xFE, 0xC7, 0x3F, 0x7A, 0xF7, 0x67, 0x3F, 0xFD,
+ 0xE5, 0x9B, 0xDF, 0xFB, 0xE1, 0x6D, 0xB7, 0xDF, 0xD3, 0xD5, 0xD0, 0x31, 0xD8, 0xB5, 0xA4, 0x32, 0xBB, 0xA2, 0x3C, 0xBB,
+ 0xB4, 0x26, 0xBF, 0xB2, 0xA2, 0xB0, 0xD2, 0x80, 0x72, 0x75, 0x65, 0x5E, 0x0D, 0xC1, 0x53, 0x32, 0x16, 0x7A, 0x06, 0x46,
+ 0x01, 0x0E, 0x04, 0x19, 0xB9, 0xA0, 0x83, 0x9C, 0xD4, 0xDC, 0x08, 0xFF, 0x30, 0x55, 0x49, 0xD8, 0x82, 0x90, 0xE8, 0x90,
+ 0x68, 0x3A, 0x2B, 0xD9, 0x29, 0xD9, 0x21, 0xFE, 0x41, 0x59, 0xC9, 0xD9, 0x79, 0xE9, 0xF9, 0x04, 0x67, 0xD4, 0x60, 0x25,
+ 0x68, 0xF5, 0x67, 0x3D, 0xC3, 0xB9, 0x50, 0xD8, 0xF1, 0x88, 0xDE, 0xF9, 0x93, 0x9C, 0x72, 0xFB, 0xB7, 0x38, 0x01, 0xFF,
+ 0x14, 0x1D, 0x48, 0xCA, 0x28, 0x9A, 0x68, 0x12, 0x4D, 0x18, 0x03, 0xEF, 0x6D, 0xAB, 0xD5, 0x28, 0xDA, 0xD9, 0x59, 0xDF,
+ 0x85, 0x88, 0xAD, 0x94, 0x55, 0xD0, 0xDA, 0x75, 0x41, 0xDC, 0x0A, 0x2C, 0xA3, 0xA4, 0x6F, 0x2C, 0x5D, 0xEC, 0x7D, 0x74,
+ 0x5A, 0x89, 0xC4, 0x9B, 0xAB, 0x65, 0x61, 0xE9, 0x9A, 0x74, 0x6A, 0xB9, 0xC4, 0xF5, 0x48, 0xC7, 0xA6, 0xA2, 0xCD, 0x2A,
+ 0xA0, 0xAE, 0xAC, 0xD9, 0xC4, 0x00, 0xE9, 0x73, 0x49, 0x96, 0x6D, 0x90, 0x9A, 0x77, 0x8C, 0x08, 0xD2, 0x62, 0x52, 0xE7,
+ 0x4C, 0x9A, 0x35, 0xB0, 0x68, 0xC9, 0xD1, 0x23, 0xD7, 0x11, 0x9C, 0x07, 0x16, 0x2D, 0xA3, 0x8D, 0xB1, 0x6E, 0x78, 0x1D,
+ 0xA9, 0xEA, 0xE3, 0x8F, 0x3D, 0x83, 0x43, 0xD0, 0xB1, 0x38, 0x72, 0xF0, 0xAA, 0xFA, 0xA2, 0x1A, 0x92, 0x8B, 0xD2, 0xAC,
+ 0xA2, 0xBC, 0x84, 0x5C, 0x92, 0x71, 0x1B, 0x09, 0x79, 0xA9, 0xF2, 0xA2, 0x0A, 0xCD, 0xD6, 0x35, 0x69, 0x51, 0x21, 0x96,
+ 0xE5, 0x94, 0x22, 0x59, 0xCC, 0x3C, 0x27, 0x35, 0x27, 0x32, 0x38, 0x3C, 0x2D, 0x3E, 0x9D, 0x4F, 0x17, 0x1F, 0x11, 0x5F,
+ 0x94, 0x5B, 0xD2, 0xD3, 0x3E, 0xB4, 0x70, 0xDE, 0x82, 0xF8, 0xA8, 0x84, 0x9C, 0xA4, 0x2C, 0x90, 0xAA, 0x20, 0xB3, 0x50,
+ 0x10, 0x29, 0x47, 0xC4, 0xE7, 0x75, 0x08, 0xC5, 0x25, 0x7D, 0x35, 0x6B, 0xEC, 0xB8, 0x2C, 0xB0, 0xA3, 0x42, 0x77, 0xC1,
+ 0x47, 0xAE, 0xED, 0xDF, 0x8A, 0x1F, 0xA8, 0xBD, 0xAB, 0x94, 0x25, 0x4D, 0xAC, 0x1F, 0x29, 0x4D, 0x91, 0xB5, 0x15, 0xB1,
+ 0x35, 0x6D, 0x95, 0xBB, 0x1A, 0xBB, 0xB4, 0x18, 0x01, 0x22, 0x1A, 0x8A, 0x20, 0x3B, 0x6D, 0x16, 0x23, 0x7A, 0x6F, 0x74,
+ 0xF5, 0xA2, 0x8D, 0x9A, 0x3F, 0x12, 0xD7, 0x84, 0x67, 0x4C, 0xCB, 0x4C, 0xF3, 0x1F, 0x4D, 0x19, 0xE5, 0xB6, 0x44, 0x10,
+ 0x1C, 0xB8, 0xA0, 0xD2, 0x51, 0xAC, 0x40, 0x58, 0xC8, 0x28, 0x37, 0x2D, 0x2F, 0x3D, 0x31, 0x75, 0xEE, 0x14, 0xDF, 0x94,
+ 0xA8, 0xD4, 0x03, 0xFB, 0xAE, 0xDE, 0xB3, 0xE3, 0xE8, 0xB2, 0xA1, 0xF5, 0xE4, 0x14, 0xF4, 0xB2, 0xD6, 0x0F, 0x6F, 0x3A,
+ 0xB2, 0xE7, 0x8A, 0x9B, 0xAE, 0xBF, 0xED, 0xDA, 0xAB, 0x6F, 0xDE, 0x34, 0xBC, 0x35, 0x3F, 0x29, 0xA7, 0xB5, 0xB6, 0xA3,
+ 0x34, 0xB3, 0x34, 0x2D, 0x32, 0xB9, 0x24, 0x0B, 0xF4, 0x10, 0xCB, 0x55, 0xA4, 0xE6, 0xD5, 0x24, 0x4F, 0x77, 0x53, 0x14,
+ 0xC4, 0xA4, 0x42, 0x29, 0xC8, 0x2E, 0x2A, 0xC8, 0x2C, 0xC0, 0xD8, 0x13, 0x22, 0x13, 0xB0, 0xFA, 0xDE, 0x8E, 0xC1, 0x92,
+ 0xBC, 0x8A, 0x9E, 0xF6, 0x01, 0x14, 0xEF, 0x3F, 0x67, 0x41, 0x6A, 0x5C, 0x2A, 0xBF, 0xCA, 0x49, 0x71, 0x74, 0xC0, 0x9B,
+ 0x61, 0x95, 0x66, 0x97, 0x10, 0xA2, 0x2D, 0x2E, 0x59, 0x29, 0x7B, 0xC5, 0x3D, 0x46, 0x01, 0x56, 0x79, 0xF6, 0xC2, 0xC7,
+ 0x81, 0x72, 0x8C, 0xDD, 0xC5, 0x13, 0x07, 0xBB, 0x4D, 0x14, 0xB5, 0x6B, 0x4C, 0xDA, 0xAE, 0xC6, 0x6E, 0x41, 0x46, 0xB2,
+ 0x4C, 0xB7, 0x15, 0xAC, 0x17, 0x72, 0xAB, 0x6D, 0xC8, 0x0A, 0x07, 0xF7, 0x15, 0x70, 0x58, 0xDA, 0x20, 0xB3, 0xDD, 0x4A,
+ 0xCD, 0x7F, 0xB4, 0x6D, 0xA0, 0x71, 0xD8, 0x55, 0x83, 0x38, 0x81, 0x93, 0xD8, 0xE5, 0x97, 0x4B, 0x18, 0xCC, 0x2E, 0x41,
+ 0x07, 0x29, 0xB1, 0x29, 0xC1, 0x0B, 0x82, 0x27, 0x5F, 0x34, 0x79, 0xD5, 0xD2, 0x0D, 0x07, 0xF7, 0x1F, 0xDF, 0xBE, 0x65,
+ 0x1F, 0xAE, 0x40, 0xEA, 0x89, 0xD5, 0xAF, 0x5E, 0xB6, 0xFE, 0xF0, 0xDE, 0x63, 0x7B, 0xB6, 0x1E, 0xA4, 0x9C, 0x4E, 0x09,
+ 0x4F, 0x20, 0xE4, 0x16, 0x67, 0x97, 0xC5, 0x85, 0xC4, 0x08, 0x80, 0x64, 0x15, 0xCA, 0x67, 0xD6, 0x58, 0x6A, 0xC2, 0xA9,
+ 0x86, 0x50, 0x2E, 0x54, 0x46, 0x0A, 0x44, 0xB9, 0xD9, 0x05, 0xD9, 0x29, 0x39, 0x88, 0x3B, 0x70, 0x7E, 0x40, 0x5A, 0x62,
+ 0xFA, 0x60, 0xF7, 0x72, 0x82, 0xB3, 0xDF, 0xEC, 0xF9, 0x71, 0xE1, 0x71, 0x29, 0xB1, 0xA9, 0x04, 0x06, 0x5E, 0x0A, 0x5F,
+ 0xE1, 0x99, 0x2C, 0x1B, 0x18, 0xAC, 0x0E, 0x3C, 0x20, 0xE3, 0xD8, 0xBE, 0x7D, 0xE4, 0x64, 0xD1, 0xAB, 0x16, 0x59, 0xA2,
+ 0x03, 0xB5, 0x77, 0x07, 0xCD, 0xEB, 0x1C, 0x1B, 0xD7, 0x07, 0x9D, 0x66, 0xBA, 0x2B, 0x6E, 0xC0, 0x44, 0x13, 0x4A, 0x6B,
+ 0xE0, 0xC8, 0x5A, 0xBB, 0x60, 0x4E, 0x56, 0xA3, 0x08, 0xE3, 0xB4, 0xDA, 0x4D, 0x4F, 0xD8, 0xD3, 0x19, 0x76, 0xD2, 0x4D,
+ 0x83, 0x39, 0x4E, 0xE2, 0xAF, 0xE9, 0xBF, 0xEB, 0x01, 0xAA, 0x00, 0x4A, 0xD6, 0xDA, 0xD2, 0x26, 0x6D, 0x06, 0xA0, 0x03,
+ 0x45, 0x55, 0x47, 0x46, 0x69, 0x79, 0xA9, 0x71, 0x69, 0xB1, 0xE1, 0x91, 0x17, 0x8E, 0x3B, 0x17, 0xE0, 0xBE, 0xFC, 0xF0,
+ 0xF5, 0x3B, 0x77, 0x5E, 0xBE, 0xB8, 0x7F, 0x4D, 0x43, 0x45, 0x2B, 0x4D, 0x1E, 0x1A, 0x18, 0x6B, 0x87, 0x37, 0xD2, 0x55,
+ 0x25, 0xA3, 0x8D, 0xF2, 0x0B, 0x27, 0x92, 0xF3, 0x09, 0xC3, 0x02, 0xC2, 0x78, 0x26, 0x82, 0xE3, 0x15, 0x00, 0x16, 0xD5,
+ 0x81, 0x82, 0x86, 0xBA, 0x97, 0x8A, 0xA9, 0x28, 0xB7, 0x18, 0xB1, 0x22, 0x62, 0x9E, 0x0C, 0x10, 0x25, 0x45, 0x24, 0x04,
+ 0xCC, 0x09, 0x08, 0x5C, 0xB0, 0xD0, 0x7F, 0xCE, 0xBC, 0xA8, 0x90, 0xB0, 0xE4, 0x98, 0x94, 0x8C, 0xA4, 0x9C, 0x9C, 0xF4,
+ 0x3C, 0x9E, 0xA0, 0x58, 0x34, 0x46, 0x07, 0x56, 0x91, 0x27, 0xCB, 0xFA, 0x2B, 0xA4, 0xEF, 0xE8, 0xC0, 0x49, 0x57, 0x4C,
+ 0xC5, 0x04, 0xA4, 0x08, 0xC8, 0x28, 0xA4, 0xB8, 0x0A, 0x50, 0x99, 0xAA, 0xAC, 0xED, 0xAC, 0x63, 0x24, 0xAE, 0x1A, 0xBB,
+ 0xB6, 0x41, 0xD5, 0x1A, 0xBB, 0xB5, 0xF4, 0x31, 0x17, 0xA7, 0x14, 0xBD, 0x86, 0x01, 0xAB, 0x00, 0xDB, 0x82, 0xE7, 0x02,
+ 0xD4, 0xB6, 0xD8, 0x5A, 0x9C, 0x59, 0x84, 0x1F, 0xA4, 0xC5, 0x65, 0x26, 0x44, 0xC5, 0xCD, 0x98, 0x36, 0xFD, 0xD2, 0x89,
+ 0x53, 0xD6, 0x0E, 0x6F, 0xC5, 0x15, 0xD6, 0xAD, 0xBA, 0xAC, 0xA1, 0xAA, 0xA3, 0x2C, 0xBB, 0x12, 0xE4, 0xA1, 0x88, 0x6D,
+ 0x2C, 0x6E, 0xC8, 0x4B, 0xCC, 0x0E, 0xF4, 0xF5, 0xAF, 0x29, 0x6B, 0xC8, 0xCF, 0x2A, 0x00, 0x55, 0xB2, 0x13, 0xB3, 0xF8,
+ 0xC3, 0xFC, 0x4C, 0x31, 0x3A, 0x8B, 0x0C, 0x64, 0x2C, 0x2C, 0xAB, 0x03, 0x1E, 0x47, 0xB8, 0xAA, 0x03, 0x30, 0x07, 0x4D,
+ 0x27, 0x44, 0x26, 0xC6, 0x84, 0xC6, 0x80, 0x4B, 0x78, 0x40, 0x46, 0x62, 0x86, 0x04, 0xE4, 0x94, 0x5C, 0x79, 0x9D, 0xAC,
+ 0x42, 0x55, 0x83, 0xFA, 0x81, 0x17, 0xD9, 0xFF, 0x7F, 0x28, 0x80, 0xD7, 0xF1, 0x31, 0x68, 0xBE, 0xA8, 0xB9, 0xBA, 0x8B,
+ 0xA5, 0x56, 0x6F, 0x96, 0x8B, 0x2D, 0x6E, 0xC5, 0xE4, 0xCD, 0x64, 0x2C, 0xB2, 0x7B, 0xA7, 0x1F, 0x5E, 0x59, 0x8F, 0x54,
+ 0x58, 0x2E, 0xE6, 0x58, 0x63, 0xB7, 0x51, 0x57, 0x5D, 0xC1, 0x8A, 0x5E, 0x15, 0xE0, 0x74, 0x6F, 0xDC, 0x2E, 0x3C, 0xA9,
+ 0x24, 0x3A, 0x10, 0x83, 0xCD, 0x71, 0xB0, 0x22, 0x3F, 0x23, 0x3F, 0x33, 0x29, 0x53, 0xF0, 0x3A, 0x20, 0xF8, 0x6B, 0x67,
+ 0x9D, 0x8D, 0x8B, 0xEC, 0xDB, 0x73, 0xD5, 0xE6, 0xF5, 0x7B, 0x69, 0xE2, 0x66, 0xC6, 0xE5, 0x25, 0x85, 0x25, 0xE5, 0xA6,
+ 0x16, 0x90, 0xB7, 0xC4, 0x87, 0xC6, 0xFA, 0xCD, 0xF7, 0xAF, 0x2B, 0x6B, 0xCC, 0xCD, 0xC8, 0x0B, 0x5A, 0xB0, 0x30, 0x3D,
+ 0x21, 0x03, 0x84, 0x11, 0x44, 0xCA, 0x2C, 0x19, 0x93, 0x59, 0x2A, 0x70, 0x3B, 0x7E, 0x96, 0x53, 0x8C, 0x7C, 0x0B, 0x53,
+ 0xF3, 0x79, 0x32, 0x12, 0x4F, 0x4F, 0x48, 0xC7, 0x21, 0xD2, 0xE2, 0xD3, 0x32, 0x12, 0x33, 0xB9, 0xCB, 0x83, 0xF9, 0xA9,
+ 0x79, 0xF8, 0x13, 0x0A, 0x50, 0x38, 0xF2, 0xEA, 0xE0, 0x94, 0xD2, 0xB7, 0x68, 0x73, 0xF2, 0x85, 0x7A, 0x92, 0x2E, 0x1F,
+ 0xB1, 0xEE, 0xEA, 0x45, 0x2D, 0x95, 0x48, 0xDF, 0x69, 0x15, 0xC8, 0x23, 0x06, 0xC4, 0xAD, 0x51, 0x9F, 0x7C, 0xA1, 0x71,
+ 0x55, 0x71, 0xC6, 0xBB, 0xAC, 0xAC, 0xAD, 0xBD, 0x5B, 0xB8, 0xF7, 0x4A, 0x5F, 0x11, 0x7F, 0x8C, 0x02, 0xA4, 0x6B, 0x46,
+ 0xFF, 0x80, 0xF9, 0x9F, 0xA0, 0x90, 0xB4, 0x10, 0x00, 0x74, 0x89, 0x07, 0xB4, 0x18, 0x35, 0x66, 0x66, 0x16, 0x60, 0x86,
+ 0x99, 0x49, 0x59, 0x49, 0xD1, 0x49, 0x58, 0xE8, 0xF8, 0x8B, 0x2E, 0xF6, 0x9B, 0xB3, 0x60, 0xC3, 0x9A, 0x9D, 0xDB, 0xB6,
+ 0x1D, 0xEC, 0xEF, 0x5E, 0x91, 0x9F, 0x5E, 0x94, 0x14, 0x91, 0x9C, 0x14, 0x9B, 0x92, 0x18, 0x93, 0x44, 0x42, 0xE9, 0x37,
+ 0xC7, 0xBF, 0xBE, 0xB2, 0x99, 0xE7, 0x2F, 0x9C, 0xE7, 0x8F, 0x28, 0x11, 0x22, 0xD7, 0xDE, 0x94, 0x66, 0x0C, 0x76, 0x0B,
+ 0x16, 0xE5, 0x18, 0x84, 0x49, 0x2B, 0x20, 0xF9, 0xC1, 0xE4, 0xB3, 0x92, 0x72, 0xB3, 0x52, 0x73, 0xE4, 0x16, 0x05, 0xA4,
+ 0x01, 0x44, 0xB9, 0x68, 0xD1, 0xC5, 0xA2, 0xB1, 0x7E, 0x20, 0x40, 0xE7, 0xE2, 0xFB, 0xFF, 0x47, 0xD1, 0x8F, 0xE8, 0xC0,
+ 0x89, 0x9C, 0x0A, 0xEB, 0xA6, 0x44, 0xE2, 0x11, 0x1D, 0x2A, 0xE9, 0xAF, 0x4E, 0x16, 0xB4, 0x83, 0xF2, 0x66, 0xE8, 0xE1,
+ 0x0C, 0x40, 0x6C, 0x63, 0xC7, 0x98, 0xB6, 0x85, 0x7B, 0x6F, 0x7F, 0x78, 0x8C, 0xD0, 0x75, 0x14, 0xE5, 0xF4, 0x8D, 0xDD,
+ 0xFE, 0xA5, 0x54, 0x64, 0x66, 0x2C, 0x65, 0xDB, 0xC2, 0x9A, 0x14, 0x09, 0x5E, 0x67, 0x17, 0x23, 0xC1, 0x82, 0xB4, 0x3C,
+ 0x24, 0x42, 0x58, 0x46, 0x07, 0xF3, 0x7D, 0xE7, 0x8D, 0x3B, 0xE7, 0x5C, 0x42, 0xF1, 0xDE, 0x5D, 0x57, 0x0F, 0x2F, 0xDB,
+ 0x44, 0xD9, 0x15, 0x1B, 0x11, 0x07, 0xFA, 0x93, 0x50, 0x86, 0x2F, 0x0C, 0x27, 0x90, 0xD6, 0x96, 0x37, 0x62, 0xBC, 0x01,
+ 0x73, 0xE7, 0x63, 0xCB, 0x59, 0xC9, 0x59, 0x1A, 0x15, 0xBE, 0x02, 0xC7, 0x89, 0x16, 0xFC, 0x56, 0xCD, 0x1C, 0x59, 0xA3,
+ 0x33, 0xFE, 0x44, 0x57, 0x6E, 0x5A, 0xAE, 0x64, 0xA5, 0x6E, 0x62, 0xCA, 0x73, 0xBC, 0x82, 0x56, 0x27, 0xF8, 0x6A, 0x1D,
+ 0x78, 0x0D, 0x5F, 0xAF, 0xE5, 0xE3, 0x98, 0xE5, 0xE3, 0x88, 0xDB, 0x9B, 0xA7, 0x8F, 0x1E, 0xB4, 0x5A, 0x33, 0x1F, 0x03,
+ 0xE5, 0x84, 0x41, 0xFB, 0x48, 0x7D, 0xB9, 0x93, 0x53, 0xDA, 0x47, 0x46, 0x4B, 0x9C, 0x6C, 0xA7, 0x55, 0x67, 0x4F, 0x32,
+ 0x08, 0x94, 0xD6, 0x8D, 0x3C, 0x62, 0xD3, 0x50, 0x9D, 0x8C, 0xEB, 0x68, 0x50, 0xEA, 0x32, 0x1A, 0x6A, 0x8C, 0x67, 0xCD,
+ 0xFC, 0x8F, 0xE2, 0xC0, 0xAB, 0x83, 0xBC, 0xF4, 0x3C, 0xC4, 0x4A, 0xCF, 0x20, 0x21, 0x2C, 0x2E, 0x6C, 0x61, 0xC8, 0xB9,
+ 0xE7, 0x9C, 0x9D, 0x14, 0x9D, 0xBC, 0x75, 0xE3, 0xBE, 0x55, 0x2B, 0xB6, 0xD5, 0x55, 0xB4, 0x88, 0x0E, 0xFC, 0x82, 0xC8,
+ 0xEE, 0xC3, 0x16, 0x06, 0xF9, 0xCF, 0x9A, 0x07, 0x16, 0x65, 0xA5, 0x66, 0x13, 0x54, 0x0D, 0xA0, 0x67, 0x22, 0x4A, 0x93,
+ 0x20, 0x09, 0x86, 0x78, 0x8B, 0x2C, 0x27, 0x9C, 0xE6, 0x95, 0x14, 0xE4, 0x22, 0x47, 0xA4, 0x23, 0x72, 0x31, 0xB5, 0x98,
+ 0xA8, 0x21, 0x37, 0x03, 0xDB, 0x97, 0x50, 0xEC, 0x66, 0x44, 0xFC, 0xD6, 0x51, 0xA4, 0x57, 0xE8, 0x56, 0xC4, 0xA7, 0x7C,
+ 0x50, 0x25, 0x6E, 0x9F, 0xA3, 0x6A, 0x1E, 0xD1, 0x81, 0x62, 0x0E, 0x53, 0x3D, 0x64, 0xAD, 0xB7, 0x63, 0x64, 0xED, 0xB5,
+ 0x74, 0x06, 0x7E, 0xDE, 0x3A, 0x76, 0xCC, 0x18, 0xC4, 0x62, 0xBA, 0x17, 0xDC, 0xC9, 0x70, 0x90, 0xBE, 0xF6, 0xCB, 0xB8,
+ 0x90, 0xAE, 0x7D, 0x69, 0x9D, 0x36, 0xEB, 0x1B, 0x8A, 0x45, 0x2B, 0x2C, 0x6D, 0xE5, 0xEB, 0x54, 0xD6, 0x19, 0xC9, 0x32,
+ 0x0D, 0x2F, 0x94, 0x4E, 0x8E, 0x69, 0xC1, 0x4B, 0xD5, 0xA3, 0x79, 0x11, 0x82, 0x50, 0xA4, 0x4E, 0x8E, 0x4C, 0x8C, 0x0C,
+ 0x8A, 0x9A, 0x3C, 0xE9, 0x92, 0x4B, 0x26, 0x4E, 0xA6, 0x44, 0x58, 0xBF, 0x7A, 0x27, 0xAD, 0xAD, 0xE4, 0x84, 0x74, 0x14,
+ 0x10, 0x1B, 0x1C, 0x83, 0x7A, 0xFC, 0x66, 0xCF, 0xAD, 0x28, 0xAD, 0xCB, 0x4C, 0xCF, 0xC1, 0x21, 0xC0, 0x2E, 0xFE, 0x04,
+ 0xE5, 0x29, 0x1C, 0xA9, 0x98, 0xBC, 0xB1, 0x54, 0x5E, 0x3F, 0x8F, 0xD4, 0xA8, 0xA4, 0x24, 0xAB, 0x54, 0x75, 0xA0, 0x0B,
+ 0x49, 0x89, 0xEB, 0xA4, 0xCB, 0xAD, 0x2B, 0x44, 0x44, 0x59, 0x48, 0x76, 0x30, 0xC6, 0x15, 0xAC, 0xE8, 0x4F, 0xB6, 0x77,
+ 0xAF, 0xE8, 0xED, 0x2B, 0xDB, 0xD7, 0xE7, 0x13, 0xF9, 0x78, 0x2D, 0xF7, 0xE4, 0xA4, 0x65, 0xAC, 0xED, 0x33, 0x69, 0x72,
+ 0x27, 0x7F, 0x1E, 0x89, 0x3B, 0x49, 0xBD, 0xDA, 0xB5, 0xDA, 0xB2, 0x6B, 0xD7, 0x46, 0xCA, 0x46, 0xB2, 0xD2, 0x7A, 0xB3,
+ 0x13, 0x70, 0xD7, 0xE4, 0xF1, 0x00, 0x79, 0x7E, 0xB1, 0x51, 0x92, 0x7A, 0x83, 0x27, 0x20, 0x4B, 0x63, 0x27, 0xAF, 0x46,
+ 0x5B, 0x8C, 0x58, 0xAB, 0x48, 0x27, 0x2D, 0x3F, 0x37, 0x39, 0x27, 0x3D, 0x29, 0x23, 0x39, 0x26, 0x39, 0x26, 0x08, 0xD0,
+ 0x5F, 0x70, 0xD6, 0x59, 0x67, 0x81, 0x39, 0xBB, 0xB6, 0x5C, 0xDE, 0xB7, 0x68, 0x38, 0x23, 0x39, 0x2B, 0xC4, 0x2F, 0x24,
+ 0xD4, 0x3F, 0x34, 0xD8, 0x2F, 0xD0, 0x6F, 0xC6, 0xFC, 0xC2, 0xBC, 0x4A, 0x70, 0x7C, 0x81, 0xEF, 0x1C, 0x74, 0x80, 0xEB,
+ 0x00, 0x47, 0x36, 0xBB, 0x1F, 0xD1, 0xC1, 0xA8, 0xCE, 0x41, 0x69, 0x91, 0xAB, 0x03, 0xFE, 0x97, 0x2A, 0x43, 0x2F, 0xDC,
+ 0x35, 0x12, 0x48, 0x6D, 0x7A, 0xAA, 0xD2, 0xF7, 0xFA, 0x81, 0xD7, 0xE4, 0xF5, 0x71, 0xAF, 0xD5, 0x7B, 0xB5, 0xAB, 0x8F,
+ 0xFB, 0xD8, 0xFC, 0xC4, 0xD6, 0xA8, 0x63, 0x2C, 0x5D, 0xEE, 0x96, 0x37, 0xE9, 0xD3, 0x90, 0x11, 0x95, 0x94, 0xC8, 0x5A,
+ 0x99, 0x1D, 0xBA, 0x30, 0xE4, 0x62, 0x43, 0xB3, 0x51, 0x3C, 0x31, 0xA4, 0x1A, 0x2E, 0x18, 0x70, 0x2B, 0xBB, 0xC6, 0x3B,
+ 0x7A, 0x55, 0xF6, 0x87, 0xCC, 0x63, 0xE5, 0xB6, 0x41, 0x56, 0x71, 0x4B, 0x23, 0x3A, 0x28, 0x6B, 0x94, 0x97, 0xE2, 0x5A,
+ 0x5F, 0xC4, 0x74, 0xAA, 0x69, 0x6A, 0x6A, 0xA3, 0xC2, 0xD6, 0x50, 0x0C, 0x0F, 0x88, 0x96, 0x84, 0xE5, 0x94, 0xF8, 0x54,
+ 0xEA, 0xA6, 0xD0, 0x80, 0xE0, 0xF3, 0xCE, 0x1D, 0x17, 0x11, 0x16, 0xB9, 0x69, 0xDD, 0x9E, 0x25, 0x03, 0x6B, 0x29, 0x74,
+ 0x83, 0xFD, 0x43, 0x28, 0xAF, 0x42, 0x03, 0x02, 0xE7, 0xCE, 0x98, 0x2D, 0x30, 0x92, 0x99, 0xBF, 0xC0, 0x77, 0x1E, 0x78,
+ 0x45, 0x58, 0xE6, 0xAF, 0xB2, 0xD3, 0x0C, 0x1C, 0x65, 0x8A, 0x4B, 0x8D, 0x24, 0x48, 0xD9, 0x4E, 0x7E, 0x69, 0x73, 0x1B,
+ 0x57, 0xBE, 0x82, 0x4B, 0xBA, 0x8A, 0x1D, 0x65, 0x88, 0x40, 0x71, 0x02, 0xAF, 0xB1, 0xAB, 0x0E, 0xAC, 0xDC, 0xBD, 0x96,
+ 0x7E, 0xB2, 0xE8, 0xAD, 0x6F, 0xA9, 0x87, 0xE9, 0x12, 0x1D, 0x78, 0xB1, 0xDB, 0x5E, 0x8F, 0x0D, 0xA1, 0x65, 0x0C, 0x40,
+ 0x64, 0x06, 0x22, 0x9D, 0x1C, 0xCF, 0x14, 0x50, 0x3B, 0xFB, 0xCE, 0x20, 0x10, 0x33, 0x77, 0xE9, 0x4D, 0x1A, 0x5A, 0x2D,
+ 0xC5, 0x43, 0xE9, 0x37, 0xF2, 0x4C, 0x77, 0x12, 0x5B, 0x5B, 0x04, 0xF8, 0x38, 0x42, 0x17, 0x05, 0x57, 0x34, 0x33, 0xE7,
+ 0x6A, 0x2E, 0x55, 0xEA, 0x4E, 0x23, 0x4B, 0x27, 0x5C, 0x84, 0x04, 0x74, 0xA0, 0x7E, 0x80, 0x91, 0x6A, 0x6A, 0xC4, 0x44,
+ 0x05, 0x88, 0x4F, 0x8C, 0x8E, 0x07, 0x79, 0xA6, 0x5D, 0x32, 0x75, 0xD2, 0x84, 0x4B, 0x96, 0xF6, 0xAF, 0x5A, 0xB1, 0x74,
+ 0x33, 0x4D, 0xBD, 0xB0, 0xC0, 0xF0, 0xC0, 0xD9, 0x01, 0xE4, 0x42, 0x73, 0x67, 0xF9, 0xA6, 0x27, 0xA5, 0x91, 0x6B, 0xCE,
+ 0x9F, 0x8D, 0x1F, 0x88, 0x0E, 0xB4, 0xD3, 0x20, 0x89, 0x8D, 0x80, 0xBE, 0x13, 0x15, 0x24, 0x96, 0xE6, 0x38, 0xBD, 0x0A,
+ 0x47, 0x07, 0xD9, 0x65, 0xA3, 0x81, 0x65, 0x04, 0xC7, 0xFF, 0x9F, 0x70, 0xE6, 0x14, 0xB0, 0x93, 0xE9, 0x08, 0xDD, 0xC9,
+ 0x6E, 0xD3, 0x9D, 0xC8, 0xEF, 0x33, 0x06, 0xC4, 0x2D, 0x92, 0xB8, 0x78, 0x22, 0xB1, 0xD4, 0x44, 0x54, 0x49, 0x1C, 0x47,
+ 0x40, 0xC6, 0x60, 0xB7, 0xA2, 0xB9, 0xFC, 0x09, 0xE6, 0x5C, 0x64, 0x84, 0x5E, 0x2C, 0x11, 0xB5, 0x86, 0xA9, 0x08, 0x13,
+ 0x92, 0xA2, 0x06, 0x87, 0x53, 0xE6, 0x0E, 0xAA, 0x34, 0xDB, 0x71, 0xA6, 0x86, 0x85, 0x32, 0xC9, 0x72, 0x66, 0xE8, 0x55,
+ 0x4D, 0xCD, 0x95, 0x4D, 0x4A, 0x68, 0x68, 0xAB, 0x90, 0xB9, 0x0D, 0x2F, 0x68, 0xFA, 0x45, 0x75, 0xD5, 0xC5, 0x0D, 0x36,
+ 0x35, 0xD2, 0x96, 0x4E, 0x1E, 0x3D, 0xFC, 0xE4, 0x6C, 0x52, 0x1D, 0x10, 0x26, 0x2A, 0x54, 0xE0, 0xE8, 0xEC, 0xB3, 0xCF,
+ 0xAC, 0x2E, 0xAD, 0x5F, 0xBF, 0x72, 0x7B, 0x6D, 0x79, 0x73, 0x64, 0x48, 0x14, 0xF9, 0x52, 0xC0, 0x3C, 0xFF, 0x39, 0x33,
+ 0x66, 0x27, 0xC5, 0x26, 0x17, 0xE6, 0x14, 0xA3, 0x8C, 0xC4, 0xA8, 0x44, 0xF5, 0x03, 0x70, 0x4C, 0xB2, 0xA3, 0xAC, 0x82,
+ 0x11, 0x35, 0x10, 0x87, 0x4D, 0xF3, 0xF2, 0xA4, 0xC4, 0xC6, 0xD1, 0xD3, 0x29, 0xE5, 0x6E, 0x5D, 0xE1, 0x94, 0xE6, 0x3F,
+ 0xC6, 0x15, 0xAC, 0xBD, 0xE7, 0x19, 0x1D, 0xA8, 0x02, 0xA4, 0xD6, 0x4B, 0x95, 0xBC, 0x8B, 0x0B, 0x47, 0x07, 0xA3, 0x41,
+ 0x7C, 0x24, 0x4B, 0x71, 0x72, 0x76, 0x9D, 0x77, 0xAB, 0x1A, 0x4A, 0x64, 0xF4, 0x6A, 0x96, 0x63, 0xAA, 0x9A, 0x4A, 0xBA,
+ 0x1E, 0x20, 0xD7, 0xD2, 0x9A, 0x97, 0x21, 0x09, 0x0D, 0x1F, 0x67, 0x52, 0xE8, 0x10, 0xCD, 0x0A, 0xC5, 0xAE, 0xAB, 0x0B,
+ 0x1C, 0xDE, 0x99, 0x0E, 0x63, 0xC9, 0x7F, 0x18, 0x52, 0x32, 0xEF, 0x85, 0xCF, 0x03, 0xAB, 0x07, 0x36, 0x5C, 0x6B, 0x35,
+ 0x3E, 0x21, 0xFC, 0x06, 0x69, 0x5A, 0x98, 0xBE, 0xA9, 0x36, 0x23, 0x25, 0x2C, 0xE7, 0xD8, 0xB0, 0x4C, 0x48, 0x48, 0x89,
+ 0x0D, 0x8F, 0x0E, 0x0F, 0x0C, 0x05, 0x8E, 0x50, 0xC6, 0xFA, 0x95, 0x5B, 0x69, 0x38, 0xC6, 0x84, 0xC7, 0xA2, 0x15, 0xE0,
+ 0x68, 0xDE, 0xCC, 0x39, 0x09, 0xD1, 0x89, 0x78, 0xC6, 0xBC, 0x59, 0x73, 0xD1, 0x01, 0x75, 0x2F, 0xA9, 0x11, 0x61, 0x99,
+ 0x7E, 0x83, 0x11, 0x8A, 0x24, 0x48, 0x92, 0xAE, 0xA0, 0x80, 0x3C, 0x51, 0x83, 0xF5, 0x0C, 0xD7, 0x09, 0xBE, 0x4A, 0x07,
+ 0x5E, 0xC5, 0x8C, 0xB1, 0x77, 0x3C, 0x75, 0x0C, 0xE2, 0xF3, 0xBF, 0xCC, 0x12, 0xAB, 0xD7, 0x94, 0xD7, 0x2E, 0xBD, 0xEB,
+ 0xE3, 0xA5, 0x8C, 0x69, 0xB7, 0x52, 0xA4, 0xEC, 0x30, 0xC8, 0x4C, 0x9A, 0xE8, 0xE6, 0xEC, 0x16, 0x5E, 0xEC, 0x85, 0x2A,
+ 0x43, 0x53, 0x49, 0xB1, 0x6E, 0x43, 0x34, 0x53, 0xDB, 0xB7, 0x9C, 0x03, 0x1D, 0x79, 0x33, 0x2D, 0xB1, 0xCC, 0x32, 0xEC,
+ 0x9A, 0x6B, 0xA6, 0x31, 0xC4, 0x5B, 0x78, 0x3B, 0xF9, 0xA9, 0x05, 0xCC, 0x6F, 0xCB, 0x33, 0x2B, 0x84, 0xD3, 0xE9, 0x70,
+ 0xDC, 0x20, 0x16, 0xB6, 0x42, 0x2C, 0x04, 0xA0, 0x4C, 0xFB, 0x9A, 0x59, 0x39, 0xE3, 0x40, 0x99, 0x73, 0x01, 0xE5, 0xF2,
+ 0xBE, 0x13, 0xB3, 0xB3, 0x13, 0x33, 0x4D, 0x48, 0x88, 0x8F, 0x0C, 0x8A, 0xBC, 0x74, 0xD2, 0x25, 0x53, 0xA7, 0x5C, 0x3A,
+ 0xBC, 0x64, 0xE3, 0xA2, 0xF6, 0x25, 0x74, 0x98, 0x49, 0x84, 0xA8, 0x8D, 0xE7, 0xCD, 0xF4, 0x8D, 0x8B, 0x8C, 0x2F, 0x2B,
+ 0xAC, 0xE0, 0x82, 0xBA, 0x3A, 0xC9, 0x94, 0xBB, 0xF8, 0x81, 0x18, 0x20, 0x73, 0x18, 0xB7, 0x50, 0x10, 0x89, 0x3B, 0x0A,
+ 0x00, 0x9D, 0x1C, 0x80, 0x32, 0x6A, 0x18, 0x05, 0xFA, 0xE2, 0x7F, 0x63, 0x1E, 0x71, 0x73, 0xA7, 0x93, 0x30, 0x47, 0xC4,
+ 0x3D, 0x66, 0x9D, 0x2C, 0x7D, 0xAB, 0x06, 0x5C, 0xC1, 0x07, 0x03, 0x57, 0x5C, 0xB6, 0x8C, 0x49, 0x2E, 0x14, 0x8B, 0x35,
+ 0xB4, 0x8E, 0x30, 0x58, 0x9D, 0xAC, 0xC6, 0xF0, 0x58, 0xDD, 0x52, 0xD6, 0x78, 0x80, 0x4C, 0xA9, 0x0C, 0x9F, 0xB2, 0x1A,
+ 0x14, 0xB2, 0xDC, 0x4A, 0x2F, 0xA9, 0x4F, 0x19, 0x4E, 0x3A, 0xDA, 0x26, 0xD7, 0xA4, 0xF7, 0x40, 0xC2, 0x87, 0x0E, 0xBA,
+ 0x1A, 0x16, 0x7D, 0xFB, 0x5B, 0xDF, 0x7B, 0xEC, 0x91, 0x27, 0xE1, 0x22, 0xD2, 0xE8, 0x6F, 0xAD, 0x6C, 0x66, 0xFE, 0x0E,
+ 0x17, 0x48, 0x18, 0x86, 0x35, 0xC2, 0xA2, 0x50, 0x35, 0xC8, 0xD0, 0xB1, 0x00, 0x6F, 0x10, 0x57, 0x40, 0x1C, 0x54, 0x4C,
+ 0x00, 0x0B, 0xDD, 0x4D, 0x46, 0x5D, 0x94, 0xC4, 0x20, 0xFE, 0xF9, 0xE3, 0xCE, 0xEB, 0x6E, 0xEB, 0x5F, 0xD2, 0xB7, 0x32,
+ 0x39, 0x2E, 0x15, 0x1D, 0x90, 0x17, 0x05, 0xCC, 0xF5, 0x23, 0x3E, 0x57, 0x95, 0xD4, 0x2D, 0x98, 0x33, 0x9B, 0xAA, 0x0D,
+ 0x3F, 0x40, 0x6D, 0x1A, 0x93, 0x09, 0xD4, 0xC0, 0xD1, 0x29, 0x33, 0x7A, 0x42, 0x8E, 0xC7, 0x0F, 0x46, 0x45, 0x02, 0xF0,
+ 0xA7, 0x38, 0xDD, 0x24, 0xAC, 0x9E, 0xE4, 0xD5, 0x9A, 0xBC, 0x26, 0x3F, 0xBA, 0x4C, 0xF6, 0x25, 0x8B, 0xC2, 0x82, 0xB7,
+ 0xEA, 0x35, 0x7C, 0xAF, 0xE8, 0x6D, 0x0D, 0xE8, 0xA3, 0x48, 0x62, 0x15, 0x00, 0x83, 0xD5, 0x31, 0x73, 0x37, 0xA2, 0x0A,
+ 0xB6, 0x18, 0x03, 0x77, 0xC8, 0xC3, 0x5C, 0x1B, 0x16, 0x31, 0xE2, 0x36, 0x78, 0x2D, 0x90, 0xCD, 0x35, 0x62, 0x12, 0x4B,
+ 0x2F, 0x32, 0x0E, 0x61, 0xC8, 0x36, 0x60, 0x08, 0xB0, 0x03, 0xCF, 0x00, 0xB9, 0x1B, 0x72, 0x47, 0xB5, 0xE9, 0xBE, 0x49,
+ 0x73, 0x86, 0x14, 0x13, 0x1D, 0x30, 0x68, 0x64, 0xBD, 0xF7, 0x93, 0x5F, 0x31, 0x05, 0xFE, 0xDB, 0xDF, 0xFE, 0xB6, 0x67,
+ 0xFB, 0x81, 0xDC, 0xA4, 0xAC, 0xD6, 0xAA, 0xA6, 0xEE, 0xA6, 0x45, 0xB0, 0x51, 0xA0, 0x12, 0x09, 0xE3, 0xB3, 0xA6, 0xB5,
+ 0xB9, 0x52, 0xF2, 0x5A, 0x5E, 0x93, 0xE0, 0xCC, 0x18, 0x00, 0x88, 0x47, 0x88, 0x84, 0x04, 0xEC, 0x9A, 0x0C, 0x95, 0x6A,
+ 0x20, 0x30, 0x60, 0xE1, 0xB8, 0x73, 0xBF, 0x56, 0x98, 0x57, 0xBA, 0x6E, 0xC5, 0x96, 0x8C, 0xE4, 0x4C, 0x12, 0x21, 0x32,
+ 0x54, 0x4A, 0x65, 0xFF, 0xB9, 0x7E, 0x55, 0xA5, 0x35, 0x81, 0xF3, 0xFD, 0xC8, 0xA0, 0x88, 0x1F, 0x34, 0x9A, 0x32, 0x52,
+ 0xF3, 0x0A, 0x92, 0x51, 0x03, 0xAE, 0x90, 0xCF, 0x48, 0x6E, 0x94, 0x1A, 0x46, 0xA4, 0xEF, 0xE4, 0x9A, 0xA0, 0x8A, 0x9B,
+ 0x74, 0x4A, 0x5E, 0x04, 0xB1, 0x45, 0x25, 0xCE, 0x1F, 0x8E, 0x29, 0x20, 0x2C, 0xCA, 0x8B, 0x0E, 0xD2, 0x51, 0x86, 0x2A,
+ 0x20, 0x9F, 0xE6, 0x15, 0x82, 0xB6, 0xF8, 0x63, 0xAB, 0x6E, 0x4F, 0xF9, 0x2D, 0x21, 0x41, 0x74, 0x50, 0x53, 0xC8, 0x32,
+ 0x48, 0x22, 0x04, 0xA6, 0x3A, 0x8C, 0x5A, 0xB9, 0x92, 0xC8, 0xDA, 0x06, 0x55, 0xD5, 0xC4, 0x08, 0x8B, 0xD8, 0x25, 0x25,
+ 0x8C, 0xE1, 0x9A, 0x19, 0x82, 0x5F, 0xBD, 0x0E, 0x0B, 0x45, 0x25, 0xF9, 0xD2, 0x74, 0x33, 0xC4, 0x02, 0xE8, 0x08, 0xDA,
+ 0x1D, 0x73, 0xE6, 0xE6, 0x89, 0x21, 0x71, 0x8C, 0x21, 0x53, 0x22, 0x92, 0x0A, 0x52, 0x0A, 0x5E, 0xFE, 0xE6, 0x6B, 0x42,
+ 0xD5, 0x3A, 0xF1, 0xC5, 0xDD, 0xB7, 0xDE, 0xCF, 0x27, 0xA4, 0xF1, 0xD9, 0xD7, 0xDC, 0xD3, 0xDB, 0xD4, 0xAD, 0x3C, 0x51,
+ 0x82, 0x04, 0xD1, 0x82, 0x98, 0x41, 0xE4, 0xC0, 0x87, 0x98, 0xA6, 0x91, 0x2C, 0x62, 0x5F, 0xE8, 0x20, 0x35, 0x3A, 0x05,
+ 0x1B, 0x8F, 0x08, 0x0E, 0xA7, 0x77, 0x84, 0x43, 0x6C, 0x5E, 0xBB, 0x3D, 0x27, 0x2B, 0x9F, 0x00, 0x10, 0x15, 0x12, 0x91,
+ 0x1C, 0x9B, 0xE8, 0x3F, 0x67, 0x4E, 0x79, 0x51, 0x65, 0x68, 0x70, 0x08, 0x61, 0x83, 0xB6, 0x1D, 0xF5, 0x81, 0xC6, 0x64,
+ 0x45, 0x86, 0x12, 0x4F, 0xE1, 0xAA, 0xCA, 0xB0, 0x91, 0x76, 0x54, 0xF6, 0x99, 0x63, 0x1E, 0x4F, 0x1F, 0x29, 0x6B, 0x6D,
+ 0x9B, 0x61, 0x34, 0xE0, 0x38, 0x85, 0xB4, 0xED, 0x73, 0x8C, 0xC1, 0xFD, 0x31, 0x0A, 0x90, 0xC8, 0x94, 0x9A, 0xAB, 0xB7,
+ 0x3E, 0x0A, 0x26, 0x2A, 0x6B, 0x3E, 0xA4, 0xC3, 0x98, 0x14, 0x9A, 0xBC, 0x61, 0xAA, 0x16, 0x55, 0x6B, 0xEF, 0xCC, 0xD5,
+ 0x8A, 0x4B, 0x9F, 0x77, 0x29, 0xDD, 0x3C, 0x0E, 0x0F, 0x50, 0x7F, 0xAB, 0x14, 0x57, 0x99, 0xD0, 0xE6, 0x57, 0x01, 0x1D,
+ 0xA6, 0xDD, 0x26, 0x94, 0x1B, 0xA1, 0x11, 0x14, 0x94, 0x79, 0xC7, 0x55, 0xBC, 0x3F, 0x46, 0xF3, 0x99, 0xF1, 0x19, 0x5B,
+ 0xD6, 0xED, 0xE6, 0x96, 0x11, 0xF1, 0x03, 0x77, 0x3F, 0x84, 0x0E, 0xD0, 0xC4, 0xAB, 0x2F, 0xBF, 0xD2, 0x5C, 0xDD, 0xC6,
+ 0x10, 0xB8, 0xA7, 0x79, 0x11, 0xEC, 0xD2, 0xEE, 0x56, 0x51, 0x06, 0x3E, 0x81, 0x43, 0x34, 0x95, 0x89, 0x1A, 0x08, 0x21,
+ 0x4C, 0x28, 0x69, 0x24, 0x64, 0xA6, 0x64, 0xF3, 0xB7, 0xC9, 0x51, 0xF1, 0xD1, 0xA1, 0x91, 0xB3, 0xA6, 0x4D, 0x9F, 0x3B,
+ 0x73, 0xCE, 0xFA, 0xB5, 0x3B, 0x4B, 0xF3, 0x2B, 0xE7, 0xCF, 0x9C, 0x9F, 0x16, 0x93, 0x52, 0x5D, 0x58, 0x19, 0xEE, 0x1F,
+ 0x5C, 0x90, 0x55, 0x92, 0x48, 0xFB, 0x39, 0x24, 0x82, 0x71, 0x3C, 0x33, 0x61, 0x6D, 0x19, 0x49, 0x40, 0x46, 0xA6, 0x19,
+ 0x23, 0x85, 0x95, 0x88, 0x55, 0xE1, 0x5E, 0x4A, 0x87, 0xB1, 0x10, 0x54, 0x92, 0xE1, 0xB4, 0x77, 0x9C, 0x82, 0xCB, 0x60,
+ 0xD1, 0x28, 0xDB, 0x37, 0x79, 0x8E, 0x9A, 0xFC, 0xC9, 0xD0, 0xFF, 0x65, 0xD2, 0x47, 0x01, 0xBA, 0x7C, 0x14, 0xBE, 0xD5,
+ 0x9C, 0xAD, 0x28, 0x9D, 0x88, 0x6A, 0xC0, 0xDD, 0x5D, 0xD5, 0x34, 0x0F, 0xBC, 0x91, 0xD6, 0xA5, 0x29, 0x38, 0x34, 0x6E,
+ 0x05, 0x1F, 0x9D, 0x95, 0x6B, 0x24, 0x50, 0x0F, 0x90, 0x94, 0xA6, 0x40, 0x9A, 0x6E, 0x26, 0xFF, 0x2B, 0x36, 0x55, 0x7E,
+ 0x01, 0xB8, 0x4C, 0xB2, 0x38, 0xEF, 0xD2, 0x59, 0xB9, 0xC9, 0x79, 0xFB, 0x77, 0x1E, 0x26, 0x14, 0xC7, 0x2C, 0x8C, 0x3A,
+ 0xB8, 0xF3, 0x88, 0x92, 0x76, 0x7F, 0xF7, 0x9B, 0xDF, 0x5E, 0xB6, 0x79, 0x07, 0x41, 0x18, 0xA1, 0xF7, 0xB5, 0x2D, 0x82,
+ 0xC0, 0xD2, 0xD7, 0xDA, 0x0B, 0x40, 0x75, 0xD6, 0xD2, 0x40, 0x14, 0xBE, 0x2D, 0x04, 0x0B, 0x58, 0x40, 0x78, 0x3A, 0xAE,
+ 0x40, 0xFF, 0x2E, 0x3E, 0x32, 0x36, 0x60, 0xFE, 0x82, 0xC9, 0x17, 0x4F, 0x58, 0xB7, 0x62, 0x1B, 0xC9, 0x6E, 0xB0, 0x6F,
+ 0x40, 0x59, 0x4E, 0x09, 0xD4, 0x20, 0xC6, 0x99, 0x39, 0x09, 0x59, 0x3C, 0x2D, 0x22, 0x20, 0x44, 0xFA, 0xCF, 0x19, 0xA6,
+ 0xFB, 0x6F, 0x52, 0x14, 0xB9, 0x95, 0x0C, 0xD5, 0x88, 0xDB, 0xB4, 0x4B, 0x35, 0x2F, 0x52, 0x1B, 0x37, 0x15, 0x19, 0x8F,
+ 0x8F, 0x52, 0x92, 0x94, 0xCD, 0xD9, 0x8A, 0x42, 0x23, 0x3E, 0xE1, 0x8D, 0x01, 0xDE, 0x9C, 0xE7, 0x2B, 0xF0, 0xC7, 0x8A,
+ 0x5E, 0x3B, 0xE4, 0x2C, 0x1F, 0x61, 0xE8, 0xE5, 0x3B, 0xDB, 0x13, 0x54, 0x0D, 0x22, 0xEB, 0x82, 0x2A, 0x51, 0x8C, 0x59,
+ 0x4A, 0xDA, 0xC6, 0xC0, 0x55, 0xB2, 0x4A, 0x49, 0xB3, 0x1C, 0x3F, 0x21, 0xB4, 0x16, 0x4B, 0x67, 0xCD, 0x28, 0x80, 0x0B,
+ 0x89, 0x0A, 0xA0, 0xBC, 0xA1, 0xB5, 0x3A, 0x33, 0x5B, 0xAD, 0xB0, 0x4C, 0x02, 0x2E, 0x7E, 0x0D, 0xDA, 0xD0, 0x42, 0x48,
+ 0x4D, 0x48, 0x63, 0x14, 0x33, 0x7D, 0xC2, 0x14, 0x5A, 0x0E, 0x3B, 0xB7, 0xEC, 0x67, 0x3A, 0x9F, 0x1C, 0x9E, 0xD8, 0xD7,
+ 0xD1, 0x6F, 0x78, 0x73, 0x9F, 0x7F, 0xFE, 0xC5, 0x7F, 0x5F, 0x7D, 0xF9, 0x5B, 0xC3, 0x4B, 0x57, 0xF3, 0x6A, 0x50, 0x1C,
+ 0xE1, 0x5A, 0x0F, 0xB5, 0x0F, 0xA0, 0x09, 0x1C, 0xA2, 0xB5, 0xAE, 0xAD, 0xB1, 0xB4, 0x1E, 0xAA, 0x44, 0x59, 0x66, 0x31,
+ 0x29, 0x36, 0xF3, 0x19, 0xAC, 0x3E, 0x26, 0x28, 0x6A, 0xD6, 0xC4, 0xE9, 0x2B, 0x97, 0x6D, 0x66, 0x36, 0x0E, 0x3B, 0x68,
+ 0x71, 0xD7, 0xD0, 0x55, 0x97, 0x5F, 0x03, 0xBF, 0x88, 0x0C, 0x8A, 0x72, 0x3D, 0x2E, 0x30, 0xBA, 0x30, 0x51, 0xC7, 0x90,
+ 0x4C, 0xC1, 0xC4, 0x03, 0x78, 0x0F, 0xA4, 0x46, 0xC4, 0x58, 0x2E, 0x78, 0x4B, 0x25, 0x02, 0x44, 0x25, 0xD8, 0x3B, 0xD2,
+ 0x57, 0x20, 0x92, 0xC8, 0x4C, 0x84, 0xC8, 0x35, 0xDD, 0x3D, 0xC6, 0xD1, 0x04, 0x64, 0xD3, 0x23, 0x52, 0xA8, 0xD1, 0xB6,
+ 0x9D, 0xA7, 0xE8, 0xD5, 0xD4, 0xD3, 0x71, 0x85, 0x93, 0x71, 0x5F, 0x61, 0xE7, 0x64, 0xE9, 0x3B, 0x3A, 0x18, 0xC5, 0x54,
+ 0x2D, 0x10, 0x09, 0x8A, 0x56, 0x8C, 0xA0, 0x2B, 0xC0, 0x5F, 0xB5, 0x68, 0xE7, 0x11, 0x61, 0x90, 0x29, 0xAB, 0x52, 0x39,
+ 0xF5, 0x68, 0x48, 0x08, 0x0A, 0xE6, 0x39, 0xC4, 0x5E, 0x21, 0xFE, 0x19, 0x4D, 0x08, 0xE7, 0xB2, 0x50, 0xF8, 0x65, 0x78,
+ 0x80, 0x77, 0x48, 0x22, 0x35, 0x7D, 0xB6, 0x33, 0xAB, 0x02, 0xA0, 0x29, 0xB2, 0x00, 0xF1, 0x69, 0xE3, 0x27, 0x4F, 0xBF,
+ 0x68, 0x6A, 0x7F, 0xC7, 0xD0, 0x91, 0x03, 0xD7, 0x4A, 0x7B, 0x2E, 0xA3, 0xE8, 0x95, 0x17, 0x5E, 0x35, 0x6C, 0x2D, 0x36,
+ 0x16, 0x7C, 0xFC, 0xF2, 0xF3, 0x2F, 0xC1, 0x2B, 0x6D, 0xAE, 0x68, 0xE8, 0xA8, 0x6B, 0x5B, 0xDC, 0x35, 0x08, 0x6B, 0x08,
+ 0xEE, 0x22, 0x35, 0x04, 0x0E, 0x41, 0xC9, 0x5D, 0x0D, 0xE3, 0x28, 0xB3, 0xB8, 0x30, 0x25, 0x0F, 0x59, 0x87, 0x2F, 0x08,
+ 0x59, 0xBF, 0x72, 0x73, 0x5F, 0x6B, 0x3F, 0xFD, 0x8C, 0x2B, 0x0E, 0x5C, 0xF9, 0x8D, 0xAF, 0xBF, 0x7C, 0xFC, 0xAA, 0x1B,
+ 0xAA, 0xF3, 0x2B, 0xDB, 0xEB, 0xBB, 0x32, 0x63, 0x52, 0x79, 0x4E, 0x31, 0x83, 0x01, 0x14, 0x20, 0x83, 0xFB, 0x42, 0xA4,
+ 0xCF, 0x42, 0xB8, 0x44, 0x5A, 0x02, 0x03, 0xD2, 0x97, 0xEB, 0x0C, 0xA7, 0x13, 0xA7, 0xFD, 0x41, 0x5C, 0x8D, 0x37, 0xCC,
+ 0xAD, 0x66, 0x44, 0x2C, 0xC6, 0x3B, 0x6E, 0x30, 0x30, 0xA5, 0x96, 0x1B, 0x7E, 0xA5, 0x52, 0x4B, 0x77, 0xE0, 0xC8, 0xAB,
+ 0x00, 0xCD, 0x7C, 0x2C, 0xF4, 0xAB, 0xE1, 0x5B, 0xF3, 0x57, 0x05, 0x88, 0x1F, 0xA8, 0x0E, 0xB4, 0x43, 0x29, 0x66, 0x6E,
+ 0x28, 0x37, 0x27, 0x2F, 0x11, 0xBA, 0x81, 0x78, 0x31, 0x70, 0x23, 0x77, 0x25, 0x76, 0x3B, 0x7B, 0x19, 0xCC, 0x5D, 0xC5,
+ 0x22, 0x79, 0x02, 0x64, 0x9E, 0x42, 0x71, 0x02, 0x6D, 0x33, 0x78, 0xFC, 0x80, 0xBE, 0x8A, 0x64, 0x6F, 0x60, 0x91, 0x49,
+ 0x2E, 0xD3, 0x48, 0xF0, 0x63, 0x43, 0x22, 0x7D, 0x2F, 0xF5, 0x1D, 0x77, 0xE6, 0x39, 0xBC, 0xDD, 0x23, 0x07, 0xAF, 0x59,
+ 0xDC, 0xBB, 0x22, 0x3D, 0x2A, 0xE5, 0xFA, 0x63, 0xD7, 0x7F, 0xFA, 0x5F, 0x61, 0x2D, 0xF2, 0x03, 0x6F, 0xEE, 0xB5, 0x57,
+ 0xBF, 0xB3, 0x71, 0xCD, 0x66, 0x32, 0x57, 0x5C, 0x61, 0xA8, 0x13, 0x7A, 0x1D, 0x24, 0xFB, 0x45, 0x86, 0xCE, 0x4E, 0x6F,
+ 0x83, 0xB2, 0x51, 0x7C, 0x37, 0x2B, 0x2E, 0x63, 0xE7, 0x96, 0xBD, 0xB0, 0xAC, 0x07, 0x5B, 0x7B, 0x9F, 0xFB, 0xFA, 0x0B,
+ 0xEF, 0xFF, 0xE2, 0xC3, 0x57, 0x5F, 0xFA, 0xEE, 0xB2, 0x9E, 0xE5, 0xE8, 0x4C, 0xDE, 0x40, 0x66, 0x21, 0x31, 0xA6, 0x24,
+ 0x83, 0x41, 0x50, 0x61, 0x41, 0x56, 0x0E, 0x12, 0xB7, 0x49, 0x91, 0x20, 0x8C, 0xAD, 0x0C, 0x28, 0xD9, 0x72, 0x49, 0x9D,
+ 0xA5, 0x6C, 0x86, 0x42, 0x20, 0xB4, 0x09, 0x74, 0x23, 0x4F, 0x16, 0x80, 0x62, 0xBC, 0x63, 0x13, 0x53, 0x1C, 0xC8, 0x9B,
+ 0x02, 0x49, 0x95, 0x43, 0x48, 0xD0, 0x5B, 0x57, 0xF4, 0x63, 0x6C, 0xDF, 0x2B, 0x7D, 0xFD, 0x15, 0x0A, 0x40, 0x0E, 0xA2,
+ 0x03, 0x2B, 0x71, 0x35, 0x70, 0x21, 0xDE, 0xE4, 0x19, 0xD2, 0x64, 0x1E, 0xEC, 0x62, 0xCC, 0x59, 0x99, 0x94, 0x66, 0x0B,
+ 0x83, 0xAB, 0x00, 0xBD, 0x50, 0xB6, 0xA5, 0xEA, 0xCF, 0x3A, 0x84, 0xF3, 0x6A, 0x85, 0x96, 0x6E, 0xE6, 0xE8, 0xC0, 0xA0,
+ 0x2D, 0xF6, 0x22, 0x51, 0x4B, 0x67, 0xB6, 0x0C, 0x69, 0x25, 0xB9, 0x0C, 0x8F, 0xA6, 0xED, 0x43, 0x52, 0x7F, 0xEE, 0xE9,
+ 0xE7, 0x06, 0xCC, 0xF2, 0xDB, 0xB6, 0x61, 0x27, 0xA2, 0x24, 0x97, 0x67, 0x03, 0xC1, 0xEF, 0x7E, 0xF7, 0x07, 0xDC, 0x81,
+ 0x5D, 0x05, 0x42, 0xE6, 0xFD, 0xE4, 0xD3, 0x6F, 0x3C, 0xF7, 0x22, 0xAC, 0x3A, 0x44, 0xBF, 0xBC, 0x7B, 0x29, 0x9C, 0xEA,
+ 0x25, 0x9D, 0x43, 0x83, 0x6D, 0xFD, 0x03, 0x2D, 0xBD, 0x7D, 0xAD, 0xA4, 0x4F, 0x74, 0xE0, 0x1B, 0x2F, 0xDF, 0x7F, 0x0C,
+ 0x34, 0x3B, 0x7E, 0xF4, 0xDA, 0xDF, 0x7C, 0xF8, 0x87, 0xFF, 0xFC, 0xE7, 0x3F, 0xBF, 0xFD, 0xCD, 0x1F, 0xAF, 0x3A, 0x74,
+ 0x9C, 0xED, 0x53, 0xDD, 0x4D, 0x5D, 0x15, 0xB9, 0xA5, 0xE8, 0xA9, 0x92, 0x69, 0x7E, 0x96, 0x0C, 0x5B, 0x0A, 0x73, 0x0A,
+ 0x24, 0x0C, 0xB8, 0x88, 0xAF, 0xF6, 0xCE, 0xAF, 0xCA, 0xB2, 0x8B, 0x79, 0x26, 0x61, 0x9F, 0x0C, 0x82, 0xE1, 0x1D, 0x75,
+ 0x0C, 0x6A, 0xD0, 0x36, 0x06, 0xCF, 0x27, 0xC2, 0x6B, 0xE8, 0x76, 0xCB, 0x02, 0xA7, 0x00, 0xB6, 0x01, 0x59, 0x4D, 0x9E,
+ 0xBB, 0xD6, 0xE4, 0xF5, 0x93, 0x9E, 0x72, 0x21, 0x7D, 0x5D, 0x3E, 0xCA, 0x1C, 0xB6, 0xF2, 0x35, 0x35, 0xD4, 0xC8, 0x23,
+ 0x50, 0x59, 0x0D, 0x47, 0x55, 0x76, 0x2B, 0x28, 0x6F, 0xBB, 0xBC, 0xA0, 0xBC, 0xA2, 0xB0, 0x82, 0xA5, 0x66, 0x2E, 0xD2,
+ 0x37, 0xB9, 0x10, 0x86, 0x5F, 0x55, 0x5C, 0xCD, 0xAA, 0x2C, 0xAA, 0xAA, 0x28, 0x16, 0x57, 0x30, 0x04, 0x1E, 0x61, 0x30,
+ 0xB8, 0xC1, 0x40, 0x8A, 0x4F, 0x49, 0x27, 0x52, 0xCC, 0x1C, 0x26, 0x31, 0x13, 0x38, 0xC2, 0x15, 0x68, 0xBD, 0xC5, 0x87,
+ 0x45, 0x86, 0x07, 0x06, 0xC3, 0xA3, 0x3A, 0xFF, 0xEC, 0x71, 0xE3, 0xC7, 0x8D, 0x5F, 0xD2, 0x37, 0x7C, 0xEC, 0xF0, 0x75,
+ 0x55, 0xC5, 0x55, 0xB5, 0x65, 0x75, 0xAF, 0xBF, 0xF6, 0x06, 0x0A, 0x40, 0x0D, 0x9F, 0x7E, 0xFA, 0x5F, 0x2E, 0xFE, 0xF2,
+ 0xD7, 0xBF, 0x1F, 0x3F, 0x7A, 0x1C, 0xD3, 0x5E, 0xDE, 0xBB, 0x74, 0xED, 0x92, 0xD5, 0x2B, 0x97, 0xAE, 0x5A, 0xB1, 0x64,
+ 0xD5, 0xAA, 0x25, 0xAB, 0x96, 0xF4, 0x2E, 0x81, 0xE6, 0x75, 0x68, 0xF7, 0xE1, 0xAD, 0xEB, 0xB6, 0xBE, 0xF3, 0xC3, 0xF7,
+ 0x3E, 0x63, 0xCB, 0xEE, 0x89, 0xCF, 0xFF, 0xFD, 0x3F, 0x1F, 0x3F, 0xFF, 0xEC, 0x4B, 0x6B, 0xD8, 0x1C, 0x38, 0xB8, 0x82,
+ 0x84, 0xAA, 0xA9, 0x82, 0x4D, 0x7A, 0xD5, 0xC8, 0xD7, 0xDB, 0x1D, 0xC2, 0xC6, 0xCB, 0x32, 0x05, 0x76, 0x10, 0x3D, 0x12,
+ 0x47, 0xEE, 0x6C, 0x32, 0x90, 0x2A, 0xD2, 0xE4, 0x72, 0x0E, 0x87, 0x2E, 0x5F, 0x83, 0x99, 0x43, 0x45, 0x31, 0x3A, 0x10,
+ 0x58, 0x73, 0x9A, 0x10, 0x99, 0xB9, 0xAE, 0xF9, 0x3B, 0x43, 0x37, 0x85, 0x23, 0x6B, 0xE9, 0x27, 0x2B, 0x00, 0xB9, 0xF3,
+ 0xF1, 0x47, 0xE9, 0x00, 0xAB, 0xD7, 0x1A, 0xCA, 0x0C, 0x4C, 0x1C, 0x03, 0x1F, 0x21, 0xB1, 0x1A, 0x39, 0x96, 0xE6, 0xBA,
+ 0xCC, 0x64, 0x23, 0x7D, 0x15, 0x31, 0xB2, 0xD6, 0x60, 0x80, 0x1A, 0x24, 0x56, 0x9B, 0x92, 0x4D, 0x62, 0x89, 0x70, 0x52,
+ 0x84, 0x5B, 0xE8, 0xC0, 0x91, 0xC9, 0x8B, 0x9C, 0xC9, 0x09, 0x91, 0x2D, 0xAD, 0x90, 0xF7, 0x47, 0x66, 0xC9, 0xFB, 0xA0,
+ 0x74, 0xC2, 0x15, 0x08, 0x0C, 0xB1, 0x61, 0xB1, 0x34, 0x9C, 0xA9, 0xA7, 0x2E, 0xBA, 0xE0, 0xC2, 0x0B, 0xCF, 0x38, 0x17,
+ 0xBE, 0xF4, 0x35, 0x57, 0xDD, 0x02, 0x99, 0x0E, 0x04, 0xB8, 0xFB, 0xB6, 0x7B, 0xD8, 0xDC, 0x41, 0x84, 0x00, 0x94, 0x34,
+ 0x4E, 0xBC, 0xFA, 0xEA, 0x6B, 0x6B, 0x86, 0xD7, 0xE2, 0x13, 0x5B, 0x56, 0x6D, 0xDA, 0xBE, 0x61, 0x3B, 0xFB, 0x32, 0x37,
+ 0xAE, 0x5E, 0xBF, 0x77, 0xC7, 0xBE, 0x43, 0x7B, 0x0F, 0xBF, 0xFD, 0xC6, 0x0F, 0x3F, 0xFF, 0x82, 0x98, 0x2E, 0xCF, 0x47,
+ 0x13, 0xBF, 0xF9, 0xF5, 0xEF, 0x0F, 0xEE, 0x3A, 0xC8, 0x46, 0xC1, 0x45, 0x8D, 0xD4, 0x19, 0x6D, 0x2D, 0xE5, 0x8D, 0xA8,
+ 0xC1, 0x64, 0xC9, 0x2A, 0x53, 0xE9, 0x4F, 0x94, 0x66, 0x17, 0x03, 0x3E, 0x48, 0x1F, 0xF5, 0x90, 0x8C, 0x11, 0x42, 0x6A,
+ 0xCD, 0x0E, 0x03, 0xFD, 0x8C, 0x92, 0xD4, 0x51, 0xD9, 0x18, 0x22, 0x97, 0xD5, 0x84, 0x19, 0x2D, 0x48, 0xC3, 0x43, 0x8B,
+ 0x61, 0x37, 0x0B, 0xB2, 0x3A, 0x70, 0xC2, 0xAF, 0x4A, 0xDF, 0x62, 0x8E, 0x15, 0xBA, 0xF7, 0x02, 0x21, 0xF8, 0xE8, 0x0E,
+ 0x05, 0x87, 0x9C, 0xAD, 0xCC, 0x7A, 0x97, 0x7B, 0xA3, 0x8C, 0x62, 0x97, 0x5D, 0x8C, 0x5D, 0x94, 0x94, 0x15, 0x1A, 0x9E,
+ 0x9A, 0xC9, 0xFA, 0x25, 0xEA, 0x16, 0x09, 0x7F, 0x56, 0x2A, 0x64, 0x53, 0x64, 0x08, 0xB5, 0xB6, 0x44, 0xEA, 0x38, 0x65,
+ 0x96, 0x0B, 0xCA, 0xE9, 0xC7, 0x70, 0x43, 0x82, 0xFA, 0x3E, 0xEF, 0x3B, 0x37, 0x5D, 0xDE, 0x99, 0xEB, 0x0A, 0xA9, 0xE8,
+ 0x20, 0x3E, 0x22, 0x21, 0x26, 0x2C, 0x8A, 0xF9, 0xD7, 0xC2, 0xF9, 0x01, 0x93, 0x2E, 0x1E, 0x7F, 0xB6, 0xCF, 0x99, 0xD0,
+ 0xB3, 0xAE, 0xBE, 0xF2, 0xA6, 0xCD, 0xAB, 0x2F, 0x43, 0x0D, 0x87, 0xF7, 0x1C, 0xFE, 0xF7, 0xBF, 0xFF, 0xA3, 0x0E, 0x21,
+ 0x1B, 0xC1, 0x4F, 0x9C, 0xF8, 0xE3, 0x1F, 0xFF, 0x74, 0xCB, 0xF5, 0xB7, 0xB2, 0xFF, 0x72, 0xCB, 0xCA, 0x8D, 0xF0, 0xE0,
+ 0x77, 0x6F, 0xDD, 0x83, 0xAA, 0x3E, 0xFC, 0xF0, 0x43, 0xB3, 0x2D, 0xE7, 0x53, 0x91, 0xBF, 0xE1, 0x60, 0xB3, 0x91, 0xE6,
+ 0x89, 0xC7, 0x9E, 0xDE, 0xBE, 0x76, 0x1B, 0xDB, 0x72, 0x16, 0x35, 0xD0, 0x02, 0x61, 0x57, 0x65, 0x03, 0x59, 0x1F, 0xB1,
+ 0x81, 0xA5, 0x74, 0x0D, 0x14, 0x40, 0xE5, 0x88, 0xF9, 0x23, 0x77, 0xEA, 0x21, 0xF9, 0x20, 0xA5, 0x75, 0xC4, 0x98, 0x86,
+ 0x62, 0xD3, 0x7D, 0x29, 0x00, 0x15, 0xA4, 0x55, 0x85, 0x1A, 0x24, 0xB7, 0x36, 0xD9, 0x9D, 0x3B, 0xE1, 0x71, 0x5C, 0xC1,
+ 0x19, 0x3E, 0xA7, 0x08, 0xC6, 0x9E, 0x12, 0x88, 0xC6, 0x48, 0x9F, 0x0F, 0xAE, 0x9F, 0x9D, 0x65, 0x74, 0x90, 0x6B, 0x09,
+ 0x4F, 0x42, 0x90, 0x1F, 0x21, 0x70, 0x8F, 0xE6, 0xAB, 0x1A, 0x5E, 0x94, 0x87, 0x1A, 0x55, 0x54, 0x49, 0x09, 0x8A, 0x0E,
+ 0x4C, 0x11, 0x57, 0xC3, 0x3B, 0x96, 0xD9, 0x40, 0x69, 0x6D, 0x63, 0x79, 0xBD, 0xEC, 0xD4, 0x90, 0xC1, 0x0E, 0x1F, 0x83,
+ 0x32, 0x9B, 0x38, 0x2F, 0xDA, 0x72, 0xAC, 0x29, 0x4B, 0x66, 0x1D, 0xD2, 0xC2, 0x4D, 0x96, 0x71, 0x98, 0x4C, 0x25, 0xE3,
+ 0x4D, 0xDB, 0x27, 0x26, 0x45, 0xD4, 0x10, 0x19, 0xEB, 0xA8, 0x61, 0xDE, 0xBC, 0x4B, 0xC6, 0x4F, 0x38, 0xDD, 0xE7, 0x34,
+ 0xF8, 0xFE, 0x57, 0x1E, 0xBA, 0x66, 0xDF, 0xEE, 0xA3, 0xBC, 0x08, 0xE2, 0x46, 0xEE, 0x46, 0xC4, 0x9F, 0xEB, 0x66, 0x1B,
+ 0x4A, 0xBA, 0x5F, 0xFD, 0xEA, 0xD7, 0x2F, 0xBF, 0xFC, 0xEA, 0xCB, 0x2F, 0xBD, 0xF6, 0xF3, 0x9F, 0xBF, 0xAF, 0xBB, 0x3F,
+ 0x8C, 0x86, 0x44, 0x49, 0xB2, 0x3B, 0xCA, 0x6C, 0xCF, 0xF9, 0xE0, 0x57, 0xBF, 0xBB, 0x7C, 0xDF, 0xE5, 0xB8, 0x0B, 0x7B,
+ 0x46, 0x06, 0x5A, 0x07, 0x28, 0x32, 0x9A, 0x8D, 0x37, 0x60, 0xEF, 0x86, 0xB1, 0x51, 0x46, 0xFE, 0x86, 0xA0, 0x01, 0x2B,
+ 0x3A, 0x22, 0xE0, 0x95, 0xD9, 0x7F, 0xD9, 0x42, 0xEF, 0xB6, 0xB5, 0xA2, 0x89, 0x67, 0xD6, 0x95, 0xCB, 0x64, 0x9B, 0x8A,
+ 0x44, 0xBC, 0x47, 0xBC, 0x41, 0x74, 0xA0, 0xB1, 0x4D, 0xFD, 0x80, 0x3A, 0x63, 0x0C, 0x01, 0xC0, 0x86, 0x62, 0x44, 0xAF,
+ 0x3D, 0x95, 0x31, 0x86, 0xAF, 0x3A, 0xB0, 0x4B, 0xE2, 0x81, 0x97, 0xA6, 0x6A, 0xF9, 0xAA, 0x5E, 0x8E, 0xAA, 0x7D, 0x02,
+ 0x5E, 0xE9, 0x78, 0x09, 0x21, 0x01, 0xE0, 0x12, 0x1D, 0x08, 0xA9, 0x1F, 0xB9, 0xEB, 0x00, 0x00, 0x7F, 0xE7, 0x03, 0x38,
+ 0x94, 0x7F, 0x94, 0x41, 0xEF, 0x4F, 0xF8, 0x29, 0x86, 0x7D, 0x8F, 0x47, 0x4B, 0x02, 0xEE, 0x84, 0x04, 0xEC, 0x45, 0xDF,
+ 0x1F, 0x21, 0x81, 0x3A, 0x0B, 0x44, 0x4A, 0x8C, 0x4A, 0x8A, 0x8B, 0x88, 0xA1, 0xCD, 0xC0, 0x44, 0x3E, 0x60, 0xEE, 0xDC,
+ 0x4B, 0x2E, 0x9E, 0xC4, 0xE1, 0x02, 0x89, 0xA1, 0xF1, 0x44, 0xDA, 0xA3, 0x87, 0xAF, 0x69, 0xAC, 0x6A, 0x5A, 0xBD, 0x74,
+ 0xB5, 0xEE, 0xBA, 0x31, 0xE1, 0x41, 0x02, 0xB5, 0xF7, 0x47, 0x6C, 0xFF, 0x33, 0x91, 0xBE, 0xFD, 0x31, 0xAE, 0x20, 0x7B,
+ 0x05, 0x9F, 0x7F, 0xEE, 0xC5, 0x9D, 0x5B, 0x77, 0xAD, 0x5B, 0xBA, 0x86, 0x30, 0x3E, 0xD0, 0xDA, 0x87, 0x37, 0x68, 0xAD,
+ 0x87, 0x70, 0x59, 0xB8, 0x2F, 0xCE, 0x41, 0xD2, 0x45, 0x29, 0x4E, 0x6B, 0x84, 0xDF, 0x22, 0x7A, 0x1A, 0x85, 0x7C, 0x96,
+ 0x8E, 0xFA, 0x16, 0x50, 0x11, 0xC5, 0xF0, 0x64, 0xEC, 0x80, 0x58, 0x88, 0x43, 0x88, 0xDF, 0x18, 0x1D, 0x90, 0x50, 0x15,
+ 0xCB, 0xB4, 0xD9, 0xE9, 0x48, 0xD3, 0x04, 0x93, 0x30, 0x90, 0x46, 0x24, 0x10, 0x2F, 0x17, 0xBC, 0x75, 0x71, 0x7F, 0x8C,
+ 0xD0, 0xBD, 0x77, 0x71, 0x05, 0x9F, 0x11, 0x72, 0xB6, 0xCB, 0xBC, 0xFC, 0x32, 0xD2, 0xA4, 0xFC, 0x7B, 0x41, 0x46, 0x29,
+ 0xB8, 0x94, 0x25, 0x28, 0xA5, 0x1C, 0x4E, 0x50, 0x56, 0xDF, 0x52, 0xD5, 0xC4, 0x7B, 0x95, 0x0F, 0xD0, 0xC0, 0x26, 0x56,
+ 0xF9, 0x18, 0xB4, 0x3F, 0xB5, 0xFF, 0xCC, 0x40, 0x46, 0x1A, 0xD7, 0x6C, 0x8A, 0xCB, 0x33, 0xC1, 0xD9, 0xD4, 0x68, 0x3A,
+ 0xC4, 0x60, 0xAA, 0xA5, 0xEF, 0x92, 0xA8, 0x80, 0x1A, 0x98, 0x76, 0x11, 0x9F, 0x69, 0x38, 0xA3, 0x86, 0x10, 0xFF, 0x85,
+ 0x0C, 0xE5, 0x27, 0x5C, 0x3C, 0x1E, 0x35, 0x24, 0x84, 0xC4, 0xE1, 0x0D, 0xA8, 0xA1, 0xB5, 0xAE, 0x95, 0x20, 0xFC, 0xDE,
+ 0x4F, 0x7F, 0x31, 0xB2, 0xEB, 0xE6, 0x0B, 0x7C, 0xE2, 0x13, 0xA4, 0xAC, 0x1B, 0x02, 0x35, 0x5A, 0xA8, 0xA3, 0xC8, 0x5E,
+ 0x4D, 0xF3, 0xC3, 0x23, 0xE0, 0xD8, 0xCD, 0xD7, 0xDD, 0xB2, 0x6D, 0xFD, 0xF6, 0xE1, 0xC1, 0xE1, 0x15, 0xFD, 0xCB, 0x69,
+ 0x81, 0xB0, 0x47, 0x0A, 0x11, 0x93, 0xDA, 0x8A, 0xE8, 0xAB, 0x5A, 0x78, 0xC3, 0xBD, 0xCD, 0x8B, 0x06, 0x5B, 0xFB, 0x06,
+ 0xDB, 0xFB, 0xDA, 0xEB, 0x9A, 0x77, 0x6F, 0xDD, 0xCD, 0xF3, 0x7B, 0x5B, 0xBA, 0xD9, 0xC3, 0x43, 0xFC, 0xE7, 0x56, 0x3B,
+ 0x25, 0x92, 0x59, 0x49, 0xE6, 0x5A, 0x4A, 0x06, 0x25, 0x6A, 0xA0, 0xAC, 0x23, 0x6D, 0x95, 0x89, 0xBF, 0x43, 0x84, 0x11,
+ 0xD1, 0xA7, 0x3A, 0x56, 0x4F, 0x7B, 0x8A, 0x2E, 0xA1, 0x7E, 0x40, 0x32, 0x40, 0xF7, 0xC2, 0x31, 0x7F, 0x05, 0x22, 0x5D,
+ 0x3E, 0x8E, 0xC4, 0x19, 0x6D, 0x8F, 0x9E, 0x6E, 0xEB, 0x5D, 0x2F, 0xF9, 0x00, 0xFD, 0xF3, 0xEF, 0x65, 0x0B, 0x15, 0xF8,
+ 0xCE, 0xDE, 0x92, 0x7C, 0x09, 0x5F, 0x8A, 0x45, 0x14, 0xAE, 0x92, 0x78, 0x94, 0xD7, 0x77, 0xD6, 0xB5, 0xE1, 0xF2, 0x7C,
+ 0x48, 0x3E, 0x00, 0x29, 0x3C, 0x85, 0x15, 0x1F, 0x92, 0xFE, 0x81, 0xC4, 0x0C, 0xE3, 0xCE, 0xDA, 0x0F, 0x00, 0x8E, 0x58,
+ 0x9A, 0xB7, 0xF1, 0xE6, 0x78, 0x1F, 0x66, 0x2E, 0x86, 0x2B, 0x24, 0x32, 0x00, 0x88, 0x0D, 0x8B, 0x63, 0x2A, 0x10, 0xB4,
+ 0xC0, 0x7F, 0xFE, 0xAC, 0xD9, 0x17, 0x5E, 0x78, 0x21, 0x6A, 0xC8, 0x8C, 0x4F, 0x27, 0x44, 0x1F, 0xDA, 0x7F, 0x65, 0x67,
+ 0x53, 0xD7, 0x9A, 0x65, 0x6B, 0xBF, 0xF7, 0xFA, 0x9B, 0x8A, 0x3C, 0xBA, 0x0F, 0x90, 0x65, 0xF0, 0x47, 0x9C, 0x80, 0xB8,
+ 0xFD, 0xD1, 0xBF, 0xFF, 0xF3, 0xCF, 0x7F, 0x7E, 0xF4, 0xCF, 0x7F, 0xFE, 0x93, 0x12, 0x8F, 0x5F, 0x69, 0xFC, 0x20, 0xCD,
+ 0x3D, 0xB8, 0xE7, 0xF0, 0xFA, 0x55, 0x1B, 0x70, 0x26, 0x34, 0xB1, 0xB4, 0x6B, 0xF1, 0x50, 0x5B, 0x7F, 0x5F, 0x4B, 0x37,
+ 0x05, 0xC7, 0x40, 0x5B, 0xEF, 0xE0, 0xA2, 0x21, 0x36, 0x8C, 0xAC, 0xEE, 0x5F, 0x31, 0xD8, 0xD1, 0xBF, 0x77, 0xFB, 0x5E,
+ 0x12, 0x2A, 0xFE, 0xE4, 0xBE, 0x3B, 0xEF, 0xE7, 0x23, 0x2C, 0xED, 0x5E, 0xBC, 0x64, 0xD1, 0x62, 0x9E, 0x46, 0x4E, 0x6C,
+ 0xF6, 0xF3, 0xD0, 0xC1, 0xAD, 0xE7, 0xB3, 0x88, 0x32, 0xB2, 0x44, 0x07, 0x04, 0x67, 0xFA, 0xB8, 0x2C, 0x87, 0x89, 0x44,
+ 0x10, 0x4E, 0xCC, 0xC9, 0x4C, 0x84, 0x8B, 0xE6, 0x28, 0xC3, 0x8B, 0xFE, 0x5E, 0xD1, 0x8F, 0xE8, 0x40, 0x73, 0x47, 0x2B,
+ 0x6E, 0x2F, 0x81, 0x92, 0x6B, 0xFB, 0xB8, 0x4E, 0xC0, 0x35, 0x97, 0x90, 0xC7, 0xF3, 0x49, 0xE3, 0xCA, 0xA4, 0x7D, 0x96,
+ 0x59, 0xCC, 0x76, 0x67, 0x2E, 0xD8, 0x28, 0xC9, 0x07, 0x83, 0x6E, 0x4E, 0xDB, 0x15, 0xD1, 0x0F, 0x75, 0xF4, 0xF3, 0x08,
+ 0xED, 0x36, 0x4C, 0x0C, 0x74, 0xC2, 0x57, 0x04, 0x94, 0x72, 0xD8, 0x09, 0x24, 0x09, 0x12, 0xDE, 0x20, 0x9D, 0x83, 0xD4,
+ 0x3C, 0xA2, 0x82, 0x62, 0x25, 0xED, 0x23, 0x02, 0x03, 0x3A, 0x80, 0xE5, 0x99, 0x18, 0x9E, 0x10, 0x43, 0xD1, 0x10, 0x14,
+ 0x19, 0x38, 0x7F, 0xFE, 0x3C, 0xDF, 0xD9, 0xE7, 0x9E, 0x37, 0x8E, 0xE3, 0x59, 0x40, 0xBC, 0xEB, 0x8F, 0xDF, 0x4E, 0xE9,
+ 0xD0, 0xD5, 0xDC, 0x45, 0x3E, 0xCA, 0x26, 0x83, 0xDF, 0xFF, 0xFE, 0x8F, 0x9F, 0x7C, 0x22, 0x22, 0x26, 0xFF, 0x31, 0x3B,
+ 0x93, 0x3F, 0x61, 0x47, 0x14, 0x60, 0xF5, 0xE1, 0x6F, 0xFE, 0xC0, 0xFA, 0xC3, 0x6F, 0xFF, 0xFC, 0xB7, 0xBF, 0xFD, 0x43,
+ 0x53, 0x29, 0x75, 0x07, 0xB6, 0xF0, 0xEF, 0xDA, 0xB6, 0x7B, 0xE3, 0xF0, 0xFA, 0x4D, 0x2B, 0x36, 0xAC, 0x59, 0xB6, 0x66,
+ 0xF5, 0x00, 0x9B, 0x67, 0x97, 0x73, 0xE6, 0xC2, 0xAA, 0xC1, 0x15, 0xE8, 0x95, 0x7D, 0xFD, 0x64, 0xB7, 0x6C, 0xF0, 0xFF,
+ 0xE0, 0x03, 0x02, 0xFB, 0xA7, 0xFF, 0xFD, 0xEF, 0x7F, 0xFE, 0xFC, 0xE7, 0x3F, 0x6F, 0x5E, 0xB3, 0x99, 0xDF, 0xAE, 0x5C,
+ 0xBC, 0x92, 0xB6, 0x07, 0xB5, 0x61, 0x4F, 0x73, 0x37, 0xFE, 0x2D, 0x25, 0xBA, 0xEE, 0xCD, 0x22, 0x9D, 0x11, 0x09, 0x94,
+ 0x12, 0x18, 0xF2, 0x52, 0x72, 0xA0, 0xCF, 0xD0, 0xC7, 0x4D, 0x8B, 0x4D, 0x72, 0xA5, 0x3F, 0x82, 0xF8, 0xA7, 0x14, 0xBD,
+ 0xB1, 0x3C, 0xE1, 0x52, 0xFA, 0xA8, 0x64, 0xBD, 0x74, 0x49, 0x91, 0x7B, 0xB6, 0x24, 0xD1, 0x36, 0x23, 0xD6, 0x0B, 0x5B,
+ 0x34, 0xA2, 0x7C, 0xD3, 0xF9, 0x29, 0x64, 0xEA, 0x42, 0x37, 0xA6, 0xBE, 0xBC, 0xE9, 0xA5, 0x6F, 0xBC, 0xCC, 0x89, 0x11,
+ 0x7F, 0xFB, 0xDB, 0x5F, 0x7E, 0xF5, 0xC1, 0x87, 0x8F, 0x3D, 0xF8, 0x38, 0xF9, 0x38, 0xEF, 0xB2, 0xAF, 0x49, 0xDA, 0x6D,
+ 0xD2, 0xF5, 0x04, 0x7F, 0xAB, 0xD8, 0xD3, 0x51, 0x0F, 0x76, 0x91, 0x86, 0x4B, 0xF5, 0x9F, 0x6E, 0x48, 0x54, 0xB0, 0x7D,
+ 0x4C, 0x1E, 0xAD, 0x6A, 0xE0, 0x33, 0x98, 0xC0, 0x90, 0xC2, 0xD8, 0x8B, 0x8E, 0x34, 0x4C, 0xBA, 0x88, 0xA0, 0xB0, 0x85,
+ 0x0B, 0xFC, 0xE6, 0xCC, 0x9C, 0x71, 0xD6, 0x99, 0xA7, 0x53, 0x37, 0xAC, 0x59, 0xBA, 0x1E, 0x6F, 0x60, 0xEF, 0x0D, 0x71,
+ 0x95, 0x2D, 0xCA, 0xB7, 0xDC, 0x78, 0xC7, 0x0B, 0xCF, 0xBD, 0xFC, 0x83, 0xB7, 0xDF, 0x79, 0xEF, 0xDD, 0xF7, 0x7F, 0xFA,
+ 0x93, 0x5F, 0xBC, 0xFD, 0xE6, 0x8F, 0x19, 0x07, 0xBD, 0xF1, 0xDD, 0xB7, 0xDF, 0xFA, 0xFE, 0x8F, 0x7F, 0xF8, 0x83, 0x9F,
+ 0xFC, 0xF4, 0x27, 0x3F, 0xFF, 0xD5, 0x2F, 0x7F, 0x83, 0x1A, 0x34, 0x47, 0xB2, 0xFB, 0x35, 0x77, 0x6D, 0xDB, 0xB3, 0x61,
+ 0xE5, 0x86, 0x6D, 0xEB, 0xB7, 0x6D, 0x59, 0xBB, 0x45, 0x0E, 0x18, 0x59, 0xBB, 0x85, 0x92, 0x62, 0xC7, 0xA6, 0x1D, 0xBB,
+ 0xB7, 0xED, 0xDC, 0xBC, 0x72, 0xE3, 0x8B, 0xCF, 0xBD, 0xA4, 0xCE, 0xF4, 0xDF, 0x4F, 0xA5, 0x4A, 0x7F, 0xEA, 0xD1, 0xA7,
+ 0x51, 0xCF, 0xF6, 0xB5, 0x5B, 0xD7, 0xAF, 0x58, 0x2F, 0x9A, 0xE0, 0xE4, 0x85, 0x36, 0x8E, 0x6C, 0x58, 0xD4, 0x56, 0x6F,
+ 0x34, 0x41, 0xA3, 0x8C, 0x62, 0x28, 0xAB, 0x3C, 0x2B, 0x36, 0x3D, 0x3E, 0x28, 0x26, 0x35, 0x3A, 0xB9, 0xA2, 0xB8, 0x12,
+ 0x7A, 0x36, 0x33, 0x54, 0xC0, 0x67, 0xB4, 0xDC, 0x45, 0xD6, 0x5F, 0xB6, 0xC6, 0xEA, 0xC0, 0xCA, 0x7D, 0x24, 0x17, 0x76,
+ 0x8B, 0x49, 0xE5, 0x77, 0x48, 0x20, 0x32, 0xBD, 0xCF, 0xD4, 0xA8, 0x24, 0xBA, 0x17, 0x78, 0x03, 0x01, 0xE0, 0xEF, 0x7F,
+ 0xFF, 0x27, 0x9F, 0xF3, 0x5F, 0xFF, 0xFC, 0x3B, 0xE6, 0xC3, 0x5B, 0x07, 0x07, 0x1E, 0xBA, 0xF7, 0x61, 0x52, 0x72, 0x69,
+ 0x7C, 0x0A, 0x28, 0x71, 0x54, 0x01, 0x9B, 0xB3, 0x19, 0x04, 0x49, 0x54, 0x00, 0x49, 0xA5, 0x5F, 0x46, 0xDD, 0x6F, 0x86,
+ 0xDA, 0x9E, 0xF4, 0x39, 0x33, 0x2D, 0x21, 0x25, 0x25, 0x2E, 0x09, 0x50, 0xC2, 0x1B, 0x48, 0x93, 0xA2, 0xC9, 0x56, 0x03,
+ 0x43, 0x19, 0xD0, 0x4F, 0x9F, 0x72, 0x29, 0x87, 0x02, 0xB1, 0x03, 0xE7, 0xD8, 0x15, 0x37, 0x6F, 0x5C, 0xB7, 0x03, 0x63,
+ 0x6C, 0x6F, 0xE0, 0x8C, 0x99, 0xE5, 0x6C, 0x21, 0xBE, 0xF6, 0xE8, 0x0D, 0xF7, 0xDD, 0xF3, 0xE0, 0x83, 0xF7, 0x3D, 0x7A,
+ 0xFF, 0x3D, 0x0F, 0xB3, 0x73, 0xFF, 0xEB, 0x4F, 0x3D, 0xFF, 0xEC, 0xD3, 0x2F, 0xB0, 0x5E, 0x7D, 0xE9, 0xDB, 0xE8, 0x03,
+ 0x35, 0xE0, 0x1F, 0x72, 0x7C, 0x90, 0xD9, 0x44, 0x4E, 0x2A, 0xF5, 0xE1, 0x6F, 0x7E, 0x77, 0xF4, 0xE0, 0x95, 0x1C, 0xB1,
+ 0xB3, 0x6B, 0xCB, 0xAE, 0xFD, 0x3B, 0x77, 0x1F, 0xD8, 0xB5, 0xE7, 0xE0, 0xAE, 0x43, 0x07, 0x76, 0x1E, 0xD8, 0xB1, 0x79,
+ 0xFB, 0xA3, 0x0F, 0x3F, 0x61, 0xE3, 0x8A, 0x22, 0xD8, 0xBF, 0xFE, 0xFD, 0xD1, 0xB5, 0x57, 0x5C, 0x7B, 0xD9, 0x3A, 0x72,
+ 0xDF, 0xDD, 0xA8, 0x6D, 0xC3, 0xF2, 0x75, 0xB8, 0xC5, 0x50, 0xEF, 0xE2, 0xDE, 0xF6, 0x5E, 0x82, 0x04, 0x6A, 0x28, 0x4A,
+ 0xCD, 0x67, 0x10, 0x42, 0x55, 0x3F, 0xD4, 0xB9, 0x18, 0xD1, 0xB1, 0x65, 0x81, 0xE9, 0x69, 0x54, 0x70, 0x14, 0xF6, 0xA4,
+ 0x3A, 0x30, 0x96, 0x2E, 0x0A, 0xC0, 0xCB, 0xF5, 0x62, 0xCC, 0xE2, 0x71, 0x47, 0x07, 0x63, 0x4C, 0x5E, 0xEF, 0x8E, 0x74,
+ 0xD2, 0x73, 0xA4, 0xD7, 0x46, 0x12, 0xC6, 0x16, 0x09, 0xAD, 0x4A, 0x90, 0x1D, 0x83, 0x2A, 0x76, 0x12, 0xEA, 0x46, 0x49,
+ 0xAC, 0xF2, 0x5D, 0x13, 0x2A, 0x39, 0xB9, 0x80, 0x5D, 0xED, 0x06, 0x88, 0xBF, 0xF8, 0xE0, 0x83, 0x0F, 0x76, 0x6C, 0xD9,
+ 0x45, 0xD1, 0xC7, 0x68, 0x8C, 0xDC, 0x9C, 0xC4, 0x49, 0xE8, 0x8B, 0xF9, 0x95, 0xF8, 0x93, 0xB4, 0x68, 0xB2, 0x84, 0x46,
+ 0x68, 0x5B, 0x2B, 0x9A, 0x23, 0x69, 0xE5, 0x9C, 0x12, 0x93, 0x9E, 0x14, 0x93, 0x00, 0x2E, 0x25, 0x86, 0xC7, 0x47, 0x87,
+ 0xC4, 0x30, 0xB5, 0x0F, 0x9A, 0xED, 0xC7, 0xE0, 0x7E, 0xEA, 0x84, 0xA9, 0xBB, 0xB6, 0x1E, 0xDA, 0x75, 0xD9, 0x21, 0xC6,
+ 0x96, 0xE4, 0x2A, 0xCC, 0xD7, 0x68, 0x5A, 0x70, 0x3E, 0x0B, 0x00, 0xB2, 0x6D, 0xE3, 0xF6, 0xBD, 0xDB, 0xF7, 0x5D, 0xBE,
+ 0xF7, 0xCA, 0x5B, 0x6F, 0xBA, 0x93, 0x4D, 0xCB, 0x40, 0xF9, 0x3D, 0x77, 0x3F, 0x4C, 0x6F, 0xE3, 0xED, 0x1F, 0xBC, 0xF3,
+ 0xBB, 0xDF, 0xFE, 0x1F, 0x4D, 0xA2, 0x4C, 0xEC, 0x10, 0xC9, 0xFE, 0xE3, 0x5F, 0xFF, 0x7C, 0xFC, 0xD1, 0xA7, 0xA8, 0xDD,
+ 0x76, 0x6E, 0xDE, 0x09, 0x3A, 0xED, 0xBB, 0x6C, 0x1F, 0x67, 0x2B, 0xBC, 0xF2, 0xD2, 0xAB, 0x94, 0xE2, 0x60, 0x96, 0x86,
+ 0x71, 0x7D, 0x3E, 0xB7, 0x20, 0xDE, 0xF1, 0x2B, 0xAF, 0xDD, 0xB9, 0xE5, 0x32, 0x74, 0x46, 0x54, 0xA7, 0xDC, 0x23, 0x9C,
+ 0xE0, 0x0D, 0xF5, 0x25, 0x35, 0xE0, 0x01, 0x9A, 0xB8, 0xF1, 0xF8, 0xCD, 0xBF, 0xFB, 0xFD, 0x1F, 0x69, 0x11, 0x62, 0x22,
+ 0xE4, 0xEB, 0xA4, 0x76, 0x8C, 0xED, 0x8C, 0xC4, 0x47, 0xC4, 0xCD, 0x87, 0x62, 0x9D, 0x2C, 0x7D, 0x9E, 0x76, 0x0A, 0x1D,
+ 0xD8, 0x4E, 0x16, 0xBD, 0x5C, 0x77, 0x9C, 0x24, 0x35, 0xA1, 0x36, 0xCA, 0x45, 0x64, 0xCA, 0xF8, 0x4C, 0xC8, 0x5E, 0x30,
+ 0x7B, 0x7E, 0x4B, 0x23, 0x87, 0x4E, 0xAD, 0xA4, 0xEE, 0x4D, 0x0A, 0x8F, 0x27, 0x32, 0xDF, 0x71, 0xD3, 0x3D, 0x7F, 0xFE,
+ 0xB3, 0x6E, 0x15, 0xFE, 0xEC, 0x3F, 0xFF, 0xF9, 0xB7, 0xB1, 0xA9, 0x13, 0x94, 0x48, 0x75, 0x95, 0x0D, 0x18, 0x3E, 0x11,
+ 0x9B, 0x52, 0x4E, 0x0A, 0x72, 0xE9, 0xBA, 0xB8, 0x69, 0x75, 0xAA, 0x44, 0x66, 0xEB, 0x0D, 0x44, 0x33, 0x36, 0xC8, 0xAB,
+ 0xF9, 0x08, 0x83, 0x28, 0x2A, 0x51, 0xD2, 0xA4, 0xB0, 0xF0, 0x30, 0xBF, 0x85, 0xD3, 0x26, 0x4F, 0xB9, 0x68, 0xDC, 0xC5,
+ 0x1B, 0xD7, 0xEF, 0xDC, 0xB1, 0xF5, 0x10, 0x84, 0x4C, 0x3E, 0x3F, 0x69, 0x31, 0x31, 0xB3, 0xA9, 0xB2, 0x8E, 0x70, 0xBA,
+ 0x69, 0xC5, 0x66, 0x4E, 0x08, 0xE1, 0x7C, 0x8F, 0xCD, 0xAB, 0xB7, 0xED, 0xDB, 0x79, 0xE0, 0x9A, 0x2B, 0xAE, 0x45, 0x19,
+ 0x0F, 0xDD, 0xFF, 0x04, 0xEB, 0x7B, 0x6F, 0xFC, 0xE0, 0x8F, 0x7F, 0xF8, 0x8B, 0xD9, 0x39, 0xEB, 0x64, 0x4A, 0x2A, 0xDC,
+ 0x3F, 0xFD, 0xE9, 0x4F, 0xDF, 0x7B, 0xE3, 0x6D, 0x4A, 0xEE, 0x37, 0xDF, 0x7C, 0xEB, 0x2F, 0x7F, 0xF9, 0x8B, 0xCD, 0xB5,
+ 0xAC, 0x0E, 0x34, 0xC5, 0x12, 0x9D, 0xFD, 0xE3, 0x1F, 0x4F, 0x3F, 0xF9, 0xEC, 0xD1, 0xFD, 0x47, 0xB7, 0xAC, 0xDD, 0x2A,
+ 0x67, 0x60, 0x0C, 0x2C, 0xE7, 0x7F, 0x1D, 0xDE, 0x77, 0x84, 0xFE, 0x2E, 0x1E, 0xCF, 0x13, 0x5E, 0xFF, 0xD6, 0x77, 0xD9,
+ 0x39, 0xAB, 0xF4, 0x56, 0xC0, 0x33, 0x29, 0x36, 0x11, 0xFA, 0x37, 0xC2, 0x85, 0x75, 0xC0, 0x6D, 0x7A, 0x2C, 0xB7, 0xE2,
+ 0x07, 0x5F, 0xB6, 0x1C, 0x3F, 0x38, 0x25, 0x8B, 0xC6, 0xA1, 0x22, 0x19, 0x96, 0xA7, 0x2D, 0x43, 0x14, 0xBE, 0xE9, 0xFE,
+ 0xCF, 0x9E, 0x36, 0x0D, 0xCE, 0xE1, 0xB6, 0xCD, 0x7B, 0xD7, 0xAE, 0xDA, 0xDA, 0xDB, 0xB1, 0x98, 0x94, 0x89, 0xEC, 0x05,
+ 0x88, 0xB8, 0xFD, 0xD6, 0xBB, 0x68, 0x99, 0xA9, 0x29, 0x99, 0x1D, 0xDB, 0x9F, 0x53, 0xBE, 0xAE, 0x5B, 0xB9, 0x3E, 0x2D,
+ 0x2A, 0x85, 0x6C, 0x5A, 0x72, 0x09, 0x13, 0x0C, 0x64, 0xB0, 0x6E, 0x62, 0xB2, 0x6D, 0xF6, 0x42, 0x34, 0xE7, 0x11, 0x61,
+ 0x62, 0x39, 0x51, 0x3A, 0x0D, 0x68, 0x02, 0x64, 0x13, 0xC2, 0xE2, 0x19, 0x0F, 0xCC, 0x9F, 0x36, 0x77, 0xE6, 0xE4, 0x99,
+ 0x97, 0x6D, 0x39, 0xB8, 0x74, 0x70, 0x1D, 0xE9, 0x60, 0x46, 0x5C, 0x3A, 0x1E, 0x46, 0x29, 0x8E, 0x7B, 0x41, 0xBD, 0x5E,
+ 0xD2, 0xB9, 0x84, 0xB0, 0xC9, 0x81, 0x5E, 0x1B, 0x97, 0x6D, 0xDC, 0xB6, 0x61, 0x37, 0xA3, 0xE9, 0x23, 0xFB, 0x8F, 0xDE,
+ 0x76, 0xE3, 0x1D, 0x0F, 0x3F, 0xF0, 0xE4, 0xE3, 0x8F, 0x3C, 0xFD, 0x9D, 0x6F, 0x7F, 0xFF, 0x2F, 0x7F, 0xFE, 0x87, 0x1A,
+ 0x87, 0x00, 0x92, 0x04, 0xF2, 0x4F, 0x1D, 0x6B, 0x77, 0xAB, 0x09, 0x9B, 0xDA, 0x7A, 0xFD, 0xC0, 0x20, 0x18, 0x55, 0xB7,
+ 0x3C, 0xF7, 0xA3, 0x8F, 0xFE, 0xF9, 0xFE, 0xFB, 0xBF, 0xFA, 0xF1, 0x0F, 0xDF, 0xF9, 0xD9, 0xCF, 0x7E, 0xF1, 0xF7, 0x8F,
+ 0x64, 0xD6, 0xA4, 0x8F, 0x43, 0x48, 0x88, 0x0F, 0x8E, 0xE5, 0x5C, 0x09, 0xDA, 0x79, 0x73, 0x2E, 0x9D, 0x9E, 0x18, 0x11,
+ 0x8B, 0xE9, 0x10, 0xD5, 0x44, 0x07, 0xB1, 0x29, 0x2C, 0x8F, 0xE8, 0x4F, 0xAD, 0x09, 0x9F, 0x31, 0xD2, 0xD7, 0x8E, 0xA0,
+ 0x6D, 0x0D, 0x2A, 0x70, 0x1B, 0xC4, 0x10, 0x56, 0x88, 0x66, 0x93, 0x88, 0x1E, 0xFA, 0x54, 0xC0, 0xFC, 0x79, 0x34, 0x15,
+ 0xB0, 0x71, 0xBA, 0xF6, 0x3B, 0xB6, 0x1F, 0xDE, 0xB7, 0xE3, 0xC8, 0x9A, 0xE5, 0x1B, 0xEA, 0x2B, 0x1A, 0xA8, 0x59, 0x68,
+ 0x54, 0x90, 0xE1, 0x11, 0x21, 0x0D, 0x16, 0x1B, 0x65, 0x7C, 0xF1, 0x39, 0xBD, 0x04, 0x68, 0x10, 0x29, 0xE1, 0x89, 0x05,
+ 0x09, 0xD9, 0xB4, 0xFB, 0x65, 0xAE, 0x9B, 0xA2, 0x8D, 0x2D, 0xB9, 0x16, 0xC6, 0x03, 0x19, 0x1E, 0xD3, 0xF6, 0xD4, 0x3C,
+ 0xDA, 0xF4, 0xE0, 0x2C, 0x8B, 0xF9, 0x3B, 0x0D, 0x3E, 0x22, 0x1E, 0xFA, 0x9B, 0x37, 0xD9, 0x97, 0x82, 0x76, 0xE7, 0x96,
+ 0x83, 0xE5, 0x39, 0x55, 0xE9, 0xD1, 0xA9, 0xD4, 0x6E, 0x3C, 0xC8, 0x89, 0x06, 0x38, 0x04, 0xE7, 0x17, 0x70, 0x18, 0x06,
+ 0x8C, 0x3F, 0xB6, 0x6A, 0xA1, 0x95, 0x8E, 0x86, 0x45, 0xC3, 0x03, 0xAB, 0xD6, 0x2C, 0xDD, 0xB8, 0x79, 0xC3, 0x8E, 0xAB,
+ 0x0F, 0x5F, 0xFF, 0xF0, 0x43, 0x4F, 0x3D, 0xF6, 0xE8, 0xD3, 0xAF, 0xBF, 0xFA, 0x06, 0xDB, 0xF9, 0x8D, 0xD4, 0x14, 0xF3,
+ 0xE9, 0x79, 0x48, 0xF9, 0x86, 0x95, 0xA8, 0xF4, 0x4F, 0xF9, 0xE3, 0x82, 0x92, 0xA6, 0xBF, 0xF6, 0xC7, 0x34, 0xA3, 0x3E,
+ 0x97, 0xFC, 0xF5, 0x81, 0xBB, 0x1F, 0x4C, 0x89, 0x4C, 0x04, 0x0F, 0x79, 0x0F, 0x53, 0x2F, 0x9A, 0x12, 0x11, 0x16, 0x4D,
+ 0x36, 0x41, 0xCD, 0x4F, 0x48, 0xA3, 0xEA, 0x64, 0xE1, 0xCD, 0xAA, 0x09, 0xB3, 0x4E, 0xE1, 0x0A, 0x3C, 0xEE, 0xE8, 0xC0,
+ 0x72, 0x34, 0xC6, 0xB0, 0x65, 0x64, 0x6A, 0x91, 0x3A, 0xC2, 0xC4, 0x37, 0x4D, 0x1E, 0xC9, 0xE5, 0x49, 0x5D, 0xD8, 0xA5,
+ 0x25, 0xFD, 0xB5, 0x71, 0xE7, 0xD2, 0x79, 0xA6, 0x5D, 0xBA, 0x7C, 0x70, 0xD5, 0xEE, 0x1D, 0x07, 0xAF, 0x38, 0x72, 0xDD,
+ 0xDE, 0xDD, 0x47, 0x07, 0xFB, 0x96, 0x92, 0x5C, 0x31, 0xE1, 0x22, 0x5C, 0xDF, 0x7C, 0xFC, 0x66, 0xAA, 0x2A, 0x45, 0xE4,
+ 0x37, 0xBE, 0xF7, 0x7D, 0x86, 0x97, 0x30, 0x21, 0x78, 0x73, 0x24, 0x70, 0x23, 0x0D, 0x45, 0x14, 0x9C, 0x21, 0x53, 0x46,
+ 0xE6, 0x59, 0x54, 0x21, 0xA4, 0xDE, 0x24, 0xE0, 0x14, 0x1F, 0xD2, 0x42, 0xCF, 0x2D, 0x2F, 0xCF, 0x29, 0xC9, 0x8C, 0x15,
+ 0x68, 0x62, 0x53, 0x78, 0x61, 0x7A, 0x11, 0x46, 0x97, 0x1A, 0x9E, 0x42, 0x1E, 0x92, 0x18, 0x9A, 0x58, 0x9C, 0x5E, 0x9A,
+ 0x12, 0x91, 0x92, 0x15, 0x9F, 0x0B, 0x11, 0x9F, 0x13, 0x8A, 0x84, 0x99, 0x50, 0x58, 0x0F, 0x4D, 0x86, 0xD3, 0x67, 0xD8,
+ 0x9C, 0xBC, 0x6A, 0xE9, 0xBA, 0x6D, 0x6B, 0xB6, 0x6F, 0x5D, 0xBF, 0xE3, 0xE8, 0xE1, 0xAB, 0xEE, 0xBD, 0xEB, 0x41, 0x92,
+ 0xA8, 0x5F, 0xBC, 0xFF, 0xE1, 0x7F, 0xFF, 0xEB, 0x14, 0xD8, 0x5A, 0x3A, 0x78, 0x45, 0xAF, 0xC8, 0xA3, 0x75, 0x86, 0x5E,
+ 0xD8, 0xDF, 0xDA, 0xA8, 0xCE, 0x23, 0x9F, 0x7C, 0x26, 0x9E, 0x81, 0x32, 0xEF, 0xBF, 0xE3, 0x7E, 0x62, 0xD8, 0xCE, 0x0D,
+ 0x3B, 0x1A, 0x6B, 0x9A, 0x2F, 0x19, 0x37, 0x21, 0x22, 0x28, 0x88, 0x94, 0x9A, 0xE1, 0x20, 0x7E, 0x60, 0xD4, 0x90, 0xA4,
+ 0xED, 0x48, 0x57, 0x19, 0x56, 0x13, 0x63, 0x2F, 0x7C, 0x4E, 0xA6, 0x45, 0x7A, 0xE9, 0x02, 0xC2, 0x73, 0x76, 0xB7, 0x42,
+ 0x68, 0x02, 0x63, 0xBA, 0x0B, 0xA9, 0xE4, 0x2D, 0x44, 0x7F, 0xFF, 0x79, 0xF3, 0xCF, 0x39, 0xE7, 0x1C, 0x0E, 0x66, 0x64,
+ 0x2F, 0xC6, 0xAC, 0x4B, 0xA7, 0x31, 0x5B, 0xA7, 0x64, 0x43, 0x19, 0x74, 0x78, 0x98, 0xC6, 0x6C, 0xD9, 0xB8, 0xBB, 0xA9,
+ 0xA6, 0x03, 0xE6, 0x04, 0x43, 0xCA, 0xAE, 0x96, 0x8E, 0xDB, 0xAF, 0xBD, 0xF5, 0x77, 0xBF, 0xFD, 0xD3, 0x6D, 0x37, 0xDF,
+ 0x87, 0xA5, 0x10, 0xB8, 0x28, 0x89, 0x51, 0x27, 0x7A, 0x82, 0x3C, 0x0A, 0x5F, 0x9A, 0xFF, 0xC2, 0x84, 0x84, 0x74, 0x9B,
+ 0xFC, 0x95, 0x17, 0xA1, 0x37, 0x40, 0x1E, 0x45, 0x0B, 0xA4, 0xB6, 0xA8, 0x8A, 0xF1, 0x4B, 0x56, 0x7C, 0x3A, 0x6A, 0xC6,
+ 0x7B, 0x32, 0xD8, 0x1C, 0x09, 0x43, 0x22, 0x26, 0x93, 0x44, 0x80, 0x6D, 0x7B, 0x40, 0x22, 0x64, 0x16, 0xCA, 0xC9, 0x9A,
+ 0xB2, 0xA6, 0xFA, 0xF2, 0xB6, 0xAA, 0xA2, 0xC6, 0xA2, 0x4C, 0xFA, 0xBE, 0xB5, 0x15, 0xB9, 0xB5, 0x1C, 0x35, 0x30, 0xD8,
+ 0xCD, 0x01, 0x87, 0x43, 0xAB, 0x87, 0xD6, 0xB0, 0x6D, 0xF6, 0xD0, 0x9E, 0xA3, 0xD7, 0x5E, 0x7D, 0xE3, 0x03, 0xF7, 0x3E,
+ 0x06, 0x87, 0x83, 0x2E, 0x13, 0x27, 0x4F, 0x69, 0xB6, 0xEA, 0x5A, 0xBA, 0x24, 0xAF, 0x9C, 0xD2, 0x42, 0x18, 0xFB, 0x1F,
+ 0xB6, 0xFA, 0xFF, 0xE7, 0x33, 0xD2, 0x53, 0x3D, 0x92, 0x67, 0x0C, 0x64, 0xA9, 0x86, 0x78, 0xE6, 0xDD, 0xB7, 0xDD, 0x45,
+ 0xEB, 0x65, 0xCB, 0xBA, 0xCB, 0xD6, 0x2F, 0x59, 0x3F, 0xF9, 0xBC, 0xF1, 0xA1, 0xF3, 0x64, 0xDF, 0x03, 0xB3, 0x90, 0x84,
+ 0xE8, 0x78, 0x3E, 0x9A, 0x24, 0x14, 0x31, 0x8E, 0x1A, 0x54, 0x07, 0xA0, 0x93, 0xC7, 0x21, 0x46, 0x5D, 0x3B, 0x3A, 0xF0,
+ 0xCA, 0x5D, 0xD1, 0xDF, 0xE1, 0x2A, 0x01, 0xD9, 0xEE, 0x54, 0xC8, 0x56, 0xDB, 0xBC, 0x16, 0xFF, 0x83, 0x6E, 0x33, 0x6D,
+ 0x4E, 0xC8, 0x9D, 0x17, 0x5C, 0x70, 0xC1, 0xE9, 0x67, 0x72, 0x26, 0xA5, 0xFC, 0x70, 0xCE, 0xE5, 0x05, 0xE7, 0x8E, 0x9B,
+ 0x37, 0x75, 0x0E, 0x41, 0x95, 0x3D, 0xC3, 0x3B, 0x36, 0xEF, 0xDB, 0xBD, 0xE3, 0xF0, 0x60, 0xFF, 0xEA, 0xCC, 0xC4, 0x1C,
+ 0xBF, 0x69, 0xF3, 0xC3, 0x16, 0x84, 0xD2, 0x22, 0xA6, 0x15, 0x01, 0x33, 0x85, 0x77, 0x9C, 0x1C, 0x97, 0xA2, 0x8D, 0x43,
+ 0xD4, 0xC0, 0x14, 0x2C, 0x27, 0x3E, 0x53, 0x02, 0x72, 0x74, 0x2A, 0x65, 0x07, 0x05, 0x84, 0x54, 0x7F, 0x79, 0x15, 0xA8,
+ 0x01, 0x6A, 0xC5, 0x65, 0x1B, 0x77, 0xDC, 0x72, 0xED, 0xAD, 0xE0, 0x3B, 0xD9, 0x7D, 0x4F, 0x63, 0x0F, 0xC7, 0x77, 0x70,
+ 0xAC, 0x47, 0x6A, 0x74, 0x5A, 0x42, 0x74, 0x12, 0xEF, 0x84, 0xBD, 0x37, 0x4C, 0x57, 0x8A, 0x0B, 0xCA, 0xD3, 0xE2, 0xB2,
+ 0xB3, 0xE2, 0xF3, 0x7B, 0x3B, 0x96, 0xB2, 0x45, 0xB0, 0xA6, 0x84, 0x53, 0x80, 0x96, 0x41, 0x88, 0xE7, 0x0C, 0x42, 0x8E,
+ 0x18, 0xDC, 0xB2, 0x6A, 0x2B, 0x99, 0xFE, 0xEE, 0x9D, 0xFB, 0x8E, 0x5D, 0x71, 0xD5, 0x9D, 0xB7, 0xDD, 0x4B, 0xF2, 0x4A,
+ 0xAC, 0x7E, 0xE7, 0xC7, 0x3F, 0x23, 0x9D, 0xA3, 0xBC, 0xE0, 0x74, 0x9C, 0x77, 0xDF, 0xF9, 0x05, 0xEB, 0x27, 0xEF, 0xFC,
+ 0xEC, 0xED, 0xB7, 0xDE, 0x31, 0x8F, 0xBF, 0x4F, 0xB3, 0x8F, 0xEA, 0xFA, 0x5F, 0xFF, 0xFA, 0xB7, 0x56, 0x82, 0xC6, 0x41,
+ 0xBE, 0xA0, 0x6F, 0xFB, 0xDB, 0x0F, 0xFF, 0x70, 0xDB, 0x8D, 0xB7, 0x93, 0x62, 0x0C, 0x75, 0x0F, 0x5D, 0x71, 0xF8, 0x86,
+ 0xD0, 0xB9, 0xC1, 0xF3, 0x2E, 0x9D, 0x1D, 0x11, 0x14, 0x12, 0x1D, 0x1A, 0x8E, 0x6D, 0xE1, 0x07, 0x9C, 0x72, 0xC1, 0xF6,
+ 0x08, 0x29, 0x36, 0x8D, 0x43, 0xB8, 0x3A, 0x38, 0xB5, 0x1A, 0xF8, 0xAD, 0xE8, 0xE0, 0xCB, 0xB8, 0x79, 0xAA, 0x0C, 0x8D,
+ 0x99, 0xDA, 0x54, 0x30, 0x6A, 0x20, 0x7D, 0x94, 0x6E, 0x33, 0x19, 0x58, 0x74, 0x50, 0x38, 0xFC, 0x11, 0x08, 0xFE, 0x53,
+ 0x2F, 0x99, 0x74, 0xE1, 0xF9, 0x17, 0x7C, 0xED, 0x6B, 0x5F, 0x63, 0x37, 0x80, 0x3D, 0x9D, 0xF4, 0x8C, 0xD3, 0xCE, 0xBE,
+ 0x74, 0xC2, 0x64, 0x32, 0x84, 0xBE, 0xF6, 0xC1, 0xED, 0x1B, 0xF7, 0xAC, 0x5E, 0xB9, 0x8D, 0x8D, 0x92, 0x64, 0xB4, 0x91,
+ 0x61, 0xB1, 0x6D, 0x0D, 0x5D, 0x6C, 0xEA, 0x8B, 0x0F, 0xE7, 0xFD, 0xA5, 0xA0, 0x2D, 0x3C, 0x23, 0x2D, 0x3A, 0x19, 0xC0,
+ 0xC1, 0xF6, 0x8F, 0xEC, 0xBB, 0xF2, 0x91, 0xFB, 0x1F, 0xFD, 0xE6, 0xB3, 0x2F, 0x40, 0x72, 0x79, 0xEB, 0xAD, 0x1F, 0xFC,
+ 0xFA, 0xD7, 0xBF, 0xA6, 0xF7, 0xA0, 0xE6, 0x48, 0xDB, 0x87, 0x0A, 0x80, 0xE3, 0x1C, 0x81, 0xA9, 0xA2, 0xB4, 0x12, 0x8C,
+ 0x80, 0xB0, 0xC4, 0xDB, 0x60, 0x14, 0x91, 0x12, 0x97, 0x91, 0x1A, 0x9F, 0x99, 0x40, 0x00, 0x8C, 0xCD, 0xC8, 0x4F, 0x29,
+ 0xAD, 0x2B, 0x6B, 0xED, 0x6C, 0x1D, 0x6A, 0xAD, 0xEF, 0xC1, 0x11, 0xE5, 0x78, 0xB7, 0xD6, 0x01, 0x0E, 0x55, 0xE3, 0x70,
+ 0x0B, 0x80, 0x9B, 0xBA, 0x6C, 0xFF, 0xAE, 0x83, 0x87, 0xF6, 0x1E, 0x39, 0x76, 0xE8, 0x2A, 0xB2, 0x58, 0x0A, 0x3D, 0x60,
+ 0xEA, 0x81, 0x7B, 0x1F, 0xB9, 0xEF, 0xEE, 0x87, 0xEE, 0xB9, 0xFD, 0xBE, 0x07, 0xEF, 0x79, 0x98, 0xBB, 0x4F, 0x3D, 0xF9,
+ 0xFC, 0x37, 0x5F, 0x78, 0x95, 0xF9, 0xCF, 0x8B, 0xDF, 0x7C, 0x95, 0x21, 0xD2, 0x0F, 0x7E, 0xF8, 0xD3, 0xF7, 0xDE, 0xFD,
+ 0xE5, 0x7B, 0x3F, 0xFB, 0xE5, 0x4F, 0x7F, 0xFC, 0xF3, 0x17, 0xBF, 0xF9, 0xAD, 0x6B, 0xAF, 0xBC, 0x91, 0x7E, 0x0C, 0x2D,
+ 0xB2, 0x03, 0x7B, 0x8F, 0xA2, 0x60, 0x50, 0x28, 0x74, 0x41, 0x20, 0x26, 0x15, 0x1F, 0x16, 0x1D, 0x13, 0x1A, 0xCB, 0x74,
+ 0x96, 0x3A, 0x1F, 0x1D, 0x8C, 0xB8, 0x42, 0x2C, 0x21, 0xDA, 0x09, 0x0F, 0x63, 0x2E, 0x54, 0x43, 0x3E, 0x1E, 0x05, 0xC8,
+ 0x64, 0x6E, 0x0C, 0x19, 0xCF, 0x4E, 0x47, 0x6D, 0x0F, 0x56, 0x2A, 0x72, 0x74, 0x10, 0x9B, 0x4C, 0x35, 0x88, 0x14, 0x28,
+ 0x65, 0x83, 0xFD, 0x69, 0x73, 0xCE, 0xA7, 0xB7, 0x33, 0xE3, 0xD2, 0xA9, 0x53, 0x26, 0x4F, 0x9A, 0x38, 0xE1, 0x62, 0x9A,
+ 0x3C, 0xE3, 0xC6, 0x8D, 0x83, 0x0E, 0x2D, 0xA7, 0xC3, 0x9E, 0x26, 0xCE, 0x31, 0x6B, 0xEA, 0x4C, 0x68, 0x9D, 0x4B, 0xFB,
+ 0x57, 0xB0, 0xB1, 0x7B, 0x71, 0xFF, 0x5A, 0x30, 0x84, 0xE7, 0xAB, 0x99, 0xE0, 0xBF, 0xB8, 0x2D, 0xCA, 0xA6, 0x3B, 0x86,
+ 0xD1, 0xD9, 0x7C, 0xC3, 0x8B, 0xCB, 0x92, 0x5F, 0x7D, 0xF1, 0xD9, 0xDF, 0xFF, 0xF6, 0x11, 0x49, 0x0E, 0x10, 0x4F, 0xDB,
+ 0xA3, 0x3C, 0xBB, 0x9C, 0xCA, 0x08, 0xF4, 0xE3, 0x45, 0x80, 0x32, 0x34, 0x4D, 0x0B, 0xAB, 0x30, 0xB3, 0xAC, 0xA4, 0xB0,
+ 0xA2, 0x20, 0xB7, 0xA2, 0xBA, 0xA4, 0x6D, 0xF3, 0xFA, 0x3D, 0x9C, 0xFE, 0x00, 0x8D, 0xB3, 0xA3, 0x65, 0x90, 0x19, 0x35,
+ 0x34, 0xC8, 0xA1, 0x9E, 0xE1, 0xB5, 0xC3, 0x9B, 0x09, 0x2A, 0xCC, 0x1B, 0x08, 0x12, 0x7B, 0xB7, 0x1D, 0x38, 0xB4, 0xE7,
+ 0x4A, 0x5A, 0x81, 0xD7, 0x1C, 0xBB, 0xF1, 0xFA, 0xE3, 0x37, 0xDF, 0x70, 0xFD, 0xED, 0x80, 0xD5, 0xF5, 0xC7, 0x6E, 0xB8,
+ 0xE1, 0xDA, 0xDB, 0x6E, 0xBE, 0xF9, 0xEE, 0xDB, 0x6F, 0xB9, 0xFB, 0x96, 0xEB, 0x6F, 0xBB, 0xEB, 0xD6, 0x7B, 0x50, 0xCC,
+ 0xC3, 0x0F, 0x3C, 0x7E, 0xDB, 0xCD, 0x77, 0xDD, 0x7B, 0xD7, 0xC3, 0xDC, 0xEE, 0xDF, 0x75, 0x60, 0xD5, 0xC0, 0x30, 0x50,
+ 0xC9, 0x21, 0x16, 0x57, 0x5E, 0x7E, 0x3D, 0x19, 0xDA, 0x94, 0xF3, 0x2F, 0x0E, 0x5D, 0x18, 0x12, 0x15, 0x1A, 0x89, 0x34,
+ 0xE8, 0x74, 0xA1, 0x03, 0xF2, 0x69, 0xAC, 0x8A, 0x37, 0x96, 0x12, 0x65, 0xE3, 0x81, 0x34, 0x86, 0x4F, 0xB9, 0x90, 0x80,
+ 0xE8, 0xC0, 0xDA, 0xFB, 0xC9, 0xCC, 0x48, 0xEF, 0x58, 0x4E, 0xB1, 0x08, 0x1D, 0xB0, 0xA7, 0x25, 0x39, 0x31, 0x2D, 0x2E,
+ 0x46, 0x4A, 0x59, 0xA2, 0x50, 0x44, 0x48, 0x28, 0xA0, 0x44, 0x8B, 0x8D, 0x82, 0x16, 0xCE, 0xF3, 0xFC, 0x59, 0x73, 0xFD,
+ 0x66, 0xCE, 0x9E, 0x33, 0xDD, 0x77, 0xE6, 0xD4, 0x69, 0x6C, 0x0E, 0x98, 0x3C, 0x61, 0xE2, 0x79, 0x17, 0x9C, 0xCF, 0x69,
+ 0xBC, 0x20, 0xD5, 0xB8, 0x73, 0xCE, 0x9B, 0x76, 0xE9, 0xF4, 0x4B, 0x27, 0x4F, 0x99, 0x36, 0x69, 0x12, 0xC3, 0x4B, 0xDE,
+ 0x34, 0x6F, 0x74, 0xE1, 0xDC, 0x85, 0xA0, 0x39, 0x21, 0x97, 0x4D, 0xC5, 0x77, 0xDC, 0x7A, 0xCF, 0x2F, 0x7F, 0xF9, 0xC1,
+ 0xC9, 0x7D, 0x69, 0x14, 0x03, 0x4C, 0x93, 0xCE, 0xDF, 0x70, 0xF5, 0x2D, 0xEB, 0x96, 0x6C, 0x84, 0x79, 0x97, 0x93, 0x90,
+ 0x03, 0x93, 0x2E, 0x3E, 0x26, 0xB9, 0xA4, 0xB0, 0x86, 0x29, 0x7C, 0x5C, 0x64, 0x2C, 0x4E, 0x56, 0x9C, 0x2D, 0xE7, 0x08,
+ 0xF5, 0x2E, 0x5A, 0xCA, 0xB9, 0x49, 0x83, 0xBD, 0xAB, 0x16, 0x19, 0x57, 0xE0, 0x08, 0x31, 0x0E, 0xE4, 0xE0, 0x9C, 0x2C,
+ 0x36, 0x89, 0x2C, 0x5F, 0xBC, 0x61, 0xE5, 0x92, 0xF5, 0x6B, 0x57, 0x6F, 0xE3, 0x04, 0xDA, 0x65, 0x03, 0xAB, 0x57, 0x2C,
+ 0x5E, 0x43, 0xFF, 0x83, 0x53, 0x6A, 0x77, 0x6C, 0xDC, 0xBD, 0x73, 0xD3, 0xBE, 0xDD, 0xDB, 0xF7, 0x72, 0xEA, 0xD1, 0xC1,
+ 0xDD, 0x97, 0xD3, 0x95, 0xDA, 0xBA, 0x61, 0xFB, 0xDE, 0xCB, 0x0E, 0x62, 0xE9, 0xFB, 0xB6, 0x1F, 0x3C, 0x7C, 0xE0, 0xD8,
+ 0x15, 0x87, 0x8E, 0x5D, 0x71, 0xE4, 0xF8, 0x65, 0x9B, 0x76, 0xAF, 0x59, 0xBC, 0x8A, 0xD3, 0x90, 0x00, 0x49, 0x36, 0x72,
+ 0x1F, 0xD8, 0x77, 0x0D, 0x86, 0x38, 0x65, 0xFC, 0xC4, 0x88, 0xC0, 0x08, 0x00, 0x96, 0xE6, 0x0A, 0x4E, 0x89, 0x4C, 0x50,
+ 0x00, 0x23, 0x29, 0x5C, 0x41, 0x23, 0xB3, 0x0D, 0x0C, 0xA3, 0x71, 0x69, 0x44, 0x25, 0x3E, 0x9A, 0x74, 0x4A, 0xAA, 0x6E,
+ 0x08, 0x01, 0xF9, 0xD0, 0x31, 0xD9, 0x16, 0x9A, 0x31, 0x76, 0x34, 0xAA, 0x39, 0x8C, 0x36, 0xD7, 0xB4, 0xF2, 0x16, 0x57,
+ 0x88, 0x4C, 0xE0, 0xBF, 0xF2, 0xBF, 0xE9, 0xAF, 0x71, 0xDE, 0x0C, 0xBB, 0xB1, 0xD9, 0x18, 0x03, 0xE7, 0x19, 0xEA, 0x39,
+ 0x3B, 0xDC, 0x45, 0x25, 0xB3, 0xE7, 0x53, 0xCA, 0xC1, 0xC9, 0xA5, 0xF5, 0xE6, 0x3B, 0x7D, 0xC6, 0xB4, 0xA9, 0x53, 0xD0,
+ 0x0A, 0x44, 0x68, 0xC6, 0x96, 0xBC, 0x6F, 0x9C, 0x37, 0x21, 0x2A, 0x6A, 0xF6, 0x74, 0x5F, 0x32, 0xEB, 0x25, 0x7D, 0xAB,
+ 0xA3, 0x16, 0x46, 0x86, 0xCD, 0x0D, 0xA6, 0xCE, 0x80, 0xE0, 0xF5, 0xE4, 0x63, 0x5F, 0x7F, 0xEF, 0xBD, 0x9F, 0xFF, 0xE5,
+ 0x2F, 0x7F, 0xA3, 0x3E, 0xA2, 0x13, 0xF7, 0xFE, 0xCF, 0x3F, 0x00, 0xC1, 0x8F, 0x1D, 0x3E, 0xCE, 0x11, 0x2D, 0x14, 0x04,
+ 0x32, 0x13, 0x4E, 0x2F, 0x4E, 0x4D, 0x48, 0x47, 0x85, 0xC5, 0xB9, 0x95, 0x7C, 0xE0, 0xF4, 0x14, 0x32, 0x66, 0x46, 0x13,
+ 0x15, 0x04, 0x06, 0xF8, 0x4E, 0x54, 0xE0, 0xCC, 0xEC, 0x2A, 0x8A, 0xEA, 0x0A, 0x32, 0x4A, 0xEB, 0x4B, 0x5A, 0x09, 0xD7,
+ 0xAC, 0xC6, 0xDA, 0x45, 0x95, 0xC5, 0x74, 0x18, 0x06, 0x87, 0x7A, 0x56, 0xEA, 0xB1, 0xA9, 0x9C, 0xDF, 0xC7, 0x2D, 0x30,
+ 0x85, 0x7F, 0x0C, 0x0F, 0xAD, 0x25, 0x9B, 0x58, 0xDC, 0x3D, 0xBC, 0x7A, 0xC9, 0xA6, 0x95, 0x03, 0xAB, 0x88, 0x1F, 0x1B,
+ 0x56, 0x6C, 0xA5, 0x2A, 0xA6, 0x08, 0xDD, 0xB8, 0x72, 0xDB, 0x96, 0x35, 0xDB, 0xB7, 0xAD, 0xDB, 0x45, 0xCA, 0x8B, 0xB3,
+ 0xD2, 0x71, 0x41, 0x4A, 0x1C, 0x87, 0xB3, 0x6D, 0xD3, 0x01, 0xA8, 0xF3, 0x93, 0x2E, 0xBE, 0x88, 0x8F, 0x0F, 0x95, 0x4F,
+ 0xFC, 0x20, 0x3C, 0x9C, 0x78, 0xA0, 0xFD, 0x2E, 0xD3, 0x7F, 0x4C, 0xB0, 0x6A, 0xA0, 0x9D, 0x47, 0xC2, 0xAA, 0x77, 0xC7,
+ 0x2C, 0x1F, 0x41, 0x7C, 0x43, 0x4E, 0x92, 0xA1, 0x8A, 0x69, 0x42, 0x90, 0xAA, 0x8F, 0x61, 0xC5, 0xD8, 0x96, 0x8E, 0xFA,
+ 0x81, 0x56, 0x1F, 0x40, 0xB9, 0xFE, 0x1B, 0x3A, 0x0A, 0xFC, 0x7B, 0x9A, 0x0A, 0x64, 0x4A, 0x51, 0x81, 0x61, 0x20, 0x3E,
+ 0xDD, 0x05, 0x3C, 0x03, 0x7D, 0xA0, 0x15, 0x56, 0xB0, 0x5F, 0x00, 0x8A, 0x91, 0xE5, 0x17, 0x18, 0xE2, 0x17, 0x4A, 0x0B,
+ 0x88, 0xA7, 0xC1, 0x2C, 0x32, 0x6F, 0x3A, 0x3A, 0xC0, 0xCF, 0x7F, 0xCA, 0x84, 0xC9, 0x1C, 0x73, 0xB0, 0x7D, 0xF3, 0x01,
+ 0x4E, 0x19, 0x66, 0xA6, 0x04, 0x39, 0x0E, 0x96, 0x51, 0x67, 0x4B, 0x17, 0x0D, 0x35, 0x3A, 0x42, 0x57, 0x1F, 0xBE, 0x96,
+ 0xC3, 0x40, 0xE8, 0xF0, 0x0C, 0x0F, 0xAC, 0xA1, 0x37, 0xC0, 0x1E, 0x50, 0x80, 0x88, 0x6E, 0x55, 0x44, 0x70, 0x14, 0x15,
+ 0x5C, 0x5A, 0x62, 0x06, 0xBE, 0x08, 0xDD, 0x3A, 0x3B, 0x35, 0x1F, 0x10, 0xE0, 0x42, 0x76, 0x18, 0x64, 0x15, 0x56, 0x31,
+ 0xC5, 0xAB, 0x6A, 0xCD, 0x48, 0x85, 0xAE, 0xDD, 0x52, 0x96, 0x57, 0x5B, 0x98, 0x59, 0xC1, 0x49, 0x87, 0x9C, 0xB6, 0xC4,
+ 0x86, 0xF8, 0xEA, 0xD2, 0x66, 0x9C, 0xA3, 0xBF, 0x6B, 0x79, 0x57, 0xDB, 0xE2, 0xBE, 0xCE, 0x65, 0xEC, 0xE1, 0x31, 0xC7,
+ 0xD6, 0xF4, 0x0E, 0x2D, 0x5A, 0x41, 0x85, 0xB1, 0xA4, 0x67, 0xD5, 0xFA, 0xD5, 0x3B, 0xE4, 0xA8, 0xE9, 0x9E, 0xE5, 0xAB,
+ 0x86, 0x37, 0xE0, 0x2E, 0x12, 0xDB, 0x3B, 0xFA, 0xF1, 0x3F, 0x52, 0x5E, 0x08, 0xE7, 0xE4, 0x0B, 0x99, 0xD1, 0x19, 0xA9,
+ 0x11, 0x49, 0xEC, 0x42, 0xA4, 0x6B, 0x82, 0xA3, 0xF3, 0x89, 0x60, 0xE8, 0xC4, 0x85, 0x46, 0xB1, 0x5B, 0x54, 0x04, 0x12,
+ 0x25, 0x99, 0x82, 0x66, 0x47, 0x9A, 0x0E, 0x59, 0x14, 0x1A, 0x23, 0x7D, 0x45, 0x63, 0x1F, 0x27, 0xF5, 0x34, 0xD2, 0x77,
+ 0x90, 0x27, 0xCD, 0xEC, 0x8A, 0x76, 0x49, 0xA9, 0x96, 0x15, 0xE3, 0x74, 0x37, 0xE3, 0x9D, 0x3E, 0xB3, 0x99, 0xBA, 0x18,
+ 0x5F, 0xA3, 0xE9, 0x1F, 0x81, 0x1A, 0xC4, 0x21, 0x00, 0x68, 0x6E, 0x51, 0x06, 0x66, 0x3E, 0x76, 0x05, 0x84, 0x10, 0x3C,
+ 0x88, 0x5D, 0x2C, 0x14, 0xC0, 0xD8, 0x52, 0xFF, 0x84, 0x07, 0x2F, 0x99, 0x48, 0x48, 0xBF, 0xA8, 0xB1, 0xAA, 0x71, 0xD7,
+ 0xD6, 0x03, 0x38, 0xF8, 0xA6, 0x0D, 0x7B, 0xA0, 0x7C, 0xD5, 0x57, 0xC9, 0xB9, 0x2D, 0xB4, 0x48, 0xDB, 0x9B, 0xE4, 0x08,
+ 0x1F, 0x33, 0x5F, 0x6C, 0x29, 0x97, 0xE1, 0x49, 0x59, 0x76, 0x42, 0x1E, 0x2A, 0xAF, 0xAE, 0x68, 0x84, 0x31, 0x47, 0xC1,
+ 0x98, 0x97, 0x51, 0x44, 0x8D, 0x2D, 0x5B, 0x04, 0x32, 0x0B, 0x68, 0x5B, 0xB2, 0xB7, 0x09, 0x1D, 0x70, 0x91, 0x97, 0x5D,
+ 0x52, 0x55, 0xDE, 0x20, 0x47, 0x24, 0xD0, 0x61, 0xCE, 0xAF, 0xCC, 0xCF, 0x2C, 0x2F, 0xCE, 0xAD, 0x46, 0x01, 0x00, 0x54,
+ 0x7F, 0xD7, 0x52, 0x92, 0x57, 0x9C, 0x6F, 0xB0, 0x7B, 0x05, 0x4A, 0xC5, 0x2D, 0x9A, 0x6B, 0x17, 0xA1, 0x12, 0x74, 0x83,
+ 0x67, 0xC8, 0x59, 0x30, 0x4C, 0x3D, 0x9B, 0x07, 0x28, 0x3B, 0xE4, 0x80, 0xAD, 0xE6, 0x3E, 0x39, 0x42, 0xA2, 0xBE, 0x5B,
+ 0xCF, 0x37, 0x85, 0xA4, 0x94, 0x1C, 0x9A, 0x04, 0xA5, 0x8C, 0x37, 0x4F, 0xA4, 0x81, 0x87, 0xC0, 0xF6, 0xDB, 0xE8, 0x70,
+ 0xF1, 0x03, 0x8C, 0xC0, 0xD6, 0x07, 0x28, 0xC3, 0xA4, 0x6D, 0x52, 0xAF, 0x25, 0x46, 0xCA, 0xCE, 0x75, 0x90, 0x23, 0x39,
+ 0x5A, 0xC7, 0x24, 0x49, 0x26, 0x6B, 0x92, 0xDF, 0xB2, 0xC0, 0x22, 0x53, 0xAF, 0x1A, 0xDB, 0x77, 0x0B, 0x57, 0x99, 0xC3,
+ 0x79, 0xE9, 0x79, 0x36, 0x29, 0x32, 0x6A, 0x90, 0xA9, 0x90, 0x99, 0x7C, 0xA5, 0x82, 0xC8, 0xEA, 0x5F, 0xAA, 0x06, 0x70,
+ 0x89, 0xE4, 0x8C, 0x77, 0x26, 0xCA, 0x08, 0x89, 0x46, 0x1F, 0xA0, 0x24, 0xB7, 0x5C, 0x8B, 0x56, 0xC2, 0xA2, 0x55, 0xF4,
+ 0x24, 0x0F, 0x26, 0x7C, 0x49, 0x04, 0xE3, 0xAE, 0xB4, 0xE4, 0x16, 0xF8, 0x5F, 0x70, 0xDE, 0xF9, 0x9C, 0xC8, 0x4E, 0x82,
+ 0x41, 0x12, 0x05, 0xE1, 0xEE, 0x8A, 0xCB, 0x6F, 0xDC, 0xB9, 0xF3, 0x30, 0x87, 0x81, 0x00, 0x17, 0x8D, 0xD5, 0xAD, 0x28,
+ 0x83, 0x23, 0x19, 0x39, 0xDA, 0x90, 0xBD, 0xAB, 0xC5, 0x19, 0x32, 0xF7, 0x26, 0xA9, 0xAD, 0xAB, 0x68, 0x22, 0x23, 0x42,
+ 0xDC, 0x20, 0x0F, 0x9F, 0x16, 0x2C, 0x22, 0x30, 0x70, 0x17, 0x5C, 0x2A, 0xCC, 0x2E, 0xCD, 0x4A, 0x11, 0x6F, 0x90, 0x3D,
+ 0x23, 0x6C, 0x61, 0x4B, 0x2D, 0xA0, 0x1B, 0x5F, 0x56, 0x50, 0x83, 0x3E, 0xC0, 0x2E, 0xC2, 0x4F, 0x6D, 0x79, 0x2B, 0xB1,
+ 0x1A, 0x65, 0x40, 0xD8, 0x21, 0x8B, 0x05, 0xAF, 0xAA, 0x0B, 0x1A, 0xB8, 0xDB, 0x5C, 0xD3, 0x5D, 0x9E, 0x5F, 0xD7, 0x5A,
+ 0xD3, 0xC3, 0x36, 0xE1, 0xC2, 0xB4, 0x32, 0xF2, 0x2B, 0x8A, 0x4A, 0x98, 0xE1, 0xED, 0x35, 0xDD, 0x55, 0x79, 0x35, 0x8C,
+ 0x0A, 0x38, 0x61, 0x88, 0x52, 0x3C, 0x2D, 0x2A, 0x8D, 0x33, 0x01, 0x38, 0x50, 0x87, 0x46, 0x69, 0x4D, 0x79, 0x9D, 0xEF,
+ 0xE4, 0xE9, 0x7C, 0x4C, 0xD5, 0x41, 0x52, 0xA4, 0xD4, 0x68, 0x22, 0x5C, 0x53, 0x1F, 0x18, 0x1D, 0xC8, 0x35, 0x91, 0x83,
+ 0x65, 0xE5, 0xAE, 0x17, 0xC9, 0xE8, 0x46, 0x75, 0x60, 0x03, 0x2F, 0xDD, 0x1B, 0x3B, 0x8F, 0xD6, 0x44, 0x68, 0x0C, 0x37,
+ 0xC6, 0x3B, 0x20, 0xD5, 0x01, 0xA4, 0x82, 0x12, 0xFF, 0x46, 0x41, 0x50, 0xB2, 0x82, 0xB0, 0x44, 0x94, 0xA1, 0x38, 0xE3,
+ 0xCA, 0xDA, 0x0A, 0x5D, 0x2E, 0xE4, 0x39, 0x68, 0xCB, 0x3C, 0x27, 0x26, 0x2C, 0x02, 0xB7, 0x60, 0xCB, 0xC6, 0x82, 0x39,
+ 0x73, 0x2F, 0x38, 0x7F, 0x1C, 0x71, 0xFB, 0x82, 0x73, 0xCE, 0xE7, 0x3D, 0x6C, 0x5D, 0xB7, 0xF7, 0xF8, 0xD5, 0xB7, 0xA3,
+ 0x09, 0x32, 0xDA, 0xC5, 0xBD, 0xAB, 0xC4, 0x5A, 0x4B, 0x5A, 0xCA, 0x0B, 0x6B, 0x31, 0x4C, 0x4E, 0x85, 0xE3, 0x09, 0xD8,
+ 0x14, 0xE9, 0x10, 0xA1, 0x18, 0x56, 0x40, 0xA2, 0xB4, 0x04, 0x52, 0xD0, 0x81, 0xF0, 0x65, 0xD8, 0x8F, 0x9F, 0x9E, 0x87,
+ 0xE1, 0xA3, 0x03, 0xDA, 0xC8, 0x28, 0x83, 0xD2, 0x44, 0x4E, 0xA0, 0xCB, 0x2E, 0x93, 0x1A, 0x22, 0xB7, 0x9C, 0x23, 0x89,
+ 0xA0, 0x07, 0xB2, 0x4F, 0xA2, 0x30, 0xB7, 0xBA, 0xB4, 0xB0, 0xBE, 0x9C, 0xAD, 0x2E, 0x35, 0xED, 0x75, 0x55, 0x1D, 0x64,
+ 0xB1, 0xC0, 0x97, 0x90, 0xF5, 0x8B, 0xEB, 0x0B, 0xB3, 0xCB, 0x2B, 0x0B, 0x1B, 0xC8, 0xB2, 0xD0, 0x47, 0x7E, 0x4A, 0x49,
+ 0x79, 0x56, 0x4D, 0x5D, 0x69, 0x1B, 0xFD, 0x44, 0x94, 0x51, 0x90, 0x51, 0x2E, 0x03, 0xE4, 0x94, 0x1C, 0xFA, 0xCA, 0xBC,
+ 0x0D, 0x9C, 0x80, 0xFF, 0x98, 0x12, 0x9F, 0xCC, 0x96, 0x13, 0x0E, 0xC9, 0xA0, 0xB5, 0x45, 0x70, 0x02, 0x85, 0xE8, 0xFB,
+ 0x3A, 0x2B, 0x4A, 0x3A, 0x8F, 0x02, 0x4A, 0x52, 0x31, 0x48, 0x33, 0x58, 0x94, 0x81, 0x8B, 0x44, 0xC5, 0xC9, 0x33, 0xC3,
+ 0xE5, 0x91, 0x51, 0x3A, 0xF0, 0x2A, 0x60, 0x8C, 0xF4, 0x4F, 0x9E, 0x4A, 0x2B, 0x35, 0xC8, 0x8B, 0x74, 0xEA, 0x0D, 0xD2,
+ 0xFA, 0x97, 0x5B, 0x51, 0x89, 0x68, 0x25, 0x8C, 0x14, 0x36, 0x0E, 0x03, 0x89, 0x8B, 0x4C, 0x88, 0xE5, 0xAE, 0xF1, 0x56,
+ 0xE7, 0x57, 0xE1, 0xF1, 0xE2, 0x16, 0x61, 0x0C, 0xF1, 0xD9, 0xD0, 0xEA, 0xC7, 0xE6, 0x3D, 0xCA, 0x3D, 0xAD, 0xF5, 0x62,
+ 0x42, 0xE2, 0xB7, 0x6D, 0xD8, 0x7B, 0xE3, 0x8D, 0xF7, 0x72, 0x6E, 0x1D, 0xFB, 0x5E, 0x49, 0xF6, 0x85, 0x3D, 0x56, 0x58,
+ 0x93, 0x9B, 0x54, 0xC4, 0xAF, 0x48, 0x04, 0x81, 0xD0, 0x78, 0xF3, 0xD9, 0x52, 0xE2, 0xD3, 0x18, 0x7F, 0xF2, 0xB2, 0x31,
+ 0x64, 0x07, 0x9C, 0x32, 0x14, 0x2F, 0x6D, 0x7A, 0xBC, 0x24, 0x33, 0x39, 0x97, 0x12, 0x9A, 0x4F, 0x84, 0xBF, 0xA2, 0x9E,
+ 0x9C, 0x74, 0x51, 0x0F, 0x7E, 0x80, 0x0E, 0xE0, 0x25, 0x02, 0x5C, 0x65, 0xC5, 0x35, 0xC5, 0x05, 0xD5, 0x00, 0x00, 0xEE,
+ 0x82, 0xD5, 0x67, 0xA6, 0xD1, 0xCA, 0x95, 0xDD, 0x86, 0xF1, 0x31, 0xE9, 0x39, 0x69, 0x05, 0x59, 0x29, 0x05, 0xDC, 0xE2,
+ 0x07, 0x29, 0x91, 0xE9, 0xEC, 0x8B, 0x29, 0xCD, 0xAF, 0xA6, 0xF2, 0x80, 0x4B, 0x48, 0xF8, 0x2C, 0xCF, 0xAE, 0xD4, 0x0D,
+ 0x2F, 0x1C, 0x86, 0x49, 0x7D, 0xC0, 0xF1, 0x0D, 0x7C, 0x40, 0xA2, 0x20, 0x15, 0x8F, 0xE4, 0x45, 0x44, 0x63, 0x53, 0x2A,
+ 0x1B, 0x90, 0x30, 0x81, 0x41, 0xC3, 0x03, 0xD2, 0x57, 0xB9, 0x0B, 0x10, 0x25, 0xE8, 0xD2, 0xB9, 0xA1, 0x8F, 0x95, 0xFB,
+ 0xC9, 0xBC, 0x30, 0xCC, 0x6A, 0x0C, 0x45, 0x69, 0xF4, 0x68, 0x94, 0x8F, 0xEA, 0x0C, 0x25, 0x54, 0x13, 0xDE, 0x80, 0xA3,
+ 0xFA, 0xD0, 0xA0, 0x6D, 0x7C, 0xD0, 0xE8, 0x5F, 0x4D, 0x20, 0x5A, 0x1C, 0x85, 0x77, 0x63, 0xD4, 0x13, 0x8B, 0x40, 0x71,
+ 0x05, 0x02, 0x38, 0xFC, 0xF5, 0x39, 0xD3, 0x67, 0x5E, 0x74, 0xDE, 0xF9, 0x5A, 0xE5, 0x61, 0xDD, 0x5B, 0xD6, 0xEE, 0xD9,
+ 0xBF, 0xFF, 0xD8, 0xA1, 0x43, 0xD7, 0x2A, 0xA1, 0xBA, 0x22, 0xB7, 0x0E, 0xAA, 0x19, 0x66, 0x8E, 0x8D, 0xF3, 0x5B, 0x29,
+ 0x12, 0x43, 0xA2, 0x89, 0x3A, 0x5C, 0x80, 0x45, 0x1C, 0x94, 0xC0, 0x86, 0x40, 0x0A, 0x05, 0xAE, 0x93, 0x63, 0xD3, 0x91,
+ 0xBB, 0x9C, 0x1F, 0x12, 0x95, 0x44, 0xFA, 0x94, 0x10, 0x95, 0x42, 0xE8, 0x96, 0x2D, 0x08, 0x12, 0xEA, 0x04, 0x4E, 0xF9,
+ 0x15, 0x52, 0x46, 0x7F, 0x74, 0x95, 0xA9, 0x8A, 0x38, 0x0F, 0x04, 0x8F, 0x41, 0x49, 0x54, 0x79, 0x70, 0xDD, 0x48, 0x70,
+ 0xF9, 0xEC, 0x3C, 0x82, 0xCE, 0x50, 0x0C, 0xDC, 0xE7, 0xEC, 0x8C, 0x7C, 0x22, 0x0A, 0x2E, 0x48, 0x4B, 0x9F, 0x03, 0x6E,
+ 0x68, 0x87, 0xB0, 0xDD, 0xA8, 0xBF, 0x75, 0xE8, 0xC0, 0xAE, 0x2B, 0x1F, 0xBC, 0xEF, 0x49, 0xB2, 0x58, 0xBC, 0x64, 0xDE,
+ 0x8C, 0x79, 0x24, 0x84, 0x26, 0x43, 0x8D, 0xC7, 0x2C, 0x10, 0xAE, 0x11, 0xB4, 0x48, 0x59, 0x96, 0xFB, 0xD9, 0x8D, 0x75,
+ 0x3A, 0x06, 0xAA, 0x6A, 0x18, 0xA5, 0x03, 0xAF, 0xED, 0xD3, 0x3F, 0xA0, 0x99, 0xA3, 0x71, 0xD8, 0x5E, 0x68, 0x6B, 0xC1,
+ 0x3B, 0xA5, 0xB3, 0xA9, 0xAA, 0x8B, 0x4B, 0x02, 0x0B, 0x56, 0x1F, 0x63, 0x14, 0x63, 0x95, 0xA4, 0xBA, 0xC1, 0x78, 0x05,
+ 0xAC, 0x82, 0x4D, 0xB4, 0x08, 0x8C, 0x24, 0x83, 0x02, 0x61, 0x51, 0x03, 0x9B, 0xCB, 0xD0, 0x01, 0xB7, 0x04, 0xC6, 0x2B,
+ 0x2E, 0xBF, 0x69, 0xDB, 0x96, 0x03, 0x6B, 0x56, 0x6C, 0x27, 0x66, 0x12, 0x51, 0x49, 0x7E, 0x08, 0xBF, 0xA8, 0x21, 0x31,
+ 0x2E, 0x15, 0x89, 0xE3, 0x0A, 0x48, 0x33, 0x9C, 0xCC, 0x38, 0x34, 0x3A, 0x2E, 0x22, 0x89, 0x0B, 0x5C, 0x21, 0x32, 0x44,
+ 0x8A, 0x3E, 0x3E, 0x33, 0xBF, 0x65, 0xC5, 0x1A, 0x5F, 0x91, 0xBA, 0xC9, 0x3C, 0x19, 0xE5, 0xA1, 0x24, 0x8A, 0x6A, 0xF4,
+ 0x44, 0xB3, 0x44, 0xD4, 0x60, 0x94, 0x24, 0xE7, 0x43, 0xB1, 0x31, 0x22, 0x39, 0x0F, 0xD1, 0x13, 0x60, 0xC2, 0x83, 0x22,
+ 0x50, 0x9B, 0x6C, 0x33, 0x49, 0xE6, 0x14, 0xBD, 0x0A, 0x39, 0xC0, 0x25, 0xBD, 0x40, 0xF6, 0xB6, 0x14, 0xD5, 0x72, 0x7C,
+ 0x1C, 0xBD, 0x5B, 0x68, 0x3B, 0x90, 0x48, 0xB6, 0xAE, 0xDD, 0xF9, 0xC0, 0xFD, 0x8F, 0x7F, 0xF8, 0x9B, 0x3F, 0xFE, 0xFC,
+ 0x67, 0x1F, 0xEE, 0xDA, 0xB6, 0x13, 0x05, 0xCC, 0x98, 0x32, 0x9D, 0xC6, 0x01, 0x9E, 0x4D, 0xC2, 0xCA, 0x5D, 0x00, 0xCA,
+ 0x40, 0x6E, 0x94, 0x64, 0x2B, 0xA4, 0x21, 0x21, 0xDC, 0xB2, 0x73, 0x48, 0x3A, 0x66, 0x60, 0x35, 0xDA, 0x42, 0x0E, 0x3E,
+ 0xCA, 0x43, 0xB2, 0xC9, 0x8F, 0x4D, 0x43, 0x69, 0x90, 0xC9, 0xAF, 0x52, 0x9D, 0x16, 0x05, 0xA8, 0x6A, 0xFB, 0x45, 0xEA,
+ 0xEC, 0x76, 0xD9, 0xF1, 0x90, 0x6D, 0x94, 0x7B, 0x9B, 0x53, 0x16, 0xAC, 0x4C, 0xA2, 0xE6, 0x04, 0x70, 0x1B, 0xC6, 0x4D,
+ 0x42, 0x15, 0xCB, 0xFB, 0x93, 0x83, 0x3E, 0x08, 0xCE, 0x7E, 0x81, 0xFE, 0xB3, 0xE6, 0x50, 0xDC, 0xD1, 0xF6, 0x40, 0x0D,
+ 0xBC, 0xE0, 0x86, 0x75, 0xBB, 0xB7, 0x6D, 0x39, 0xB8, 0x7C, 0xE9, 0xA6, 0xD6, 0xC6, 0x3E, 0xAA, 0x30, 0xE4, 0xC5, 0x56,
+ 0x56, 0xCC, 0x13, 0x01, 0x21, 0x77, 0x19, 0x95, 0x90, 0x2B, 0x27, 0xA4, 0x0B, 0x1B, 0x43, 0xFC, 0x20, 0x4E, 0x84, 0x1E,
+ 0xC1, 0x2D, 0xAC, 0x3D, 0x1E, 0x89, 0x89, 0x0E, 0x8B, 0x21, 0x73, 0xC7, 0xD5, 0x78, 0x32, 0xBF, 0xE5, 0x57, 0x2C, 0x50,
+ 0x11, 0x85, 0x19, 0x25, 0x89, 0x1D, 0x44, 0x61, 0xB9, 0xC4, 0xD2, 0xD8, 0x64, 0xF2, 0x2B, 0x56, 0x66, 0x8A, 0xCC, 0xF2,
+ 0x04, 0xCD, 0x52, 0xB2, 0xC9, 0xBB, 0x08, 0x12, 0xF8, 0x41, 0x51, 0x56, 0x39, 0x3D, 0xA8, 0x82, 0x9C, 0xAA, 0x9C, 0x94,
+ 0xE2, 0xCC, 0xD8, 0x6C, 0x2A, 0xC4, 0x8A, 0xAC, 0x4A, 0x4A, 0x19, 0xE6, 0xE4, 0x94, 0x14, 0x14, 0x71, 0x6F, 0x7C, 0xF7,
+ 0x87, 0xFF, 0xFD, 0xF8, 0x8B, 0xDF, 0xBC, 0xFF, 0x87, 0xA3, 0x87, 0xAF, 0xE5, 0xF9, 0x86, 0x90, 0x10, 0x10, 0xE0, 0x2B,
+ 0xED, 0x03, 0x36, 0x08, 0x2D, 0x98, 0xE1, 0x4B, 0xA9, 0x84, 0x85, 0x41, 0x9D, 0xE2, 0x98, 0x0D, 0x98, 0x3B, 0x78, 0xB0,
+ 0x4C, 0xDC, 0xD0, 0x44, 0x58, 0x9C, 0x8F, 0x97, 0x13, 0xE9, 0x45, 0x1E, 0xEB, 0x07, 0xA0, 0xAA, 0xC3, 0x14, 0x4B, 0x94,
+ 0xC6, 0xB5, 0x5B, 0x2D, 0x3B, 0xC3, 0x52, 0x4B, 0x0E, 0xD0, 0xC2, 0x6D, 0xCC, 0x3A, 0xA5, 0x32, 0x54, 0x2B, 0x02, 0x8B,
+ 0x06, 0x94, 0x30, 0x07, 0x0C, 0x84, 0x0C, 0x8A, 0x2A, 0xCF, 0x04, 0x06, 0xB6, 0x16, 0xFB, 0x72, 0x18, 0x08, 0x3A, 0xA0,
+ 0xA4, 0xE0, 0x4C, 0x96, 0x1D, 0xDB, 0x8F, 0x74, 0xB5, 0x0F, 0x72, 0x42, 0x11, 0x1B, 0xC1, 0x81, 0x7B, 0xAC, 0x98, 0x15,
+ 0xBA, 0x30, 0x9C, 0x3F, 0x47, 0xAC, 0xD8, 0x35, 0x0E, 0x11, 0xE4, 0x17, 0x1C, 0x46, 0x36, 0x8C, 0x3F, 0x51, 0xA3, 0x84,
+ 0x46, 0x87, 0x87, 0x44, 0x87, 0x07, 0x70, 0x4D, 0xE9, 0x14, 0x15, 0x41, 0x47, 0x39, 0x28, 0x92, 0xC5, 0x16, 0x7E, 0xC9,
+ 0xD0, 0x42, 0xA3, 0xC9, 0x86, 0xB9, 0x95, 0x43, 0x5E, 0x78, 0x24, 0x2C, 0x96, 0x57, 0x13, 0x8F, 0xE1, 0x5D, 0xF1, 0xFE,
+ 0x63, 0x33, 0xB8, 0xD5, 0x12, 0x4F, 0x55, 0x82, 0x82, 0x09, 0x1E, 0xD9, 0xA9, 0xC5, 0xE5, 0x85, 0xF5, 0x72, 0xF2, 0x74,
+ 0xCB, 0x60, 0x4F, 0x9B, 0xF4, 0x04, 0x81, 0xAC, 0xDC, 0xD4, 0xA2, 0xBC, 0x94, 0x7C, 0xC6, 0x18, 0x30, 0xA0, 0x68, 0xA4,
+ 0xD3, 0xAE, 0x87, 0x2D, 0x70, 0xCB, 0x75, 0x77, 0xDC, 0x7A, 0xFD, 0xBD, 0xA0, 0x13, 0xDF, 0x54, 0x42, 0xB4, 0x18, 0x1E,
+ 0xE2, 0x5B, 0x49, 0xB6, 0x1F, 0xD8, 0x75, 0x84, 0xBE, 0xC8, 0x8A, 0x65, 0xEB, 0x30, 0xF1, 0xB8, 0x88, 0x28, 0xA4, 0xC4,
+ 0x49, 0x02, 0x7C, 0x64, 0x30, 0x80, 0xB7, 0xE4, 0xE8, 0xC0, 0xD3, 0x92, 0xB3, 0x14, 0xA5, 0xEC, 0xAC, 0x84, 0x4C, 0x5D,
+ 0xE2, 0x92, 0x0E, 0x57, 0x69, 0x84, 0x28, 0xF9, 0xD5, 0xAE, 0xA0, 0x03, 0x55, 0xAB, 0x12, 0x4F, 0x12, 0x35, 0x02, 0x56,
+ 0x82, 0x18, 0xA6, 0xD2, 0x36, 0x25, 0x1E, 0xC8, 0x1E, 0x49, 0x64, 0x93, 0xC0, 0x30, 0x27, 0x00, 0x44, 0xA2, 0xCB, 0x04,
+ 0xF7, 0x74, 0xCB, 0x86, 0x7D, 0x9B, 0x37, 0xEE, 0x93, 0xB3, 0xFD, 0x4A, 0x1B, 0x01, 0x74, 0x72, 0x1B, 0xFA, 0x42, 0xB4,
+ 0x9B, 0x10, 0x22, 0xF0, 0x1D, 0x16, 0x10, 0xCE, 0x05, 0xE6, 0x8C, 0xAC, 0x41, 0x8F, 0xF0, 0xC0, 0x68, 0x2C, 0x9A, 0x0B,
+ 0x76, 0xC5, 0x86, 0x2E, 0x0C, 0x43, 0xC4, 0xB2, 0x02, 0xC2, 0x28, 0x0C, 0xD9, 0xA9, 0xC9, 0x2D, 0x07, 0x97, 0xF2, 0x48,
+ 0xA8, 0x7F, 0x58, 0x48, 0x40, 0x28, 0x4F, 0xE0, 0xDF, 0xA1, 0x27, 0xFC, 0x00, 0x45, 0xE2, 0x52, 0xBC, 0x14, 0x3A, 0x4E,
+ 0x8A, 0xA1, 0x1D, 0x9B, 0x88, 0xE8, 0x15, 0x8B, 0x78, 0x9C, 0x3A, 0x23, 0x27, 0xAD, 0x84, 0x1C, 0x89, 0xD5, 0x56, 0xDF,
+ 0x07, 0x2A, 0xB6, 0x37, 0x0F, 0x74, 0x77, 0x2C, 0x2D, 0xC9, 0xAB, 0xA9, 0x2A, 0x69, 0x22, 0x78, 0x14, 0xA5, 0x97, 0x02,
+ 0x92, 0x29, 0x49, 0xE9, 0xD8, 0x04, 0xF1, 0x89, 0x4A, 0x4D, 0x3C, 0x29, 0x31, 0x15, 0x14, 0x61, 0x1A, 0xC6, 0x79, 0xF3,
+ 0x03, 0xDD, 0x43, 0x74, 0x0C, 0x5B, 0x6A, 0x5B, 0xE8, 0xB7, 0x4F, 0xB9, 0x64, 0x32, 0xA0, 0x87, 0xA6, 0x49, 0xA5, 0x68,
+ 0xB5, 0x02, 0x00, 0x82, 0x45, 0xA7, 0x5C, 0x7C, 0x60, 0xC9, 0x4D, 0x13, 0x0C, 0x49, 0x26, 0x59, 0xC9, 0x62, 0xA7, 0xE0,
+ 0x88, 0xB9, 0xEC, 0x01, 0x06, 0xD6, 0x02, 0x50, 0x8A, 0x4B, 0x98, 0xFF, 0x28, 0x05, 0xC4, 0x39, 0x84, 0x46, 0x3B, 0xDE,
+ 0xB3, 0x31, 0x43, 0x92, 0x28, 0x00, 0xC1, 0x69, 0x78, 0x44, 0x45, 0x2C, 0x14, 0x23, 0xC5, 0xFC, 0x81, 0xD4, 0xB3, 0xCF,
+ 0x3A, 0x03, 0xD1, 0x6C, 0xDA, 0xB8, 0x8F, 0xF3, 0xA1, 0xBA, 0xBB, 0x96, 0x61, 0x98, 0x44, 0xD4, 0xDC, 0xF4, 0x42, 0xF6,
+ 0xB7, 0x12, 0x39, 0x29, 0xCD, 0x30, 0x7F, 0xC4, 0x0D, 0xB0, 0x00, 0x38, 0x48, 0x96, 0x30, 0x80, 0x40, 0xB9, 0x10, 0x89,
+ 0x2F, 0x08, 0x97, 0xFA, 0x7C, 0x41, 0x30, 0xA2, 0x0F, 0x9A, 0x1F, 0x4C, 0x4B, 0x4A, 0xAF, 0x17, 0xCE, 0x87, 0xDA, 0x1D,
+ 0x10, 0x34, 0x3F, 0x28, 0xC8, 0x2F, 0x24, 0x78, 0x01, 0x27, 0xBC, 0x84, 0xF1, 0x38, 0x4A, 0xE2, 0x6F, 0x79, 0x29, 0xD2,
+ 0x36, 0xCC, 0x42, 0x70, 0x2C, 0x28, 0x4A, 0x52, 0xAC, 0x58, 0x69, 0x0F, 0x03, 0x65, 0x31, 0x61, 0x49, 0x24, 0xAC, 0xB5,
+ 0x00, 0x4F, 0x51, 0x23, 0x55, 0xC5, 0xD2, 0xC1, 0xF5, 0x1B, 0xD6, 0xEC, 0xE2, 0x78, 0x8C, 0x55, 0x2B, 0xB6, 0xEE, 0xDE,
+ 0x79, 0x74, 0xDF, 0x9E, 0x63, 0x87, 0xF6, 0x5F, 0x7F, 0x60, 0xCF, 0xD5, 0xE4, 0x6F, 0x14, 0x34, 0x8B, 0x5A, 0xFB, 0x5A,
+ 0xEA, 0xDB, 0xA8, 0x5D, 0x38, 0x45, 0xAC, 0xA6, 0xB2, 0x89, 0x3C, 0x38, 0x23, 0x35, 0x87, 0x57, 0x13, 0x9B, 0x08, 0xA0,
+ 0xC7, 0x19, 0xC3, 0x28, 0x9E, 0xEF, 0x81, 0x88, 0x8A, 0x88, 0x06, 0xA6, 0xCC, 0x51, 0x4B, 0x21, 0xA7, 0xD0, 0x81, 0x57,
+ 0xDC, 0x96, 0xB5, 0xAA, 0x70, 0xE4, 0xC9, 0x8B, 0x54, 0xE2, 0x96, 0xC1, 0x21, 0x3A, 0x30, 0x3C, 0xAD, 0x53, 0xB2, 0x07,
+ 0xE4, 0x41, 0xE3, 0x13, 0x72, 0xAB, 0x25, 0x85, 0xCC, 0xF9, 0xA4, 0x48, 0x19, 0xE5, 0x0A, 0xC0, 0x28, 0x25, 0x1B, 0xAE,
+ 0x30, 0x7F, 0xB6, 0x2F, 0x31, 0x99, 0xFE, 0xC1, 0x86, 0xB5, 0x7B, 0x07, 0x7A, 0x56, 0x02, 0xCA, 0x84, 0x4A, 0xD9, 0xBD,
+ 0x43, 0x3B, 0xCB, 0x40, 0x84, 0x86, 0x59, 0x84, 0x8E, 0xEC, 0x70, 0x02, 0xF4, 0x81, 0x69, 0xB3, 0xC2, 0x17, 0x46, 0x20,
+ 0x59, 0xA4, 0x2C, 0xA7, 0x32, 0xCE, 0x0B, 0xE4, 0x36, 0x60, 0xDE, 0x42, 0x6E, 0xFD, 0x67, 0xFB, 0xFB, 0xCF, 0x0D, 0x60,
+ 0xC7, 0xB2, 0x2C, 0x73, 0xCD, 0xE3, 0x81, 0x0B, 0x82, 0x64, 0xCD, 0x0B, 0x14, 0x0D, 0x05, 0x84, 0x82, 0x63, 0x68, 0x1D,
+ 0xE9, 0xF0, 0xCA, 0xE4, 0xBE, 0x60, 0x14, 0xF5, 0x44, 0x43, 0x55, 0x4B, 0x43, 0x65, 0x67, 0x6E, 0x7A, 0x69, 0x05, 0xE7,
+ 0xF3, 0x57, 0x77, 0x2E, 0x5F, 0xBC, 0x11, 0xD7, 0x5C, 0xB7, 0x66, 0xE7, 0x91, 0x43, 0xD7, 0xEF, 0xDD, 0x7F, 0xCD, 0x2D,
+ 0xB7, 0x3C, 0x70, 0xFC, 0xF8, 0x1D, 0x00, 0x26, 0xC5, 0x1A, 0x47, 0x97, 0xF0, 0x75, 0x61, 0xFA, 0x35, 0x62, 0xF4, 0xF0,
+ 0x69, 0x1E, 0xD3, 0x2D, 0xA6, 0x32, 0x2D, 0xC8, 0xE3, 0x6B, 0xA3, 0x3A, 0x38, 0x2D, 0xB5, 0xBF, 0x8B, 0x2F, 0x1A, 0x1A,
+ 0xE4, 0xA0, 0x76, 0x5E, 0x7F, 0xCA, 0xC4, 0x09, 0x98, 0x1A, 0x0A, 0xA0, 0x36, 0xF2, 0x51, 0xE1, 0x6A, 0x45, 0x66, 0x57,
+ 0x9A, 0xC7, 0xF0, 0x35, 0x17, 0x3A, 0x49, 0x07, 0x63, 0x39, 0x4C, 0x99, 0xF1, 0x59, 0xCC, 0xD9, 0x69, 0xA9, 0xB2, 0xD4,
+ 0x1B, 0xBC, 0x40, 0xA4, 0xD7, 0x78, 0xBA, 0x2C, 0x33, 0x59, 0x95, 0x9C, 0x24, 0x5A, 0x13, 0x64, 0x49, 0xD4, 0xB4, 0x5E,
+ 0x63, 0x3E, 0x6A, 0xDA, 0x4D, 0xC1, 0x33, 0x26, 0x5F, 0x8A, 0x5C, 0xD6, 0xAF, 0xDD, 0x45, 0x24, 0x20, 0xC4, 0x09, 0xA7,
+ 0x3C, 0xB5, 0x00, 0x59, 0xE3, 0xDD, 0x54, 0xB9, 0xE4, 0xA6, 0x20, 0x06, 0xF2, 0x02, 0x2E, 0x78, 0xD0, 0x04, 0xDE, 0x28,
+ 0xE9, 0x44, 0x05, 0x84, 0x61, 0x6E, 0x18, 0x7E, 0xE0, 0x1C, 0x3F, 0xCE, 0xB3, 0x43, 0xD0, 0x0B, 0x66, 0x8B, 0xD0, 0xA5,
+ 0x6F, 0xE8, 0x3B, 0x8F, 0x86, 0x2E, 0xB7, 0x7A, 0x4D, 0x7F, 0x97, 0x0B, 0x6E, 0xD1, 0x04, 0x5E, 0x82, 0x1A, 0xD4, 0x93,
+ 0xD0, 0x44, 0x64, 0xB0, 0x94, 0xBB, 0x44, 0x0B, 0x66, 0x12, 0x14, 0xD5, 0x60, 0x60, 0x5E, 0x46, 0x59, 0x6B, 0x5D, 0x6F,
+ 0x4B, 0x43, 0x6F, 0x7F, 0xF7, 0xCA, 0x81, 0x1E, 0xCE, 0x9C, 0x3F, 0xB0, 0x63, 0xDB, 0xD1, 0x43, 0x07, 0x8E, 0xDF, 0x7A,
+ 0xEB, 0x83, 0xB7, 0xDC, 0xF1, 0xC8, 0x50, 0xDF, 0xEA, 0xD9, 0xD3, 0xE7, 0x68, 0x59, 0x73, 0xD6, 0x19, 0x67, 0x5E, 0x78,
+ 0xC1, 0x79, 0x90, 0xC6, 0xA7, 0x4C, 0x9C, 0xC4, 0x62, 0xD6, 0xCB, 0xC1, 0x87, 0x3C, 0xC8, 0x2D, 0xDC, 0x9C, 0x89, 0xE3,
+ 0x27, 0x4D, 0x1C, 0x3F, 0x81, 0xAE, 0xFE, 0xC5, 0x17, 0x5D, 0x80, 0xA3, 0xA3, 0x03, 0xAC, 0x8D, 0x66, 0x9A, 0xE8, 0xC0,
+ 0x0B, 0x32, 0x7A, 0x9D, 0x96, 0x02, 0x0A, 0x65, 0xB0, 0xFB, 0x97, 0x45, 0x21, 0xFA, 0x25, 0x28, 0x94, 0xEE, 0xCD, 0x53,
+ 0x5D, 0x32, 0x93, 0x7A, 0x83, 0x48, 0x7C, 0xB4, 0x26, 0x1C, 0x0F, 0xB0, 0x70, 0x64, 0x72, 0x24, 0x21, 0xF9, 0x6A, 0xE5,
+ 0x62, 0x72, 0xB5, 0x48, 0x6D, 0x34, 0x71, 0x1E, 0xDA, 0x94, 0xF1, 0xE3, 0x99, 0xBD, 0xD0, 0x3C, 0xC8, 0x4C, 0xA1, 0x0C,
+ 0x26, 0xC7, 0x4F, 0x03, 0x97, 0xC9, 0xEB, 0x1B, 0xAB, 0xDB, 0xAB, 0xCA, 0x9B, 0x10, 0xBD, 0xA9, 0x4E, 0xD3, 0x90, 0x1A,
+ 0x81, 0x84, 0x68, 0x8C, 0x04, 0x5D, 0xE4, 0x91, 0x04, 0x97, 0x24, 0x44, 0x5A, 0xB6, 0xB3, 0x16, 0xB0, 0x67, 0x9F, 0xD2,
+ 0x8F, 0x33, 0x5C, 0x38, 0x42, 0x84, 0x25, 0x6A, 0x98, 0x35, 0x57, 0xAE, 0xCD, 0xAD, 0x51, 0x86, 0x3F, 0x4F, 0x43, 0x07,
+ 0x68, 0x8E, 0x96, 0x09, 0x93, 0x00, 0xB0, 0x08, 0x87, 0x10, 0x1D, 0xB0, 0xB5, 0x1F, 0x52, 0x41, 0x56, 0x59, 0x4D, 0x45,
+ 0x1B, 0x2D, 0x58, 0xEC, 0xB7, 0xB7, 0x6B, 0xF9, 0xD0, 0xD0, 0xDA, 0xCB, 0xB6, 0x1D, 0x3E, 0x7A, 0xE4, 0xC6, 0x5B, 0x6E,
+ 0xBA, 0xFF, 0xF6, 0xDB, 0x1F, 0xE6, 0x54, 0x49, 0xFE, 0x10, 0xE9, 0x9F, 0x79, 0xFA, 0x19, 0x48, 0x9C, 0xB6, 0x3C, 0x43,
+ 0x94, 0xD9, 0xD3, 0x66, 0x10, 0xCF, 0x58, 0x73, 0x67, 0xCC, 0xE2, 0x76, 0xF6, 0x8C, 0x99, 0x33, 0x2F, 0x9D, 0x31, 0x6D,
+ 0xD2, 0x64, 0x0E, 0x03, 0xBD, 0x74, 0xCA, 0x25, 0xF4, 0x89, 0x79, 0x6F, 0xC4, 0x64, 0xB0, 0x71, 0xC4, 0x0F, 0x4E, 0x81,
+ 0xF5, 0x49, 0x8E, 0x02, 0x44, 0x07, 0x9E, 0x34, 0x54, 0xAF, 0x47, 0x97, 0x08, 0x23, 0x95, 0x9A, 0x11, 0xBA, 0x43, 0x2B,
+ 0x3B, 0x39, 0x61, 0x3D, 0x39, 0x73, 0xD5, 0x0C, 0x55, 0x9A, 0x5C, 0xD2, 0xBD, 0x80, 0xCE, 0x25, 0x1C, 0x53, 0x74, 0x30,
+ 0x6D, 0xD2, 0xA5, 0x30, 0x9A, 0xEA, 0x2B, 0x5B, 0x11, 0x2E, 0xB2, 0xE0, 0x91, 0xC4, 0x84, 0x34, 0x0E, 0xE5, 0xA2, 0xAC,
+ 0x6D, 0x6F, 0xE9, 0xCB, 0x61, 0xEF, 0x6A, 0xBE, 0xEC, 0x08, 0x8B, 0x0D, 0x4F, 0x4C, 0x4D, 0xCA, 0x24, 0x07, 0x37, 0x85,
+ 0x1E, 0x9A, 0x08, 0x07, 0x73, 0x34, 0x05, 0x44, 0xF4, 0x6A, 0xF8, 0x9C, 0x24, 0xC5, 0x62, 0x98, 0xE1, 0x3B, 0x6D, 0x16,
+ 0x0B, 0x3E, 0x8E, 0x91, 0x8E, 0x2F, 0x4B, 0x7E, 0x65, 0xD4, 0xC0, 0x93, 0x09, 0x8F, 0x00, 0x14, 0x4E, 0x40, 0x30, 0x27,
+ 0x6D, 0xD5, 0x12, 0x04, 0x30, 0xC0, 0x15, 0xB2, 0x93, 0x8B, 0x5A, 0xAA, 0xBB, 0x7B, 0xDA, 0x97, 0x74, 0xB4, 0x0C, 0xAD,
+ 0x59, 0xB1, 0x8D, 0x03, 0x9E, 0x39, 0x51, 0x95, 0xAA, 0xE5, 0xA6, 0x9B, 0xEE, 0xA3, 0x9B, 0xC2, 0x29, 0x07, 0x67, 0x9C,
+ 0xC6, 0xD7, 0x15, 0x9E, 0x0E, 0xC5, 0x44, 0xA5, 0x8F, 0x6A, 0x61, 0x8C, 0xEB, 0x32, 0xD6, 0x30, 0x17, 0x93, 0xA7, 0x7B,
+ 0xCF, 0xF2, 0xF3, 0xF5, 0xE3, 0x1F, 0x21, 0x7D, 0x3C, 0x00, 0x08, 0xC2, 0x09, 0xD0, 0x01, 0x71, 0xCB, 0xC7, 0x93, 0xE6,
+ 0x7B, 0xB2, 0xFE, 0xA4, 0x4C, 0x8E, 0x72, 0xFD, 0x12, 0x89, 0x3B, 0x4C, 0xD5, 0xAF, 0x20, 0x50, 0x9E, 0x42, 0x01, 0xF1,
+ 0xC9, 0x0E, 0x16, 0xC5, 0x25, 0x09, 0xE5, 0x26, 0x5E, 0x82, 0x81, 0x5B, 0x31, 0x4A, 0xF7, 0x5B, 0x92, 0xF7, 0xE0, 0x18,
+ 0xC4, 0x8D, 0x99, 0x24, 0xC7, 0x25, 0x51, 0x16, 0x21, 0x41, 0xCC, 0x13, 0xB9, 0x20, 0xDF, 0xE4, 0xD8, 0xCC, 0x84, 0x88,
+ 0x54, 0x92, 0x10, 0x42, 0x62, 0x3E, 0x1C, 0xDB, 0x9C, 0xB2, 0xF4, 0xC4, 0x6C, 0x62, 0x80, 0x6C, 0x67, 0x8B, 0x91, 0x73,
+ 0x36, 0xD1, 0x5F, 0xD0, 0xC2, 0x50, 0x50, 0x85, 0x4F, 0x28, 0x6B, 0xF6, 0x82, 0xB9, 0xB3, 0xE7, 0xA9, 0xED, 0x8B, 0x0E,
+ 0x66, 0xCC, 0x9E, 0x3D, 0x0D, 0x93, 0xF4, 0x55, 0x0B, 0x9D, 0x3B, 0x55, 0xAE, 0x55, 0x3D, 0xEA, 0x1C, 0xFE, 0x33, 0x17,
+ 0x00, 0x5C, 0xA4, 0xED, 0x20, 0x21, 0x80, 0x46, 0x5E, 0x84, 0x1A, 0x48, 0x5B, 0x49, 0x58, 0x61, 0x50, 0xD3, 0x5C, 0x22,
+ 0x0B, 0xEA, 0xEF, 0x1C, 0x1E, 0xE8, 0x5A, 0xC1, 0xE9, 0x30, 0xDB, 0xB7, 0x1E, 0xBC, 0xE6, 0xAA, 0xDB, 0x6F, 0xBC, 0xE1,
+ 0x3E, 0x94, 0x11, 0x1D, 0x18, 0x83, 0x13, 0x4C, 0xB8, 0xF0, 0x22, 0xDF, 0xA9, 0xD3, 0xB1, 0x7A, 0xB1, 0x80, 0x79, 0xF3,
+ 0x29, 0xF8, 0xE5, 0x3D, 0xCC, 0x97, 0xA3, 0xAC, 0x74, 0x94, 0x22, 0x89, 0x80, 0xE9, 0xDE, 0x23, 0x7A, 0x96, 0x0E, 0x5A,
+ 0x54, 0x07, 0x12, 0x93, 0x4F, 0x32, 0x73, 0xB1, 0x6B, 0x77, 0x59, 0x71, 0x7F, 0x15, 0x65, 0x75, 0x94, 0x32, 0x60, 0x65,
+ 0x19, 0x71, 0x8F, 0x58, 0xBD, 0x34, 0x70, 0xD2, 0x34, 0x0C, 0xA4, 0xC3, 0x7C, 0x32, 0xC4, 0x1B, 0xC7, 0x03, 0xA8, 0x92,
+ 0x4C, 0xDF, 0x2A, 0x3E, 0x14, 0xA2, 0xB5, 0x30, 0x04, 0x30, 0x49, 0x9E, 0xCC, 0x5B, 0x9A, 0x3B, 0x1D, 0x3B, 0x92, 0x23,
+ 0x70, 0x82, 0x03, 0x39, 0xC0, 0x31, 0x31, 0x3B, 0xA9, 0xB8, 0x34, 0xA3, 0xB2, 0x3C, 0xA7, 0x06, 0x63, 0xAC, 0xAF, 0xE8,
+ 0x20, 0x31, 0x27, 0xBB, 0x90, 0xF6, 0x4E, 0x6A, 0x0E, 0x88, 0x81, 0x07, 0x00, 0x62, 0x84, 0x04, 0xF9, 0xB4, 0x7E, 0xFE,
+ 0xF3, 0xE7, 0xFA, 0x2B, 0xD4, 0x70, 0xAB, 0x4E, 0x80, 0x02, 0x58, 0xF3, 0xA6, 0xCD, 0xF4, 0x9D, 0x2A, 0x10, 0x01, 0x38,
+ 0xA0, 0x69, 0x79, 0xC4, 0xF8, 0x81, 0x0C, 0xFE, 0x08, 0x0C, 0x73, 0x04, 0x9D, 0xD1, 0x01, 0xD6, 0x20, 0x9D, 0x8F, 0xB0,
+ 0x38, 0xAA, 0xB6, 0xCA, 0xB2, 0xFA, 0x76, 0xB8, 0xCB, 0x35, 0x1D, 0x64, 0x41, 0x4B, 0x06, 0xD6, 0x11, 0x8D, 0x37, 0xAE,
+ 0xDD, 0x45, 0x3C, 0xB8, 0xEA, 0xCA, 0x5B, 0xAF, 0xBF, 0xFE, 0xEE, 0x5D, 0xDB, 0x2F, 0x5F, 0x30, 0x33, 0x80, 0x08, 0x4C,
+ 0x51, 0x49, 0x4D, 0xC3, 0x40, 0x17, 0x92, 0x1D, 0x4B, 0xE5, 0xEE, 0x8C, 0x4C, 0x5C, 0xB9, 0xAB, 0xF4, 0x4D, 0x00, 0x30,
+ 0x1E, 0x40, 0xE8, 0x32, 0x3A, 0x00, 0xFD, 0xD0, 0x81, 0x93, 0xE1, 0x7C, 0x19, 0x23, 0xF5, 0x94, 0xF6, 0x7E, 0x12, 0xDC,
+ 0x7F, 0x29, 0x91, 0xCF, 0x06, 0x00, 0x76, 0xD3, 0x33, 0xB8, 0x67, 0x8D, 0xE8, 0xC0, 0x69, 0xB5, 0xC6, 0xC5, 0x87, 0x44,
+ 0xE9, 0x84, 0x07, 0x94, 0xA7, 0x5E, 0xD3, 0xCF, 0x03, 0x38, 0x90, 0x54, 0x10, 0x06, 0x40, 0x83, 0xC6, 0x8A, 0xCE, 0xDA,
+ 0xAA, 0x56, 0x92, 0xD4, 0xC5, 0x83, 0xEB, 0xA0, 0x4D, 0x70, 0x56, 0x64, 0x75, 0x71, 0x53, 0x7E, 0x4E, 0x39, 0x0A, 0x20,
+ 0x4A, 0x83, 0x8D, 0x64, 0xB7, 0x68, 0x82, 0x1C, 0x09, 0xF7, 0x27, 0x20, 0xD3, 0xD0, 0x47, 0x9D, 0x12, 0x0C, 0x8C, 0xA5,
+ 0x8B, 0xD5, 0x4F, 0xC5, 0x03, 0xA6, 0x1B, 0x3F, 0x10, 0xE9, 0xAB, 0x6E, 0xF4, 0x96, 0xA7, 0x89, 0xBE, 0xFD, 0x82, 0xD1,
+ 0x22, 0x21, 0x9D, 0x08, 0xCF, 0x3F, 0x25, 0x65, 0xA0, 0x10, 0xA9, 0xE4, 0xEC, 0xB8, 0x8A, 0x36, 0x3A, 0xDB, 0x1D, 0x8D,
+ 0x03, 0xD4, 0xEA, 0xE8, 0x60, 0xEB, 0xE6, 0x03, 0x5B, 0x36, 0xED, 0x23, 0x1E, 0x5C, 0x75, 0xD5, 0xAD, 0xBB, 0x76, 0x5C,
+ 0x3E, 0xDF, 0xD7, 0xEF, 0xBC, 0xB3, 0xCF, 0x30, 0x6F, 0xD8, 0x4F, 0x3E, 0xC2, 0xFC, 0x20, 0x14, 0x10, 0x32, 0xDF, 0x4C,
+ 0xAB, 0xFC, 0x83, 0x08, 0x6C, 0x3A, 0xC5, 0x32, 0x86, 0xEF, 0x80, 0x8F, 0xB4, 0x31, 0x16, 0x4A, 0xEE, 0x17, 0x1E, 0x14,
+ 0xC6, 0x21, 0x0E, 0xA2, 0x03, 0xF8, 0x84, 0x5F, 0x81, 0x2A, 0x46, 0xD6, 0x92, 0x71, 0xBA, 0xEB, 0xAB, 0x64, 0x7D, 0xEA,
+ 0x22, 0xD9, 0x80, 0x8F, 0xF5, 0x00, 0x53, 0x21, 0x4B, 0x43, 0xD1, 0xED, 0x75, 0xC7, 0x41, 0xAE, 0x26, 0x75, 0x01, 0xD3,
+ 0xA9, 0x21, 0xF9, 0x24, 0xA0, 0x2A, 0xB6, 0x49, 0x22, 0x0F, 0x20, 0x90, 0x8C, 0x56, 0x73, 0x22, 0x79, 0x5D, 0x4F, 0x67,
+ 0xEB, 0xE2, 0xA5, 0x8B, 0x37, 0x1C, 0x39, 0x72, 0xFD, 0x8A, 0xE5, 0x9B, 0x69, 0x5A, 0x70, 0x66, 0x5A, 0x71, 0x56, 0x75,
+ 0x71, 0x46, 0x05, 0xE7, 0xAA, 0xE1, 0x34, 0xD4, 0x3B, 0x88, 0x4F, 0x1B, 0x7F, 0x66, 0x6C, 0x17, 0x28, 0x15, 0xC6, 0xEC,
+ 0xF9, 0x48, 0x9F, 0x53, 0x4E, 0x0D, 0x1C, 0x61, 0xF2, 0xBE, 0xD8, 0x3B, 0xA0, 0x64, 0xB4, 0x22, 0xF1, 0xC0, 0x6F, 0xA6,
+ 0x0D, 0xCB, 0x0B, 0x78, 0x1A, 0x38, 0x16, 0x1E, 0x4E, 0xEF, 0x53, 0x26, 0x80, 0xE4, 0x69, 0x58, 0x03, 0x09, 0x71, 0x75,
+ 0x51, 0x33, 0x27, 0x03, 0xA1, 0x06, 0x2A, 0x64, 0x38, 0x96, 0x4B, 0x86, 0xD6, 0xAF, 0x5D, 0xBB, 0x03, 0x2C, 0x42, 0x13,
+ 0x87, 0x2F, 0xBF, 0xE1, 0xEA, 0x63, 0xB7, 0x05, 0x05, 0x84, 0x5D, 0x74, 0xDE, 0x38, 0xB4, 0x8E, 0xE8, 0xD5, 0xD2, 0x65,
+ 0x39, 0x42, 0x17, 0xB4, 0xD1, 0xB7, 0x64, 0x30, 0x67, 0x21, 0x69, 0xB7, 0x2E, 0x6A, 0x20, 0xA4, 0x8F, 0x2B, 0xE8, 0x5D,
+ 0x9F, 0xD1, 0xF4, 0x60, 0x27, 0x9F, 0x39, 0xB9, 0xEB, 0xA0, 0xB9, 0xA6, 0xB2, 0x27, 0xDD, 0xDB, 0x91, 0xBB, 0x52, 0x94,
+ 0x61, 0xE6, 0xEE, 0x3A, 0x99, 0xCC, 0x64, 0xB9, 0x7F, 0x38, 0xB8, 0xA3, 0x80, 0x70, 0xC3, 0x8E, 0x09, 0x89, 0x46, 0xEE,
+ 0x20, 0x95, 0x1C, 0xFE, 0x67, 0x72, 0x47, 0x1E, 0x01, 0x61, 0xAA, 0x2B, 0x0C, 0x1F, 0x62, 0x70, 0xF5, 0xA6, 0x0D, 0x7B,
+ 0x0F, 0x1F, 0xBE, 0x6E, 0xEF, 0x9E, 0xAB, 0xF8, 0xD8, 0x7B, 0x77, 0x1F, 0xEB, 0x6A, 0x5B, 0xB2, 0xA8, 0x65, 0x31, 0xDF,
+ 0x92, 0x51, 0x5F, 0xD9, 0x5E, 0x5B, 0xD2, 0x9A, 0x97, 0x56, 0x2C, 0xFC, 0xB0, 0x0C, 0x99, 0x62, 0x46, 0x9B, 0x32, 0x3B,
+ 0x32, 0x20, 0x9C, 0x8F, 0x67, 0xD2, 0x7F, 0x7F, 0x0D, 0xD1, 0xEA, 0x10, 0x26, 0x48, 0x4A, 0xB2, 0xA4, 0x79, 0x11, 0xB7,
+ 0x6A, 0xFE, 0x80, 0x06, 0x17, 0x8A, 0xDD, 0x08, 0x8B, 0x82, 0x23, 0x34, 0x38, 0x82, 0x5E, 0x3F, 0x2D, 0x29, 0x46, 0x05,
+ 0xA0, 0x5F, 0x5B, 0x53, 0x3F, 0xFC, 0xA8, 0xBE, 0x8E, 0xE5, 0x2B, 0x96, 0x6E, 0x05, 0x91, 0x28, 0xC4, 0xF6, 0xEC, 0x3E,
+ 0xB6, 0x6B, 0xC7, 0xD1, 0xBD, 0xBB, 0xAF, 0x24, 0x32, 0x97, 0xE4, 0x55, 0xD1, 0xE8, 0x55, 0x05, 0x40, 0xF3, 0x09, 0xF7,
+ 0x0B, 0xE5, 0x64, 0x4F, 0x05, 0x19, 0x67, 0xA6, 0x2B, 0x52, 0x0E, 0x8E, 0x5C, 0xC8, 0x51, 0x87, 0x22, 0x7A, 0xA9, 0xCC,
+ 0x51, 0x40, 0x50, 0x88, 0x73, 0x57, 0xAE, 0xC3, 0xA4, 0x2F, 0xA6, 0x23, 0xE2, 0x31, 0xCB, 0xCD, 0x2C, 0x8D, 0xE8, 0x0D,
+ 0x7F, 0xD8, 0xDB, 0x19, 0x85, 0xE7, 0xCD, 0x90, 0x1A, 0x96, 0x15, 0xDD, 0x92, 0xF4, 0xA8, 0x64, 0x99, 0xEB, 0xBA, 0x3C,
+ 0x32, 0xC4, 0x3D, 0x46, 0x07, 0x27, 0x8F, 0x19, 0xAC, 0x13, 0x00, 0xDF, 0x5C, 0xD3, 0x97, 0xA6, 0x2B, 0x40, 0x49, 0xD9,
+ 0xC6, 0x37, 0x62, 0xF6, 0x0E, 0xAF, 0x5A, 0xBA, 0x89, 0x53, 0x70, 0xB6, 0x6F, 0x3D, 0xB4, 0x6F, 0xEF, 0xD5, 0xD7, 0x5E,
+ 0x7B, 0xE7, 0x9D, 0x77, 0x3E, 0xBA, 0x7F, 0xEF, 0xD5, 0x7B, 0x76, 0x5D, 0x09, 0x14, 0xE0, 0x07, 0xD4, 0x47, 0xCB, 0x86,
+ 0x36, 0x30, 0x07, 0xA6, 0x8D, 0x4A, 0xE1, 0x4A, 0x3F, 0x99, 0x7E, 0x00, 0xEF, 0x56, 0x46, 0xA7, 0x48, 0xD0, 0x5F, 0xE6,
+ 0xD5, 0x7C, 0x42, 0x84, 0x82, 0x68, 0xD8, 0x77, 0xAE, 0x81, 0x11, 0x4D, 0x83, 0x6F, 0x66, 0x49, 0x72, 0xC2, 0x52, 0xC1,
+ 0xE9, 0x35, 0x7F, 0x25, 0x88, 0xE1, 0x17, 0x22, 0x0C, 0x09, 0xD3, 0xB1, 0x20, 0x29, 0xE0, 0x58, 0x27, 0x26, 0x39, 0x75,
+ 0xE5, 0xED, 0x8C, 0x36, 0x01, 0xA2, 0xCD, 0x1B, 0xF7, 0xEE, 0xBC, 0xEC, 0x08, 0x5D, 0xF4, 0xD5, 0x2B, 0xB7, 0xD3, 0xC7,
+ 0x5D, 0xB1, 0x7C, 0xCB, 0x8E, 0xAD, 0x87, 0x21, 0x6A, 0x90, 0x11, 0xF1, 0x0A, 0xC4, 0x73, 0x31, 0xF6, 0x00, 0x29, 0x86,
+ 0x45, 0x01, 0x6A, 0xEC, 0x08, 0xDD, 0xBC, 0x19, 0x1E, 0xE4, 0x95, 0x35, 0xEB, 0xD3, 0x69, 0x2E, 0x4B, 0x9E, 0xC0, 0x7B,
+ 0x56, 0x1D, 0x7C, 0xD9, 0x62, 0x3B, 0x86, 0x1A, 0x38, 0x48, 0xC2, 0xAD, 0x15, 0xA5, 0x14, 0xBA, 0x71, 0x52, 0xEB, 0x6A,
+ 0xA9, 0x65, 0xAE, 0x9D, 0x61, 0xCE, 0x58, 0xFA, 0x86, 0x4B, 0x6F, 0x1A, 0x19, 0x2D, 0xC4, 0xC8, 0xEC, 0x02, 0x02, 0x88,
+ 0x14, 0x65, 0xA1, 0x31, 0xA0, 0x04, 0xF9, 0x38, 0xDF, 0xA3, 0x0D, 0x73, 0x5B, 0x76, 0x33, 0x94, 0xD5, 0xE2, 0x10, 0xD4,
+ 0x04, 0xA4, 0x86, 0x74, 0xE8, 0x60, 0xA9, 0x1C, 0x3E, 0x74, 0xFD, 0xCD, 0xB7, 0x3E, 0x74, 0xC7, 0x1D, 0x8F, 0xDC, 0x7B,
+ 0xFF, 0xD3, 0x77, 0xDF, 0xF9, 0xD8, 0x0D, 0xD7, 0xDD, 0x7D, 0xFC, 0x9A, 0x3B, 0xF7, 0xEC, 0xBC, 0x6A, 0xE5, 0xF0, 0x16,
+ 0x8A, 0xA3, 0xC1, 0xCE, 0x15, 0x32, 0x66, 0x89, 0x93, 0xEE, 0xBA, 0x76, 0x00, 0x69, 0x84, 0xF1, 0xC1, 0x40, 0x64, 0x64,
+ 0x6A, 0x44, 0x23, 0x19, 0x88, 0xEA, 0xC3, 0x50, 0x0B, 0x4C, 0xD6, 0x24, 0xD9, 0xA1, 0x7F, 0xF0, 0xBC, 0x00, 0xC1, 0x6E,
+ 0xCE, 0xA4, 0x0D, 0x90, 0x3A, 0x59, 0x08, 0x09, 0xF4, 0x56, 0x99, 0x85, 0x45, 0x26, 0x02, 0x6E, 0xC5, 0xD9, 0x55, 0xAD,
+ 0x7C, 0xE3, 0x6F, 0xF7, 0x72, 0x3A, 0x13, 0x28, 0x60, 0xA0, 0x6F, 0x15, 0x86, 0x4F, 0x35, 0x40, 0x1F, 0x77, 0xE5, 0xF0,
+ 0x56, 0xBA, 0x14, 0x14, 0xCC, 0x83, 0xBD, 0xAB, 0x77, 0x6C, 0x3A, 0x08, 0xA0, 0x73, 0x7A, 0x12, 0x8A, 0xE7, 0x02, 0x88,
+ 0x57, 0xE9, 0x4B, 0xA1, 0x63, 0x74, 0x60, 0x25, 0xCE, 0x05, 0xEF, 0x4D, 0x44, 0x8F, 0x9A, 0x83, 0x4D, 0x77, 0x2B, 0x48,
+ 0xDE, 0x2A, 0xB7, 0x63, 0x75, 0x60, 0xD1, 0xC6, 0xDA, 0xB2, 0xF6, 0x15, 0xA4, 0xB5, 0xC0, 0x10, 0x3F, 0x16, 0x93, 0xB7,
+ 0x42, 0x97, 0x24, 0x47, 0x1F, 0xF4, 0x92, 0x5B, 0xB5, 0x47, 0xCD, 0x14, 0xE9, 0x64, 0x32, 0x81, 0x33, 0xD2, 0x71, 0x0B,
+ 0x63, 0xDE, 0x13, 0x20, 0x70, 0xF1, 0x85, 0x17, 0x49, 0xD8, 0x9C, 0x31, 0xFB, 0xE2, 0x71, 0xE7, 0x53, 0xE9, 0x68, 0xC1,
+ 0xC9, 0x0F, 0xFB, 0x93, 0x2F, 0x3E, 0xFF, 0x82, 0xA8, 0xE0, 0x68, 0x80, 0xF8, 0xE1, 0x87, 0x9F, 0xFB, 0xCE, 0x77, 0xDE,
+ 0x79, 0xF4, 0xD1, 0xE7, 0xEF, 0xBA, 0xEB, 0xB1, 0x6B, 0xAE, 0xBC, 0x0D, 0x28, 0xD8, 0xBA, 0x71, 0xFF, 0xB2, 0x25, 0x1B,
+ 0x97, 0xF6, 0xAF, 0x81, 0x2D, 0xC1, 0x40, 0x98, 0x2D, 0x9E, 0xA6, 0xA9, 0x95, 0x41, 0x17, 0x4F, 0x1B, 0x1E, 0x2C, 0xF9,
+ 0xA8, 0xA0, 0x53, 0xB0, 0x14, 0xDE, 0x9A, 0x05, 0x22, 0x7A, 0x96, 0xDA, 0xA9, 0x93, 0x9C, 0x98, 0x43, 0x81, 0x69, 0x17,
+ 0x92, 0x98, 0x89, 0x98, 0xE8, 0x87, 0x47, 0x27, 0xD3, 0x17, 0xA9, 0x2C, 0x68, 0x04, 0xEE, 0x40, 0x1E, 0xB2, 0x20, 0xF4,
+ 0xBD, 0x7B, 0xE7, 0x15, 0xC7, 0x8E, 0xDE, 0x76, 0xD9, 0xF6, 0x23, 0x07, 0x0F, 0x1E, 0xDF, 0xBB, 0xF7, 0xD8, 0xD6, 0xAD,
+ 0x07, 0x48, 0x93, 0x80, 0x44, 0xCA, 0x66, 0x6E, 0xA1, 0x18, 0xA1, 0x00, 0x5E, 0x96, 0x13, 0xC5, 0x14, 0x70, 0x84, 0xED,
+ 0xC2, 0x32, 0xF6, 0xCE, 0x47, 0x70, 0xEE, 0xEA, 0x83, 0xA3, 0x17, 0x6A, 0xF0, 0xF9, 0x32, 0x22, 0xAA, 0x45, 0x1E, 0xAB,
+ 0x00, 0x11, 0x34, 0x68, 0xEE, 0x2E, 0x77, 0x66, 0x6D, 0x06, 0x8A, 0x26, 0xD9, 0xE7, 0x48, 0x2D, 0xEF, 0x28, 0xED, 0xE4,
+ 0x01, 0x8E, 0xDB, 0x99, 0x30, 0x4D, 0x3A, 0xA6, 0x98, 0xC1, 0x42, 0x49, 0x22, 0x42, 0x52, 0xDF, 0x9B, 0x2F, 0x66, 0xF7,
+ 0x7E, 0x57, 0x3C, 0x4A, 0x38, 0x4D, 0x96, 0x8F, 0xCF, 0xAC, 0x29, 0xBE, 0x6B, 0x96, 0x6F, 0x79, 0xF0, 0xE1, 0xE7, 0x9E,
+ 0x79, 0xEA, 0xD5, 0xEB, 0x6F, 0xBC, 0x0F, 0x7B, 0x3C, 0x7C, 0xF0, 0x3A, 0xBE, 0xF3, 0x60, 0x68, 0x60, 0x0D, 0x4C, 0xA1,
+ 0x2E, 0xBE, 0xA2, 0xBA, 0x79, 0xA0, 0x20, 0xB5, 0x8C, 0x7D, 0xE7, 0xD4, 0x19, 0xEA, 0x88, 0xF2, 0x66, 0x62, 0x52, 0xEC,
+ 0xA0, 0xCD, 0xD8, 0xA3, 0x98, 0x27, 0x98, 0xC3, 0x85, 0xF4, 0xC9, 0x83, 0xE9, 0xB5, 0x26, 0x0A, 0xF1, 0x20, 0x30, 0x92,
+ 0xC7, 0x85, 0x6C, 0x60, 0xE8, 0x20, 0xE8, 0x80, 0xB6, 0x4D, 0x41, 0x56, 0x45, 0x4B, 0x6D, 0x0F, 0xF2, 0x05, 0x73, 0xB6,
+ 0x6D, 0x3D, 0x74, 0x60, 0xFF, 0xF1, 0xDB, 0x6E, 0x7D, 0x98, 0x8C, 0xE0, 0x8A, 0xCB, 0xAF, 0xBF, 0xFA, 0xEA, 0xDB, 0xAE,
+ 0x3C, 0x7A, 0x33, 0xEF, 0x01, 0xC5, 0x34, 0x56, 0x75, 0x51, 0x45, 0xD3, 0xCE, 0x0A, 0x0B, 0x09, 0x9F, 0x3B, 0x63, 0xC6,
+ 0x08, 0xBC, 0x04, 0x22, 0xE8, 0x28, 0x49, 0x97, 0x83, 0xF9, 0x77, 0xA2, 0x0F, 0x79, 0x65, 0xFE, 0xA9, 0xBB, 0x84, 0xE7,
+ 0xE0, 0x2E, 0x7E, 0x7B, 0x0A, 0x1D, 0x78, 0xE1, 0xDB, 0x4B, 0x60, 0xD1, 0xC1, 0xB4, 0xCE, 0xA6, 0xE9, 0xC1, 0xDA, 0x45,
+ 0xF3, 0x5D, 0x67, 0x72, 0xC2, 0x2C, 0x8B, 0x90, 0xE9, 0x9D, 0x25, 0x33, 0x69, 0x0A, 0xA4, 0x9B, 0x5E, 0xBD, 0x4E, 0x40,
+ 0x67, 0x82, 0x73, 0x42, 0x78, 0x1F, 0xB8, 0x30, 0x29, 0x90, 0xDF, 0xDC, 0x79, 0xB3, 0x66, 0xCC, 0x64, 0xD3, 0x19, 0x5C,
+ 0x9D, 0x89, 0x17, 0x5D, 0x0C, 0xC7, 0x82, 0x19, 0x8E, 0x68, 0x45, 0xDA, 0x5F, 0xA2, 0x86, 0xD8, 0xD0, 0x84, 0x2D, 0x9B,
+ 0xF6, 0xDF, 0x7D, 0xF7, 0xE3, 0xB4, 0x07, 0xF0, 0x09, 0xF2, 0xC2, 0x63, 0x57, 0xDC, 0x82, 0x3D, 0x2E, 0x19, 0x5A, 0x07,
+ 0x21, 0xA5, 0xA2, 0xA0, 0x1E, 0x57, 0x20, 0x3C, 0xD0, 0xCD, 0x27, 0x96, 0x32, 0x6E, 0x22, 0x5B, 0x45, 0x07, 0xD2, 0x86,
+ 0x92, 0xDD, 0x00, 0x32, 0xF5, 0x54, 0xF6, 0x8D, 0x36, 0xA6, 0x9C, 0xC1, 0x96, 0x21, 0x44, 0x61, 0xFE, 0xC2, 0x6F, 0x10,
+ 0xB5, 0x25, 0xD2, 0x02, 0x31, 0x3B, 0xB1, 0x32, 0xCB, 0xB2, 0x85, 0x02, 0x43, 0x39, 0xB6, 0x7A, 0x78, 0xDB, 0xEE, 0xDD,
+ 0x57, 0xDC, 0x72, 0xF3, 0x83, 0x07, 0xF6, 0x5C, 0x45, 0x77, 0xE8, 0xE6, 0x5B, 0x1F, 0x64, 0xC4, 0x7D, 0xDB, 0x6D, 0x0F,
+ 0x1D, 0xDC, 0x7F, 0x0D, 0xAE, 0x40, 0xE1, 0xC6, 0xBF, 0x83, 0x8E, 0xDF, 0x54, 0xDF, 0x06, 0xED, 0x3C, 0x74, 0x41, 0x80,
+ 0xC6, 0x24, 0x99, 0x5B, 0x04, 0x45, 0x49, 0xD9, 0x0F, 0xF8, 0x18, 0xB9, 0x5B, 0x8A, 0x89, 0xAA, 0x41, 0x66, 0x56, 0xEE,
+ 0xAF, 0xB8, 0xEB, 0x63, 0xCD, 0xDC, 0x4B, 0x45, 0x72, 0xD5, 0x20, 0xF3, 0x58, 0xE5, 0xC3, 0x68, 0x32, 0x23, 0x86, 0x26,
+ 0x52, 0x76, 0xC6, 0xA1, 0x0E, 0x87, 0x85, 0x91, 0x10, 0xB3, 0x14, 0x1D, 0x1D, 0xAB, 0x86, 0x4C, 0x23, 0x48, 0x49, 0x4E,
+ 0xEE, 0x5C, 0xDB, 0xB9, 0xD0, 0xDA, 0x58, 0x27, 0x79, 0x02, 0x1A, 0x8C, 0xC2, 0xFD, 0x64, 0xA0, 0x4F, 0xDE, 0x82, 0x43,
+ 0x90, 0xB9, 0x83, 0xAD, 0x34, 0xEC, 0x20, 0x11, 0xD3, 0xF3, 0x1A, 0x7F, 0xC1, 0x85, 0x42, 0x22, 0x3E, 0xFD, 0xCC, 0x73,
+ 0xCE, 0x18, 0xC7, 0xD8, 0xE4, 0x81, 0x47, 0x9E, 0x7B, 0xFA, 0xA9, 0x57, 0xEF, 0xB9, 0xE7, 0xB1, 0xE3, 0x57, 0xDF, 0xC1,
+ 0x37, 0xE1, 0x1C, 0x3B, 0x76, 0x0B, 0xE3, 0x1D, 0x1C, 0x62, 0xE5, 0x92, 0x8D, 0xDD, 0x9D, 0x8B, 0xE5, 0x5B, 0x71, 0x8A,
+ 0x5B, 0x18, 0x78, 0x71, 0x1A, 0x34, 0x3D, 0x3E, 0x1A, 0x99, 0x12, 0xAE, 0x62, 0x4C, 0x7D, 0xCE, 0x58, 0x9F, 0x14, 0xD6,
+ 0xF0, 0x8B, 0xB9, 0x6B, 0xDE, 0x61, 0x12, 0x43, 0x2A, 0x06, 0xF4, 0xFC, 0x4A, 0x76, 0xB5, 0x24, 0xA4, 0x53, 0x67, 0xC0,
+ 0x88, 0x85, 0xB9, 0x5D, 0x92, 0x59, 0x49, 0x8B, 0x94, 0x6E, 0x39, 0x18, 0x78, 0xFB, 0x6D, 0x8F, 0xDC, 0x73, 0xD7, 0x13,
+ 0xF4, 0x24, 0xEE, 0xBC, 0xFB, 0xF1, 0x07, 0x1F, 0xFC, 0x3A, 0xD2, 0xBF, 0xFF, 0xFE, 0xA7, 0x09, 0x4E, 0xD7, 0x5C, 0x7D,
+ 0xC7, 0xD1, 0xCB, 0x6F, 0x5A, 0xB7, 0x76, 0x17, 0xBD, 0x13, 0x8A, 0x09, 0xF6, 0x17, 0x13, 0xC6, 0x66, 0x4E, 0x99, 0x2E,
+ 0x29, 0xBF, 0xF1, 0x39, 0x05, 0x1C, 0x47, 0xE2, 0x1E, 0x9A, 0x8F, 0xD7, 0x1B, 0xCC, 0x75, 0x18, 0x4B, 0xFC, 0xC0, 0x6B,
+ 0xF8, 0xA3, 0xC7, 0x8D, 0x42, 0x80, 0xC1, 0xBA, 0x91, 0x9A, 0xF2, 0x00, 0xB8, 0x90, 0x61, 0x8B, 0x09, 0xE8, 0x12, 0x52,
+ 0x82, 0x23, 0xF9, 0xD6, 0x25, 0x1E, 0x27, 0x23, 0xE4, 0xB5, 0x94, 0x6D, 0x29, 0xAA, 0x8A, 0x66, 0xD2, 0x6B, 0x36, 0xF5,
+ 0x45, 0xB2, 0xD1, 0xD5, 0x21, 0x16, 0x58, 0xB2, 0x85, 0x4B, 0x43, 0x12, 0x6A, 0x9E, 0x74, 0xE8, 0x4C, 0xC5, 0x48, 0x84,
+ 0x24, 0x84, 0x92, 0x2C, 0x6A, 0x77, 0x01, 0xB7, 0x10, 0x65, 0x40, 0x22, 0x9E, 0x38, 0xE9, 0xDC, 0xAF, 0xC9, 0x16, 0x87,
+ 0xAC, 0xA4, 0x7C, 0x6C, 0xF0, 0xBE, 0xFB, 0x9E, 0xBA, 0xEE, 0xF8, 0x9D, 0x00, 0xC2, 0xD1, 0x23, 0x37, 0x90, 0xA8, 0xD0,
+ 0x2D, 0xC0, 0x24, 0xA1, 0x96, 0x0E, 0x0F, 0xAD, 0x87, 0xB0, 0xC5, 0x6E, 0x03, 0xC8, 0x2F, 0x18, 0x66, 0x4E, 0xD2, 0xC8,
+ 0xD1, 0x35, 0x08, 0x1A, 0x05, 0xA8, 0x37, 0x90, 0xF0, 0x70, 0x8C, 0x1B, 0x8E, 0xC2, 0x86, 0x06, 0xC2, 0x38, 0x5C, 0x5B,
+ 0xD9, 0x4E, 0xC1, 0xB1, 0xFC, 0x4C, 0x26, 0x98, 0x9D, 0x65, 0x70, 0x5C, 0x47, 0x2D, 0xD1, 0x98, 0xD6, 0x2C, 0x95, 0x20,
+ 0x73, 0x6C, 0x58, 0x1D, 0x77, 0xDC, 0xFE, 0x28, 0x89, 0xD9, 0x93, 0x4F, 0xBE, 0x74, 0xC7, 0x6D, 0x0F, 0x73, 0x77, 0xD7,
+ 0xF6, 0x23, 0x03, 0x1D, 0xC3, 0x7D, 0xDD, 0xCB, 0xF8, 0xA7, 0xD0, 0xF1, 0xD6, 0xAF, 0xDF, 0xD5, 0x54, 0xDF, 0x45, 0x53,
+ 0x8B, 0x39, 0x2B, 0xEE, 0x45, 0x8A, 0xA1, 0x88, 0xA4, 0x0A, 0xF0, 0x62, 0x8E, 0x48, 0xDC, 0x98, 0xBF, 0x75, 0x05, 0xEB,
+ 0x1F, 0x8E, 0x1F, 0x78, 0xE3, 0xA7, 0x35, 0x5E, 0xC5, 0x10, 0x37, 0x8F, 0x14, 0x1E, 0x0A, 0xB5, 0x0F, 0xFF, 0x43, 0x67,
+ 0xF1, 0xDC, 0x15, 0x69, 0x86, 0x40, 0x71, 0x4D, 0x60, 0x8C, 0x07, 0x0F, 0xDE, 0xD0, 0x17, 0xA5, 0x01, 0xA7, 0x0C, 0x17,
+ 0xEB, 0x19, 0x5E, 0x36, 0xC7, 0x18, 0x2A, 0x98, 0x36, 0x4A, 0x35, 0x35, 0xD4, 0xEC, 0x85, 0x7E, 0x0B, 0xD0, 0xA4, 0xAD,
+ 0x2E, 0x5A, 0x9E, 0xB3, 0xA6, 0x4D, 0xA5, 0xE1, 0x7B, 0x9A, 0xCF, 0x59, 0x4C, 0xE1, 0xAF, 0xBD, 0xE6, 0xCE, 0x07, 0x1E,
+ 0x7A, 0xF6, 0xA1, 0x87, 0x9E, 0xBD, 0xFD, 0xF6, 0x07, 0xB1, 0x50, 0xBA, 0x05, 0x57, 0x1F, 0xBB, 0xF5, 0xC8, 0xA1, 0xEB,
+ 0x48, 0x64, 0xE9, 0xA6, 0x6D, 0x5C, 0xBD, 0x83, 0x4C, 0x09, 0xAE, 0x35, 0x6C, 0xC6, 0x46, 0x73, 0x42, 0x7A, 0x41, 0xAA,
+ 0x1C, 0x67, 0xC0, 0x4C, 0x38, 0x33, 0x39, 0x1D, 0xE6, 0x84, 0x94, 0x99, 0x09, 0x69, 0x24, 0x5D, 0xC2, 0x52, 0x30, 0xDF,
+ 0x85, 0x00, 0xF9, 0x1E, 0x8E, 0x17, 0x4C, 0xE1, 0xF4, 0x98, 0x1C, 0x78, 0x44, 0x9C, 0xD1, 0xC4, 0xA0, 0xA6, 0x91, 0xAF,
+ 0x67, 0xE2, 0x4B, 0xFB, 0x5A, 0x06, 0xF7, 0xEC, 0xBA, 0x02, 0x87, 0xBB, 0xFF, 0xBE, 0x67, 0x30, 0xFF, 0x9B, 0x6E, 0xB8,
+ 0x97, 0x6D, 0x77, 0xB8, 0xC8, 0xC2, 0x39, 0xC1, 0x6C, 0x4D, 0xC4, 0x2C, 0xE8, 0x11, 0x01, 0xA4, 0x2D, 0x75, 0x1D, 0xA4,
+ 0x49, 0x0D, 0x35, 0x8B, 0xF0, 0x06, 0x88, 0x81, 0xBC, 0x79, 0x96, 0xA6, 0x43, 0xC4, 0x67, 0x09, 0x06, 0xA1, 0xCC, 0x4D,
+ 0x1D, 0xF4, 0xF7, 0x3A, 0x81, 0x92, 0x0D, 0x25, 0x66, 0x10, 0x0F, 0x6C, 0x36, 0x39, 0x86, 0x99, 0xA2, 0x44, 0x25, 0x91,
+ 0x66, 0xB8, 0xD0, 0x89, 0xF9, 0x1B, 0x14, 0x90, 0x99, 0x9C, 0x8A, 0x8F, 0x4B, 0x81, 0x47, 0x1C, 0x0B, 0x8D, 0xC4, 0x7E,
+ 0x4D, 0x7B, 0xD6, 0xB7, 0xBA, 0xA2, 0x9E, 0x7F, 0x49, 0xB2, 0x61, 0xC8, 0xDF, 0x86, 0x63, 0x23, 0xA8, 0x25, 0x3D, 0x51,
+ 0x75, 0x20, 0x13, 0x3C, 0x5C, 0x75, 0x1A, 0x4A, 0x8B, 0x8E, 0x91, 0x59, 0x26, 0x6F, 0x71, 0xF8, 0xA9, 0x5A, 0xE2, 0x6A,
+ 0xC5, 0x44, 0x91, 0x45, 0xCB, 0x81, 0x61, 0x13, 0xDD, 0x18, 0x7A, 0x93, 0xF4, 0x27, 0x6E, 0xBD, 0xF9, 0x81, 0xDB, 0xEE,
+ 0x78, 0xE4, 0xE1, 0x87, 0xBE, 0xF1, 0xC8, 0x43, 0x12, 0x12, 0xEE, 0xBA, 0xF3, 0x71, 0x1E, 0x41, 0x07, 0xBB, 0x76, 0x5E,
+ 0xB1, 0x6E, 0xCD, 0x8E, 0x15, 0x4B, 0x37, 0x61, 0x9B, 0x3D, 0x9D, 0x7C, 0x6D, 0xE0, 0x80, 0xE8, 0x80, 0x6D, 0x20, 0x85,
+ 0xF5, 0x25, 0x99, 0xE5, 0x6C, 0x1B, 0x2D, 0xCD, 0xAA, 0x80, 0xA2, 0x90, 0x9B, 0x98, 0x2F, 0x47, 0x21, 0x16, 0xD7, 0x65,
+ 0xC4, 0xE6, 0xE6, 0x25, 0x71, 0xC0, 0x33, 0x67, 0xC0, 0x96, 0xC0, 0x40, 0xA5, 0xCE, 0x82, 0x3F, 0x09, 0xCB, 0x91, 0x56,
+ 0x39, 0xDC, 0x19, 0xE1, 0xA4, 0x36, 0xF4, 0xF2, 0x6A, 0xFB, 0xF7, 0x5F, 0xCD, 0x78, 0x80, 0x20, 0x74, 0xCD, 0x55, 0xB7,
+ 0xAD, 0x5A, 0xBE, 0x25, 0x3C, 0x30, 0xF6, 0x74, 0x9F, 0xB3, 0x6C, 0xDA, 0xA6, 0x17, 0x9C, 0x6D, 0x0B, 0x07, 0x60, 0xE9,
+ 0xE2, 0xB5, 0x75, 0xD5, 0x2D, 0xCA, 0x82, 0xA1, 0x1D, 0x22, 0xB5, 0x5E, 0x90, 0xF0, 0x2A, 0x94, 0x8F, 0x8D, 0x0E, 0xC2,
+ 0x43, 0x25, 0x0B, 0x38, 0x09, 0x88, 0xC8, 0x4D, 0x05, 0xB2, 0x44, 0x07, 0x63, 0xA5, 0x3F, 0x42, 0x48, 0x32, 0x24, 0x2D,
+ 0xB0, 0x3B, 0x24, 0x1C, 0xA0, 0x80, 0xB6, 0x46, 0xDA, 0x3E, 0x6B, 0x86, 0x2F, 0x0D, 0x2F, 0x18, 0x03, 0xD8, 0x29, 0x03,
+ 0x10, 0x7C, 0x85, 0xDD, 0x58, 0x58, 0x01, 0x00, 0xA2, 0xFC, 0x6F, 0x65, 0xD2, 0xA1, 0x03, 0x95, 0xBE, 0xF5, 0x24, 0x0D,
+ 0xE6, 0xFA, 0x82, 0x2E, 0xC9, 0x0E, 0xC6, 0x47, 0xB8, 0x43, 0xAA, 0x30, 0xD5, 0x8D, 0xCE, 0x34, 0xB4, 0xBF, 0x48, 0x12,
+ 0xC9, 0x77, 0x3B, 0xA1, 0x8C, 0xA9, 0x97, 0x48, 0xE7, 0x9D, 0xF1, 0x21, 0x72, 0xBF, 0xF7, 0xDE, 0x27, 0x1F, 0x78, 0xE8,
+ 0xB9, 0xFB, 0x1E, 0xF8, 0x3A, 0xA0, 0xF4, 0xC0, 0x03, 0xCF, 0x3C, 0xF2, 0xC8, 0x37, 0x58, 0x24, 0x8E, 0x97, 0x6D, 0x3B,
+ 0xC4, 0x13, 0x56, 0x0F, 0x6F, 0xE5, 0xC8, 0x6B, 0x86, 0xCF, 0x10, 0x00, 0xE8, 0x36, 0x37, 0x55, 0x89, 0x45, 0xB7, 0xD4,
+ 0x75, 0xB3, 0x69, 0x92, 0x38, 0xC1, 0xD7, 0x8A, 0x72, 0xC8, 0x3F, 0x5A, 0x61, 0x31, 0x91, 0xAF, 0xCA, 0xAF, 0xA7, 0xB6,
+ 0x90, 0x60, 0x9E, 0x51, 0x01, 0xF2, 0xB4, 0x35, 0x0D, 0xA0, 0x03, 0xF9, 0xE2, 0xE8, 0xB6, 0xC5, 0xE8, 0x92, 0xD1, 0xD8,
+ 0x75, 0xC7, 0xEF, 0x42, 0x01, 0xB7, 0xDE, 0xF9, 0x08, 0x0E, 0x91, 0x18, 0x99, 0x26, 0x89, 0x9A, 0x49, 0x11, 0x18, 0x74,
+ 0x43, 0xE5, 0x27, 0x8B, 0x33, 0xE9, 0x82, 0xA4, 0x0D, 0x64, 0x53, 0x83, 0x7D, 0x2B, 0xE8, 0x68, 0xD5, 0x54, 0xB6, 0x20,
+ 0x22, 0xD4, 0x20, 0x19, 0xAA, 0x22, 0x92, 0x64, 0x47, 0x92, 0x1A, 0x99, 0x40, 0xED, 0x44, 0x08, 0x55, 0x86, 0x4D, 0x52,
+ 0x7D, 0xDC, 0xD4, 0xC5, 0x61, 0xEF, 0x3A, 0x00, 0x12, 0x65, 0x98, 0x71, 0x0E, 0x23, 0x31, 0x8E, 0x6A, 0x13, 0xB0, 0xA2,
+ 0x9A, 0x15, 0xE2, 0x85, 0x7C, 0x43, 0x52, 0x1E, 0xE7, 0x4E, 0x32, 0x2F, 0x65, 0x76, 0xCA, 0xA8, 0x8F, 0xD4, 0x18, 0x46,
+ 0xBB, 0x28, 0x3F, 0x50, 0x38, 0x97, 0x8A, 0x36, 0x4A, 0x63, 0xD2, 0x30, 0xEE, 0xA2, 0x93, 0x13, 0xCC, 0x5D, 0x1D, 0x08,
+ 0x25, 0x4B, 0x88, 0x37, 0x86, 0xA7, 0xA5, 0xF1, 0x79, 0x34, 0x5B, 0x5B, 0x7C, 0x02, 0x50, 0xA2, 0x6E, 0x68, 0x6A, 0xEC,
+ 0x04, 0xF7, 0x89, 0xC3, 0xE4, 0x45, 0xF7, 0x3F, 0xF8, 0xEC, 0x8B, 0x2F, 0xBF, 0xF5, 0xF2, 0xCB, 0xDF, 0x7F, 0xF9, 0xD5,
+ 0xB7, 0x5F, 0xF9, 0xD6, 0x0F, 0x1F, 0x7E, 0xF4, 0x79, 0xF4, 0xF1, 0xD0, 0x83, 0xCF, 0x91, 0x3B, 0x6E, 0xD9, 0x78, 0x90,
+ 0x9A, 0x16, 0x13, 0xA6, 0x92, 0xA2, 0x90, 0xE6, 0x62, 0xED, 0xCA, 0xCB, 0xA0, 0x4A, 0x0A, 0x19, 0x82, 0x01, 0x40, 0x43,
+ 0x0F, 0x23, 0x20, 0xBE, 0x34, 0x5D, 0xBE, 0x9B, 0xB2, 0xB9, 0x8F, 0xC7, 0xE9, 0x43, 0x34, 0xD5, 0x75, 0x93, 0xF8, 0x12,
+ 0x7E, 0x07, 0x16, 0x0D, 0x2F, 0x5D, 0xBC, 0x7E, 0xCD, 0xAA, 0xED, 0x5B, 0x37, 0xEF, 0x27, 0xD2, 0xE0, 0x5E, 0x84, 0x5F,
+ 0xE2, 0xF0, 0x3D, 0x77, 0x3F, 0x49, 0xCC, 0xBF, 0xE0, 0x9C, 0x8B, 0x10, 0xF7, 0x19, 0x67, 0x9C, 0xC5, 0x84, 0x15, 0x14,
+ 0x1A, 0x7F, 0xF1, 0x85, 0x13, 0x2E, 0x18, 0xCF, 0xD6, 0x23, 0xB6, 0xE3, 0x69, 0x4A, 0x4D, 0x83, 0x84, 0xAD, 0xFA, 0xCD,
+ 0x1C, 0x5A, 0x5F, 0xDB, 0xA5, 0xDF, 0x04, 0x63, 0x0A, 0x05, 0x47, 0xD0, 0x24, 0xAF, 0x4E, 0xAD, 0xE0, 0xC9, 0x50, 0x47,
+ 0xE9, 0x40, 0x13, 0x47, 0xDB, 0x4A, 0x73, 0x87, 0x8B, 0x71, 0x89, 0x61, 0xB0, 0x77, 0x25, 0x72, 0xD2, 0x5D, 0x01, 0x3A,
+ 0xB0, 0x2F, 0x86, 0xA2, 0x9C, 0x6F, 0x06, 0x2F, 0x1C, 0xE9, 0xE3, 0x16, 0x81, 0x01, 0x41, 0x54, 0x58, 0xD8, 0xA9, 0xA1,
+ 0x96, 0x48, 0x2E, 0x2C, 0x34, 0x26, 0x08, 0x3C, 0x11, 0x51, 0xF1, 0x91, 0xB2, 0x4B, 0x54, 0x5E, 0xD6, 0xD5, 0x81, 0xF2,
+ 0x1B, 0x8D, 0x1F, 0xC8, 0x73, 0x48, 0x37, 0x75, 0x94, 0x2F, 0x89, 0x79, 0x28, 0x39, 0x92, 0x99, 0xA0, 0x05, 0x88, 0x1A,
+ 0x1C, 0xC6, 0xFC, 0x82, 0x60, 0xB0, 0x88, 0x93, 0x63, 0xE1, 0xF8, 0xAF, 0x5B, 0xB5, 0x63, 0xC3, 0xBA, 0x5D, 0x07, 0xF6,
+ 0x1D, 0x23, 0x17, 0x7A, 0xEA, 0xA9, 0x97, 0x9F, 0xFF, 0xE6, 0xF7, 0xBE, 0xFE, 0xDC, 0xEB, 0xAF, 0xBD, 0xF6, 0xF6, 0xB3,
+ 0xCF, 0xBE, 0xFA, 0xCD, 0x6F, 0xBE, 0xF1, 0xDC, 0x73, 0xAF, 0x3F, 0xF2, 0xD8, 0x0B, 0xE8, 0x86, 0xF4, 0x11, 0xDA, 0x36,
+ 0xB1, 0x81, 0xA6, 0xC2, 0xEA, 0x65, 0x9B, 0xF9, 0xDA, 0x2E, 0x88, 0xAA, 0x74, 0x17, 0x54, 0xCA, 0x24, 0xFB, 0xCB, 0x06,
+ 0xD6, 0x12, 0x33, 0xC8, 0x29, 0x71, 0x17, 0x1E, 0xA1, 0xF3, 0xC1, 0x33, 0x65, 0x28, 0x7F, 0xE0, 0x38, 0x64, 0x6F, 0xCA,
+ 0x0E, 0xDA, 0x0F, 0x87, 0x0F, 0x5E, 0x7B, 0xFC, 0xEA, 0x5B, 0xAF, 0xB9, 0xE6, 0x76, 0xDC, 0x8E, 0x71, 0x31, 0xBF, 0x82,
+ 0x78, 0x2A, 0x93, 0xB2, 0x33, 0x65, 0x50, 0x33, 0x75, 0xE2, 0x25, 0xEC, 0x56, 0x67, 0x31, 0x11, 0x63, 0x34, 0xC6, 0x67,
+ 0xE7, 0x98, 0x67, 0x65, 0x43, 0x11, 0xD5, 0x70, 0x23, 0x16, 0x69, 0x12, 0xF8, 0x2C, 0x35, 0xA0, 0xA9, 0x99, 0x25, 0x4D,
+ 0x72, 0x32, 0x51, 0x97, 0x76, 0x0E, 0x04, 0x49, 0xC0, 0x90, 0x14, 0x56, 0xB0, 0xC8, 0x2A, 0xC0, 0x9B, 0xBF, 0x8B, 0x09,
+ 0x43, 0xA5, 0x0F, 0x33, 0xB1, 0x37, 0x28, 0x0A, 0x59, 0x43, 0x4F, 0x67, 0x70, 0x48, 0x0A, 0x81, 0xF8, 0xC8, 0xE8, 0x49,
+ 0xE4, 0x81, 0xC2, 0x89, 0x17, 0x4E, 0x20, 0xA1, 0xD4, 0xC6, 0x00, 0x9D, 0x4B, 0x07, 0x8B, 0x22, 0xA3, 0x84, 0x41, 0x46,
+ 0x05, 0xE0, 0x38, 0x84, 0xBB, 0x37, 0xC8, 0xC4, 0x6A, 0x8B, 0x45, 0xC2, 0xD0, 0x0E, 0x17, 0x92, 0x1D, 0xB4, 0x7D, 0xD8,
+ 0x67, 0x1A, 0x9D, 0x30, 0x1C, 0xA9, 0xF5, 0x03, 0x44, 0x0D, 0x0C, 0x9E, 0xF8, 0x24, 0xC4, 0x52, 0x52, 0x8E, 0x86, 0xDA,
+ 0x0E, 0xEA, 0x03, 0x86, 0x88, 0x9B, 0xD6, 0xEF, 0x04, 0x19, 0x38, 0xB5, 0x02, 0x08, 0x7A, 0xEA, 0xA9, 0x17, 0x7F, 0xF4,
+ 0xA3, 0xF7, 0x7F, 0xF0, 0x83, 0x9F, 0x3F, 0xF3, 0xCC, 0xCB, 0xDF, 0x7E, 0xE3, 0xC7, 0xAF, 0xBD, 0xF6, 0x43, 0x4D, 0x1C,
+ 0xC1, 0x71, 0x34, 0xB1, 0x7F, 0xC7, 0x95, 0xDB, 0x36, 0xED, 0x67, 0xE3, 0x34, 0x0E, 0x84, 0x32, 0x56, 0x0E, 0x6F, 0xA2,
+ 0xF5, 0x8F, 0x99, 0x93, 0xED, 0xE0, 0x4F, 0x58, 0x3A, 0x7D, 0xA7, 0xDD, 0x97, 0x5D, 0x4E, 0x2B, 0xD0, 0x04, 0xF6, 0xEB,
+ 0xA9, 0xBC, 0x30, 0x79, 0x62, 0xCC, 0x7D, 0xF7, 0x3E, 0x8D, 0xA6, 0xAF, 0x3E, 0x76, 0x33, 0xA1, 0xF8, 0xAA, 0x2B, 0x6F,
+ 0xD9, 0xBC, 0x79, 0x5F, 0x62, 0x64, 0x06, 0x22, 0x86, 0x0B, 0x4B, 0x05, 0x43, 0x70, 0x62, 0x33, 0x8B, 0xB3, 0xA6, 0x4E,
+ 0xF7, 0x9D, 0x3C, 0x95, 0x4C, 0x1A, 0x65, 0xB0, 0x13, 0x04, 0x80, 0x02, 0x9F, 0x39, 0xEB, 0x8A, 0x83, 0xCE, 0x81, 0x6B,
+ 0xBA, 0x81, 0xD2, 0xBD, 0xA0, 0x49, 0x47, 0x54, 0x30, 0x0E, 0x61, 0xF0, 0x47, 0x3E, 0xA6, 0xB9, 0x8D, 0x8A, 0x0C, 0x8C,
+ 0x51, 0x98, 0x1A, 0xD1, 0x81, 0x42, 0x87, 0x75, 0x02, 0x01, 0x22, 0x73, 0x6A, 0x87, 0x39, 0x58, 0x2B, 0x64, 0x8E, 0xEF,
+ 0x6C, 0x4C, 0x9E, 0xC1, 0xF4, 0x39, 0xE7, 0x9C, 0x8D, 0x0F, 0xA2, 0x7F, 0xA2, 0xB1, 0x34, 0xEB, 0x69, 0xB9, 0xF8, 0x07,
+ 0x21, 0x38, 0x09, 0xF4, 0x80, 0x7B, 0xB0, 0x70, 0xB6, 0x14, 0x6D, 0x0C, 0xE8, 0xCB, 0xFE, 0x2C, 0xD4, 0x36, 0xE2, 0x0D,
+ 0x91, 0x44, 0x0B, 0x93, 0xC2, 0x86, 0x4B, 0x89, 0x60, 0xA8, 0xF0, 0xF8, 0x81, 0x79, 0x7F, 0x92, 0xD5, 0x85, 0x84, 0x2C,
+ 0x0C, 0x04, 0xFA, 0x18, 0xBF, 0x10, 0x81, 0xC8, 0xE8, 0x31, 0x25, 0x66, 0xF7, 0x18, 0x2C, 0x3B, 0x2C, 0xC9, 0xE2, 0x43,
+ 0x65, 0xEA, 0x1B, 0x91, 0x1E, 0x9F, 0xD3, 0xDD, 0x36, 0x48, 0xFB, 0xFE, 0xC1, 0x07, 0x9E, 0x7D, 0xF6, 0xD9, 0xD7, 0x5E,
+ 0xFE, 0xD6, 0xF7, 0x5F, 0x7C, 0xE5, 0x7B, 0xCF, 0x3D, 0xFF, 0x1D, 0x74, 0x40, 0x4F, 0x89, 0x98, 0xC1, 0xC5, 0xE5, 0x97,
+ 0xDF, 0xC0, 0x77, 0x8D, 0x23, 0x44, 0x0C, 0x99, 0x0E, 0x07, 0x2E, 0x62, 0x94, 0x77, 0xCB, 0x9D, 0x77, 0x3C, 0x76, 0xDD,
+ 0x75, 0x77, 0x91, 0x53, 0x91, 0x71, 0xDE, 0x7D, 0xEF, 0x93, 0x32, 0x97, 0xBF, 0xE5, 0x81, 0xFB, 0xEF, 0x7F, 0xF2, 0x9E,
+ 0x7B, 0x9E, 0xF8, 0xC6, 0x37, 0xBE, 0xFD, 0xCC, 0x33, 0xAF, 0x82, 0x3F, 0x38, 0x99, 0xD4, 0x83, 0x37, 0x3F, 0xC8, 0xD3,
+ 0x2E, 0xDB, 0x72, 0x28, 0x2E, 0x2C, 0x19, 0x1D, 0x40, 0x3B, 0x43, 0xF4, 0xF3, 0xA7, 0xCB, 0xE4, 0x47, 0x13, 0x68, 0xEC,
+ 0xCF, 0xB4, 0xC1, 0x67, 0x12, 0x00, 0x7C, 0xA7, 0x4F, 0x63, 0x97, 0xD1, 0x85, 0xE3, 0xCE, 0x23, 0x99, 0xF6, 0x9D, 0xCA,
+ 0x50, 0x73, 0x56, 0x70, 0x80, 0xEA, 0x20, 0x42, 0x5A, 0xB9, 0x76, 0x37, 0x86, 0xCD, 0x97, 0xDC, 0x4E, 0x06, 0x85, 0xBA,
+ 0x8F, 0x95, 0xBB, 0xBD, 0x50, 0xFB, 0x15, 0x0F, 0x40, 0x46, 0x2C, 0x34, 0x16, 0x20, 0xAD, 0x79, 0xC4, 0x6D, 0xDA, 0xBF,
+ 0x32, 0x29, 0xD5, 0x7E, 0x24, 0x78, 0xAD, 0x0A, 0xD0, 0xFE, 0x94, 0xD9, 0x6A, 0x20, 0xD8, 0xA2, 0x7F, 0x6E, 0xD4, 0x20,
+ 0x83, 0x62, 0x93, 0xB0, 0x3A, 0x65, 0x1D, 0x04, 0x1B, 0xE3, 0x01, 0xD2, 0x1B, 0x10, 0xE0, 0x32, 0x6A, 0x60, 0x47, 0x5B,
+ 0x70, 0x60, 0x08, 0x6D, 0x77, 0x94, 0x6A, 0x06, 0x2C, 0xB3, 0xE8, 0xB1, 0x10, 0xC3, 0xB1, 0x2F, 0xD4, 0xBF, 0x78, 0x70,
+ 0x2D, 0x03, 0x03, 0x3C, 0x4F, 0x53, 0x11, 0xAD, 0x9C, 0x27, 0x5C, 0x30, 0x91, 0xE9, 0x1B, 0xA5, 0x2C, 0x12, 0x7C, 0xEA,
+ 0x89, 0x6F, 0xBE, 0xF0, 0xC2, 0xB7, 0x9F, 0x7E, 0xFA, 0xA5, 0xC7, 0x1E, 0x7B, 0x01, 0x95, 0x90, 0xCB, 0xD3, 0x59, 0x7A,
+ 0xE2, 0x89, 0x17, 0xB9, 0x25, 0xA7, 0x24, 0xB4, 0xE2, 0x34, 0x8F, 0x3F, 0xF9, 0xF2, 0x53, 0x4F, 0xBC, 0x74, 0xEF, 0x83,
+ 0x5F, 0xBF, 0xFD, 0xCE, 0xC7, 0xB8, 0xFB, 0xD8, 0x63, 0xDF, 0x78, 0xFC, 0xB1, 0x17, 0x5F, 0x27, 0x9C, 0x3C, 0xFC, 0x1C,
+ 0xD2, 0x07, 0xDC, 0xF8, 0xAB, 0xEF, 0x7E, 0xFB, 0x47, 0xAF, 0xBE, 0xFA, 0xFD, 0xE7, 0x5E, 0x78, 0xFD, 0x89, 0xA7, 0x5E,
+ 0x46, 0x13, 0x94, 0x23, 0xC7, 0xAE, 0xBC, 0x95, 0xD3, 0x19, 0x60, 0xFB, 0x72, 0x78, 0x0F, 0x5F, 0x73, 0xA1, 0xF3, 0x67,
+ 0x19, 0xBA, 0xF9, 0x8A, 0x1C, 0xA4, 0x2B, 0x6E, 0x68, 0x03, 0x2C, 0x99, 0xD9, 0xCD, 0xF2, 0x65, 0xA1, 0x27, 0x54, 0xA2,
+ 0x4D, 0x59, 0x69, 0x52, 0x19, 0x92, 0x99, 0x69, 0xD5, 0x99, 0x34, 0x69, 0xA1, 0x2C, 0x15, 0x97, 0x2A, 0x46, 0x7A, 0x76,
+ 0x2A, 0x7A, 0x5B, 0xFA, 0x3A, 0xF9, 0xBB, 0xF0, 0xC8, 0xA3, 0x65, 0xB3, 0x67, 0xB8, 0x90, 0x41, 0xB5, 0x07, 0x6B, 0xC7,
+ 0x23, 0x9A, 0xB7, 0x68, 0x4B, 0xD2, 0x34, 0xCA, 0xE5, 0xB5, 0x00, 0x13, 0xD1, 0x41, 0xB0, 0x34, 0x82, 0x34, 0xF5, 0xB4,
+ 0xFB, 0x0C, 0x34, 0x5B, 0x55, 0x14, 0x92, 0x97, 0xA5, 0x69, 0x6A, 0xB4, 0x6B, 0x4A, 0x18, 0x43, 0xC6, 0xF2, 0x0B, 0x64,
+ 0x04, 0xC8, 0xC7, 0x63, 0x8C, 0x95, 0x9F, 0x53, 0xDC, 0xD5, 0xDA, 0x0D, 0xCD, 0xDD, 0x7C, 0x91, 0x47, 0x2C, 0x29, 0x0A,
+ 0x95, 0x81, 0xC6, 0x3D, 0x91, 0xFD, 0x69, 0x9A, 0x90, 0x38, 0xAD, 0xA4, 0xA9, 0x93, 0xA6, 0x81, 0xEF, 0x77, 0xDD, 0xF1,
+ 0xB0, 0xC0, 0xD1, 0xB7, 0x7F, 0xF8, 0xDE, 0xBB, 0x1F, 0xBC, 0xFB, 0xEE, 0x6F, 0x89, 0x10, 0x44, 0x6C, 0x94, 0x41, 0x90,
+ 0xE0, 0xE2, 0x95, 0x6F, 0xFD, 0xE0, 0xD5, 0x57, 0xDF, 0x7E, 0xFC, 0xF1, 0x6F, 0x3E, 0xFB, 0xF5, 0xD7, 0x09, 0xE0, 0x2F,
+ 0xBD, 0xF2, 0xD6, 0x4B, 0x2F, 0xBD, 0xF9, 0xC6, 0xDB, 0x3F, 0x79, 0xE5, 0xB5, 0xB7, 0xB0, 0x7A, 0xAA, 0x0D, 0xA6, 0xF3,
+ 0x34, 0x44, 0xF1, 0x2A, 0x3A, 0xE4, 0x8C, 0x65, 0x68, 0xCD, 0xDE, 0x76, 0xCB, 0x83, 0x37, 0xDD, 0x70, 0x9F, 0xF6, 0x85,
+ 0x40, 0x33, 0x36, 0xDB, 0x4C, 0x9A, 0x30, 0x11, 0xD7, 0x07, 0x6A, 0xE0, 0x61, 0x08, 0x01, 0x60, 0xCE, 0x02, 0x5D, 0x0B,
+ 0x67, 0xF3, 0xCD, 0x3B, 0x73, 0x64, 0x8A, 0x39, 0x7B, 0x81, 0x79, 0x7C, 0x9E, 0x9A, 0xA6, 0x88, 0xC8, 0x5F, 0x98, 0x7D,
+ 0x90, 0x9D, 0x64, 0xC0, 0x67, 0x10, 0xC9, 0xA8, 0x41, 0x96, 0x48, 0xCC, 0x3F, 0x3C, 0xCA, 0x3F, 0x82, 0x2F, 0xB7, 0xE5,
+ 0x56, 0x74, 0x60, 0x13, 0x18, 0x23, 0x29, 0x43, 0x87, 0x86, 0x36, 0x1B, 0x2A, 0xBD, 0x65, 0xF0, 0x5A, 0xC9, 0xA0, 0x2A,
+ 0x68, 0x28, 0xAB, 0xDA, 0x80, 0xD4, 0xD6, 0x23, 0xFD, 0x48, 0x1D, 0x82, 0x1B, 0x20, 0x92, 0x4A, 0x44, 0xB0, 0xC5, 0x98,
+ 0xB6, 0x83, 0x48, 0xC6, 0xEA, 0xA3, 0x23, 0x63, 0x90, 0xBB, 0xEC, 0x9F, 0x06, 0x9A, 0xA4, 0x4B, 0x01, 0xEB, 0x4C, 0x6A,
+ 0x48, 0x90, 0x87, 0x61, 0x8B, 0xA6, 0xB3, 0xF4, 0x59, 0x3B, 0x9A, 0x3B, 0x37, 0xAE, 0xDE, 0xBA, 0xA4, 0x7F, 0x19, 0x3D,
+ 0x73, 0x2C, 0x8E, 0x0E, 0x3E, 0x3B, 0xA2, 0x48, 0x7F, 0x91, 0x3D, 0x32, 0xA7, 0x7D, 0x04, 0x4B, 0x87, 0x1F, 0x02, 0xE0,
+ 0xD9, 0x67, 0x9E, 0x75, 0xFA, 0xE9, 0x6C, 0xBC, 0x35, 0x1D, 0xBD, 0xA9, 0xB3, 0xD9, 0x50, 0x86, 0x2D, 0x7F, 0xEB, 0x5B,
+ 0x6F, 0xBD, 0xF5, 0xFD, 0x9F, 0xFC, 0xE2, 0x17, 0xBF, 0x7F, 0xFE, 0xF9, 0xD7, 0x5F, 0x79, 0xE5, 0xCD, 0x37, 0xBE, 0xFF,
+ 0xD3, 0x5F, 0xFF, 0xF6, 0xCF, 0xEF, 0xBC, 0xFB, 0xAB, 0x9F, 0xFC, 0xE4, 0x97, 0xEF, 0xBF, 0xFF, 0x87, 0xA7, 0x9F, 0x66,
+ 0xAB, 0xF1, 0xDB, 0x84, 0x8D, 0x6F, 0xBD, 0xFE, 0x23, 0xA2, 0xFA, 0x4B, 0x2F, 0xBD, 0xF1, 0xF0, 0x83, 0x7C, 0xDD, 0xF8,
+ 0x8D, 0x40, 0x5C, 0x4A, 0x62, 0x16, 0x9C, 0xD4, 0xB9, 0x33, 0xE0, 0x1B, 0xD3, 0xBC, 0x0A, 0x82, 0x2D, 0x40, 0x3A, 0x4B,
+ 0x43, 0x10, 0xAE, 0x31, 0x34, 0x4B, 0x52, 0x2C, 0xEA, 0xE1, 0x85, 0xFE, 0x81, 0x97, 0x8C, 0xBF, 0x58, 0xAA, 0x96, 0x39,
+ 0x01, 0x41, 0x73, 0x11, 0x37, 0xE4, 0x14, 0x61, 0x63, 0xC8, 0xA4, 0x48, 0x59, 0x04, 0x3A, 0xBE, 0x37, 0xB3, 0x7B, 0x9D,
+ 0x9D, 0xC9, 0xBE, 0x47, 0xFF, 0x30, 0x64, 0x2D, 0xFD, 0x98, 0x20, 0x86, 0x4B, 0x22, 0x43, 0xED, 0x57, 0x5B, 0x0F, 0xD0,
+ 0x0B, 0x1F, 0xA1, 0xBB, 0x3A, 0x74, 0x78, 0xDD, 0x48, 0x23, 0x20, 0xAE, 0xCD, 0x7D, 0xED, 0x26, 0x3A, 0x95, 0x94, 0x06,
+ 0x4C, 0x67, 0xC9, 0xEB, 0xAA, 0xF4, 0xD5, 0x03, 0xB4, 0xEC, 0xD6, 0x67, 0xCA, 0xF6, 0x1B, 0x04, 0x6D, 0xA4, 0x8F, 0x21,
+ 0xB3, 0xCC, 0xB4, 0x20, 0x2E, 0x36, 0x32, 0x8A, 0x6B, 0x43, 0x76, 0x97, 0xC3, 0x1B, 0xA9, 0xE9, 0x40, 0x36, 0x92, 0x5D,
+ 0x8C, 0x40, 0xBE, 0xC3, 0xC9, 0x7C, 0x95, 0x1F, 0x1F, 0x00, 0x2C, 0xA2, 0x87, 0xC3, 0x1E, 0x7F, 0x22, 0xDB, 0xC5, 0x17,
+ 0x4F, 0x90, 0x3A, 0xE8, 0x9C, 0x73, 0x49, 0x07, 0x85, 0x38, 0x35, 0x7E, 0xA2, 0x72, 0xA7, 0xB8, 0x86, 0xCC, 0xE3, 0x38,
+ 0x84, 0xD9, 0xA9, 0xA0, 0xED, 0x65, 0x1A, 0x3B, 0x8A, 0x2D, 0x4F, 0x3C, 0xF1, 0xC2, 0xD3, 0x4F, 0xBF, 0xF2, 0xE2, 0x2B,
+ 0xDF, 0x45, 0xEE, 0x6F, 0xBE, 0xF9, 0xD3, 0x37, 0xDF, 0x7C, 0xEF, 0xAD, 0xB7, 0xDE, 0x7B, 0xE3, 0xAD, 0x77, 0x5F, 0x7A,
+ 0xE9, 0x3B, 0x8F, 0x3E, 0xF1, 0xFC, 0x95, 0x57, 0xDD, 0xCA, 0x44, 0x88, 0x3D, 0x81, 0x28, 0x18, 0xA5, 0x8E, 0x29, 0xBB,
+ 0x24, 0xFC, 0x9E, 0x77, 0x21, 0xC2, 0xAA, 0x2E, 0xAB, 0x1D, 0xEC, 0x5F, 0x43, 0x75, 0x46, 0x30, 0xCF, 0xC9, 0x2C, 0x18,
+ 0x7F, 0xC1, 0xF9, 0xC2, 0xDA, 0x33, 0xC3, 0x1F, 0x23, 0x6B, 0xC7, 0xDE, 0xED, 0xEC, 0xDE, 0xD9, 0xF4, 0xE8, 0x0E, 0x32,
+ 0xC5, 0x4C, 0x0D, 0xC3, 0x55, 0x45, 0x8F, 0x0E, 0x54, 0x1F, 0xEA, 0x13, 0xD2, 0xAF, 0x35, 0xD0, 0x64, 0x74, 0x80, 0x02,
+ 0xDC, 0x2D, 0xB5, 0xE2, 0x07, 0xB2, 0xD3, 0xDC, 0x70, 0xC4, 0x9D, 0x2D, 0x63, 0x0E, 0x77, 0xDE, 0x5B, 0x56, 0x58, 0x4D,
+ 0xDA, 0xAE, 0x88, 0x94, 0xBB, 0x41, 0xB2, 0xEF, 0x4C, 0xFD, 0x40, 0x82, 0x41, 0x88, 0x58, 0xB7, 0xBE, 0x8E, 0xB8, 0x54,
+ 0x48, 0x3C, 0xB3, 0x72, 0xCD, 0x44, 0xB5, 0x4B, 0x8C, 0x1D, 0x01, 0x71, 0xD4, 0xF7, 0xC2, 0xCD, 0x9A, 0x2F, 0x9E, 0x4B,
+ 0x8F, 0x13, 0xFE, 0x2C, 0xA2, 0xE9, 0x6C, 0xEE, 0x09, 0x5A, 0x18, 0x8C, 0xF9, 0xD3, 0xB0, 0xC3, 0xFA, 0xF8, 0xCA, 0x21,
+ 0x72, 0x41, 0x72, 0x12, 0xDA, 0x47, 0xB2, 0xC8, 0x43, 0x48, 0x0D, 0x27, 0x5D, 0x42, 0x8E, 0xA0, 0xAE, 0xC0, 0xAF, 0x18,
+ 0x1E, 0x90, 0xF2, 0xF7, 0x72, 0xF8, 0x5F, 0xF7, 0x32, 0x9A, 0x77, 0x64, 0xFA, 0xA4, 0xA4, 0xF4, 0x94, 0x40, 0x24, 0xA2,
+ 0x02, 0xD1, 0xE2, 0xF1, 0xC7, 0x9F, 0x7B, 0x0A, 0xE4, 0x79, 0xE0, 0xEB, 0x77, 0xDF, 0xFD, 0x28, 0xE7, 0xFD, 0x40, 0xDE,
+ 0xBA, 0xE8, 0x9C, 0x8B, 0x75, 0x4A, 0x61, 0xE0, 0x4D, 0x0A, 0x2E, 0xA9, 0xC0, 0xCC, 0xB5, 0x6A, 0x05, 0xCB, 0xE0, 0x1B,
+ 0x08, 0x97, 0x2D, 0x5E, 0x4B, 0x46, 0xC0, 0x46, 0x20, 0xFE, 0x23, 0xA0, 0xAF, 0x40, 0xAF, 0xB3, 0x7B, 0x61, 0x48, 0x2C,
+ 0x70, 0xB8, 0x2A, 0x0A, 0xCE, 0x6C, 0xC5, 0x61, 0xA2, 0xE9, 0x0E, 0x90, 0x9D, 0xB1, 0x9A, 0x00, 0x86, 0x44, 0x66, 0x59,
+ 0xAA, 0x03, 0xEF, 0x22, 0xD6, 0xA2, 0x03, 0x27, 0x77, 0xD4, 0x4C, 0x86, 0x7C, 0x14, 0xC4, 0xD0, 0xAD, 0x64, 0x36, 0x66,
+ 0xBA, 0xBD, 0x27, 0x69, 0xCC, 0x8D, 0x2E, 0xB8, 0xE5, 0xAE, 0x45, 0x21, 0x92, 0x28, 0xFE, 0x04, 0x89, 0xC7, 0x87, 0x02,
+ 0x65, 0xB2, 0xA4, 0x9B, 0x24, 0x9B, 0x20, 0xA4, 0x0E, 0x10, 0xAD, 0x04, 0xB3, 0x71, 0xD3, 0x99, 0x6F, 0x00, 0xF7, 0x3C,
+ 0xD8, 0xD7, 0xBE, 0x98, 0x96, 0x0B, 0x4D, 0x1E, 0x44, 0x4F, 0xFD, 0x41, 0xC5, 0x87, 0x7F, 0xA8, 0x6D, 0x32, 0xC0, 0x21,
+ 0x26, 0xCF, 0x9C, 0x32, 0x95, 0xB6, 0x30, 0xEC, 0x1D, 0xDF, 0x99, 0x1C, 0x04, 0xA0, 0xCC, 0xB5, 0xE9, 0xDC, 0x45, 0xEE,
+ 0x08, 0x65, 0xDC, 0xD9, 0x92, 0x98, 0x63, 0xA1, 0xE4, 0x08, 0xE0, 0x03, 0x1A, 0xA2, 0xD5, 0x3A, 0xFE, 0xBC, 0x0B, 0x2E,
+ 0x38, 0xE7, 0xC2, 0x49, 0x17, 0x4D, 0x86, 0x1F, 0x5F, 0x5B, 0xD9, 0xBE, 0x62, 0xF9, 0x46, 0x9A, 0x0D, 0xD4, 0x5C, 0xB7,
+ 0xDE, 0xFE, 0x08, 0xD9, 0xED, 0x50, 0xFF, 0x30, 0x81, 0x4A, 0x63, 0x3B, 0x12, 0x17, 0x35, 0x9C, 0x7E, 0x3A, 0x28, 0x77,
+ 0xCE, 0xD9, 0x5F, 0xE3, 0xFF, 0x92, 0x5F, 0x8E, 0x28, 0xC3, 0xE7, 0x34, 0xEC, 0x17, 0xA5, 0xF6, 0xF7, 0x0E, 0x2F, 0x5F,
+ 0xB2, 0x8E, 0x58, 0xC5, 0x3F, 0x95, 0x01, 0x1C, 0xA2, 0x9F, 0x2F, 0x94, 0x61, 0x97, 0x30, 0xE1, 0x0C, 0xEE, 0x2D, 0x65,
+ 0xC8, 0x12, 0x87, 0x74, 0xB4, 0xA9, 0x88, 0x8D, 0x02, 0x34, 0x30, 0x9C, 0xBC, 0x7C, 0xA4, 0xA5, 0x63, 0x3A, 0x42, 0xDE,
+ 0x10, 0x4A, 0x19, 0x25, 0xC0, 0x6D, 0x3A, 0xCC, 0x8A, 0x30, 0x2A, 0x68, 0xDB, 0xEA, 0x93, 0x71, 0x9D, 0x48, 0xDF, 0x86,
+ 0x01, 0xC8, 0xC9, 0xE6, 0x69, 0x61, 0x62, 0xFE, 0x04, 0x73, 0x8D, 0xBA, 0x72, 0x0B, 0xDC, 0x9B, 0x0B, 0xEA, 0x00, 0x09,
+ 0x2D, 0xF4, 0x0E, 0x83, 0xA4, 0xD1, 0x04, 0x97, 0x62, 0xCA, 0xF8, 0x4B, 0xA0, 0xF6, 0x73, 0xAE, 0x2E, 0x07, 0x01, 0x67,
+ 0x24, 0xA5, 0x61, 0x65, 0x00, 0x3D, 0x86, 0x4D, 0x06, 0x8C, 0x7C, 0xB1, 0xF7, 0x59, 0x97, 0x0A, 0x15, 0x85, 0x48, 0xC8,
+ 0xAF, 0xF8, 0x86, 0x15, 0x19, 0xC7, 0xCB, 0x44, 0x5E, 0x58, 0x11, 0x74, 0x55, 0xF1, 0x06, 0x60, 0x0A, 0xAB, 0x95, 0xA3,
+ 0x00, 0xCE, 0x95, 0xFD, 0x84, 0xA7, 0xFC, 0x39, 0x7F, 0xDC, 0x05, 0xA4, 0xEA, 0x42, 0x54, 0xAD, 0x6C, 0xE0, 0x84, 0x1E,
+ 0xF2, 0x16, 0x95, 0x3B, 0x2A, 0xE0, 0x96, 0xBA, 0x97, 0x89, 0x05, 0xE0, 0x36, 0x79, 0xC2, 0x45, 0x32, 0xBD, 0x18, 0x3F,
+ 0x41, 0x0E, 0xDE, 0x38, 0xEB, 0x6C, 0xED, 0x43, 0x9C, 0x77, 0xDE, 0x79, 0x6C, 0x1A, 0x1C, 0xEC, 0x5F, 0xD9, 0xB3, 0x68,
+ 0x39, 0xA7, 0x30, 0xC0, 0xC0, 0xA4, 0xCD, 0x4E, 0x6C, 0x20, 0x81, 0x36, 0x5C, 0x15, 0x93, 0xF9, 0xC8, 0x4E, 0x6C, 0xB9,
+ 0xB0, 0x3A, 0xB0, 0x33, 0x64, 0x51, 0x80, 0x0A, 0x5D, 0x5C, 0xE1, 0x14, 0xD2, 0xC7, 0x09, 0x78, 0xDC, 0x47, 0x73, 0x79,
+ 0x3A, 0x88, 0xEA, 0x07, 0xCE, 0x52, 0xE9, 0x87, 0x4B, 0x20, 0xB5, 0x6A, 0x70, 0x35, 0x21, 0xC5, 0xB0, 0xED, 0xCA, 0xAA,
+ 0xE8, 0xD5, 0x63, 0xC4, 0x0F, 0x8C, 0xB8, 0x61, 0x8E, 0xB2, 0xDC, 0x6B, 0x7D, 0xC4, 0xFC, 0xD6, 0x74, 0xE8, 0x94, 0xF0,
+ 0x0D, 0x03, 0x87, 0x4C, 0xE3, 0xDC, 0xAF, 0x8D, 0xBB, 0xF8, 0xC2, 0xF1, 0xE7, 0x8C, 0x3B, 0x57, 0x51, 0x05, 0x99, 0x02,
+ 0xF7, 0xD8, 0x3E, 0x29, 0x36, 0x26, 0x2F, 0x0C, 0x38, 0x93, 0x7E, 0x28, 0x25, 0x42, 0x77, 0xFD, 0x4B, 0x16, 0x38, 0x73,
+ 0x0E, 0xC4, 0x45, 0xCA, 0x25, 0x8C, 0x97, 0xAD, 0xFF, 0x98, 0xA7, 0xD3, 0xCB, 0x51, 0xC9, 0x49, 0x53, 0x41, 0x66, 0xA2,
+ 0x62, 0xE8, 0xA7, 0x09, 0x11, 0x5A, 0x20, 0xFE, 0xDC, 0x71, 0x08, 0x9A, 0xE9, 0x90, 0xB6, 0x7A, 0x78, 0x3E, 0x17, 0xC2,
+ 0x10, 0x9D, 0x74, 0x09, 0xCD, 0x28, 0x07, 0xEB, 0x64, 0x6E, 0x31, 0x99, 0x37, 0x30, 0x79, 0xC2, 0x78, 0x94, 0xAA, 0x6F,
+ 0x89, 0xDA, 0x93, 0xB3, 0x2E, 0x6A, 0xAB, 0xDB, 0x20, 0x81, 0x4B, 0x2B, 0x77, 0xC6, 0x6C, 0x9A, 0x02, 0xE1, 0xFE, 0x81,
+ 0xDA, 0xEB, 0xB5, 0xE9, 0x89, 0x93, 0xAA, 0x90, 0x89, 0xDA, 0x9C, 0x45, 0xE2, 0xA5, 0x2C, 0x76, 0xA3, 0x9C, 0x52, 0x01,
+ 0xF6, 0x41, 0x1F, 0x4D, 0xE1, 0x4D, 0x4F, 0x5F, 0x6C, 0x5F, 0xEA, 0x5B, 0x13, 0x48, 0xD5, 0x0F, 0x9C, 0x0B, 0x37, 0xD5,
+ 0x71, 0xA4, 0x6F, 0x9A, 0xAE, 0x32, 0x08, 0xD4, 0x00, 0x60, 0x54, 0xA2, 0x82, 0xD6, 0xA5, 0xD2, 0xD7, 0x4C, 0x54, 0x55,
+ 0xA8, 0x11, 0x1B, 0xBF, 0x31, 0xCC, 0xEA, 0x08, 0x8A, 0x17, 0x99, 0xB9, 0xFB, 0xCE, 0x45, 0xDC, 0x60, 0x0E, 0x8B, 0x8A,
+ 0x9F, 0xCF, 0x6F, 0xA4, 0x0F, 0xE0, 0xCC, 0x16, 0xEE, 0x9B, 0x61, 0x8E, 0xBA, 0x34, 0x08, 0xAE, 0xE7, 0x91, 0x08, 0x4A,
+ 0x5B, 0x7B, 0xAE, 0x34, 0x53, 0x65, 0xAF, 0xCE, 0x84, 0x89, 0xF4, 0xA9, 0x20, 0x64, 0xE8, 0xA6, 0x1D, 0xB5, 0x6B, 0xF0,
+ 0x84, 0x3D, 0xB6, 0x08, 0x17, 0x71, 0x13, 0x4E, 0x08, 0x2A, 0x36, 0x97, 0x55, 0x99, 0x9A, 0xBE, 0x9B, 0x3C, 0x93, 0x70,
+ 0xA2, 0x91, 0x06, 0x5D, 0xCE, 0x98, 0x36, 0x1D, 0x9E, 0x3A, 0x6B, 0xE6, 0xD4, 0x4B, 0xA7, 0x5D, 0x3A, 0x55, 0xE3, 0x8D,
+ 0x6C, 0x99, 0xF6, 0xF1, 0xC1, 0x59, 0x7B, 0xDA, 0x07, 0xEA, 0x6A, 0x5B, 0xD9, 0x9A, 0xC9, 0xBC, 0x81, 0x5E, 0x85, 0x04,
+ 0x30, 0x93, 0x97, 0x6B, 0xBB, 0xD7, 0x7B, 0x2B, 0xDE, 0xE0, 0xCF, 0xC4, 0x14, 0x08, 0x12, 0x03, 0x57, 0x33, 0xFF, 0x32,
+ 0x08, 0x72, 0x92, 0x1A, 0xFF, 0x30, 0x74, 0x60, 0x6C, 0x5F, 0x91, 0xC7, 0xA4, 0x43, 0x12, 0x51, 0x75, 0xAB, 0x94, 0xEC,
+ 0xF0, 0x72, 0xA4, 0x29, 0x76, 0xED, 0x9A, 0xFC, 0x48, 0x1A, 0x1A, 0xE6, 0x40, 0x90, 0x91, 0xB8, 0x81, 0xAF, 0x91, 0xE7,
+ 0xBB, 0x58, 0xE4, 0x28, 0x49, 0x58, 0x05, 0x5A, 0xAC, 0x03, 0xB2, 0xDA, 0x14, 0x22, 0xAC, 0x99, 0x02, 0x47, 0x38, 0x58,
+ 0x4A, 0xC5, 0xA5, 0xFE, 0x74, 0x68, 0x3F, 0x73, 0xE0, 0xC6, 0x8A, 0x02, 0xBC, 0x69, 0x9F, 0xB9, 0xAB, 0x89, 0xF9, 0x3C,
+ 0xE6, 0x0A, 0x60, 0x88, 0x7C, 0xE3, 0x42, 0x69, 0xCD, 0x84, 0x8B, 0x27, 0x22, 0x5D, 0x92, 0x57, 0xDA, 0x09, 0xF4, 0x97,
+ 0x94, 0x7A, 0x8E, 0x86, 0x68, 0xEF, 0xD0, 0xE8, 0x57, 0xB9, 0x5B, 0xE9, 0x6B, 0xEF, 0x53, 0x3C, 0x60, 0xE2, 0x94, 0xE9,
+ 0x97, 0x4C, 0x85, 0x11, 0x0D, 0xAC, 0xCD, 0x21, 0xD8, 0x50, 0x1B, 0x4E, 0x95, 0xF2, 0x4A, 0xD8, 0xC1, 0x53, 0x67, 0x12,
+ 0x5A, 0xA6, 0x5E, 0x32, 0xE1, 0xDC, 0x73, 0xCF, 0xE5, 0x0F, 0x39, 0x5E, 0x9A, 0x96, 0x1F, 0x0E, 0xC1, 0x76, 0x04, 0x66,
+ 0x4D, 0xD2, 0x9E, 0xB1, 0xB5, 0x91, 0x76, 0x84, 0xC4, 0xDE, 0x05, 0xFA, 0xA3, 0xFC, 0xB8, 0x36, 0x81, 0xD7, 0x4D, 0xDC,
+ 0x4D, 0x26, 0x39, 0x92, 0x0E, 0x69, 0x52, 0x64, 0x9F, 0x6F, 0x92, 0x57, 0x74, 0x60, 0x48, 0xE7, 0xD2, 0x47, 0x93, 0xAA,
+ 0xCA, 0xDD, 0xDB, 0xED, 0x11, 0xA5, 0xB5, 0x6E, 0xB1, 0x6B, 0x4D, 0x3D, 0xDD, 0x20, 0x71, 0xCA, 0x5F, 0xF1, 0xA0, 0xC4,
+ 0x61, 0x8F, 0x43, 0x8C, 0x84, 0x13, 0x69, 0x0A, 0x69, 0x6F, 0x4E, 0x48, 0x38, 0x14, 0xC6, 0x86, 0xF9, 0x23, 0x20, 0xA3,
+ 0x92, 0x35, 0x35, 0x8E, 0x44, 0x57, 0x60, 0x57, 0x93, 0x3F, 0x87, 0x2D, 0x6B, 0xE6, 0x0A, 0xCE, 0x69, 0x24, 0xEC, 0x2D,
+ 0x98, 0x3D, 0x7F, 0xF2, 0xC5, 0x93, 0x38, 0xED, 0x44, 0xE8, 0x30, 0x45, 0x95, 0x08, 0x1A, 0x60, 0xE1, 0x70, 0x6C, 0x36,
+ 0x56, 0xA8, 0x69, 0xB3, 0xA4, 0xE3, 0x3D, 0xE9, 0x12, 0xD4, 0x00, 0xB8, 0x5B, 0x2F, 0x51, 0x8C, 0xE2, 0xF9, 0xB4, 0xBF,
+ 0x78, 0x0E, 0x7B, 0x28, 0x67, 0x4F, 0x15, 0xE6, 0x1D, 0x1D, 0x08, 0x86, 0xF2, 0x08, 0x57, 0x6A, 0xDD, 0x99, 0xF3, 0x84,
+ 0x23, 0x6C, 0xCE, 0x9D, 0xE1, 0x45, 0x50, 0x98, 0xFF, 0x82, 0x40, 0x36, 0xFE, 0x51, 0x36, 0xE1, 0x82, 0xC4, 0x15, 0x22,
+ 0x0A, 0xAE, 0x20, 0x52, 0x0E, 0x16, 0x3E, 0x92, 0x65, 0xCF, 0x69, 0xE0, 0x15, 0xF9, 0xBA, 0x7C, 0xBA, 0x91, 0x60, 0xA0,
+ 0x2C, 0x23, 0x17, 0xA9, 0x22, 0x8D, 0xE8, 0xB5, 0x7A, 0x70, 0x74, 0xE0, 0xF6, 0x76, 0x4C, 0xF2, 0xEE, 0x81, 0x14, 0x95,
+ 0xB5, 0x57, 0xD0, 0x5E, 0x33, 0x1F, 0xF3, 0x4C, 0xEF, 0x5D, 0x22, 0xB3, 0xA2, 0xBF, 0xB3, 0xF4, 0xE8, 0x04, 0x43, 0x6D,
+ 0x97, 0x4E, 0xBA, 0x61, 0x7F, 0x08, 0x19, 0xC4, 0xD0, 0x31, 0x75, 0x6E, 0xA3, 0x24, 0x59, 0x14, 0xE0, 0xE4, 0xDD, 0x9A,
+ 0xEA, 0x99, 0xDF, 0x2A, 0x7B, 0x50, 0x2F, 0x48, 0x0A, 0x79, 0xCE, 0x8C, 0x89, 0x93, 0xE9, 0x30, 0x92, 0x8F, 0x42, 0x44,
+ 0x64, 0xCB, 0x22, 0x62, 0x25, 0x96, 0x22, 0xAF, 0xA9, 0x97, 0x4E, 0x9E, 0x3E, 0x79, 0x86, 0xA0, 0x0A, 0x11, 0xDB, 0x85,
+ 0x14, 0x30, 0x07, 0xF4, 0x17, 0x44, 0x3A, 0x43, 0xE2, 0x30, 0xEE, 0x42, 0x7F, 0x6D, 0xDA, 0xE4, 0x4B, 0x44, 0x01, 0xE2,
+ 0x79, 0xC2, 0x81, 0xC4, 0x17, 0x1D, 0xBA, 0xBC, 0xE9, 0x3A, 0x68, 0x47, 0x88, 0xDF, 0x4E, 0x9F, 0x3A, 0x8D, 0x36, 0xF5,
+ 0xD9, 0xE7, 0x7C, 0xAD, 0xA3, 0xB9, 0x8B, 0x29, 0x1B, 0x69, 0x02, 0xA2, 0x04, 0x06, 0x70, 0x5C, 0xCA, 0x55, 0xCB, 0x95,
+ 0x73, 0xA7, 0x66, 0xA1, 0xDA, 0xFA, 0x75, 0x62, 0xB2, 0xAB, 0x09, 0xAB, 0x12, 0xC4, 0x8D, 0xA3, 0xA8, 0xE8, 0x23, 0xA9,
+ 0x90, 0xD9, 0xF9, 0xC3, 0x19, 0x1E, 0x01, 0x21, 0x3E, 0x0E, 0xCF, 0xC0, 0x40, 0xD0, 0xC9, 0x62, 0x1D, 0x91, 0xA3, 0x8B,
+ 0xFB, 0xDE, 0x20, 0xEC, 0x7D, 0xBE, 0xA1, 0x4A, 0x8C, 0xC2, 0x9F, 0x91, 0x58, 0x6D, 0x14, 0xA0, 0x69, 0x95, 0x33, 0x6E,
+ 0x65, 0x76, 0x16, 0x14, 0xE6, 0xE4, 0x76, 0xC6, 0x21, 0x2C, 0x59, 0x53, 0xE4, 0x6E, 0x96, 0x00, 0xAE, 0xE6, 0xDA, 0x7E,
+ 0x41, 0x28, 0xCC, 0xE5, 0x92, 0x06, 0x20, 0x5F, 0x71, 0xFF, 0x90, 0x28, 0x7A, 0x35, 0x6D, 0x75, 0x8B, 0x7C, 0x67, 0xCC,
+ 0x3B, 0xFF, 0x9C, 0xAF, 0xCD, 0x98, 0x3C, 0x0D, 0xB3, 0x25, 0x79, 0xD5, 0x8E, 0xA6, 0x30, 0xAB, 0x09, 0xDA, 0x53, 0x50,
+ 0xCA, 0x14, 0x70, 0x89, 0xE4, 0x47, 0x63, 0x80, 0x86, 0x01, 0x8D, 0x01, 0x73, 0xA6, 0xE9, 0xAE, 0x10, 0x89, 0x3D, 0x0A,
+ 0x80, 0x1A, 0xF3, 0x69, 0x07, 0xE1, 0x8E, 0xB4, 0x83, 0x78, 0xDC, 0xE0, 0xD2, 0x74, 0x9A, 0x45, 0xB1, 0x31, 0x89, 0x9C,
+ 0xE0, 0x49, 0x37, 0x05, 0xF9, 0xF2, 0xB9, 0x64, 0xAF, 0xD5, 0x5C, 0x3F, 0x15, 0xAE, 0x70, 0x8A, 0xE8, 0x42, 0x2B, 0x75,
+ 0x8E, 0xCF, 0x65, 0x13, 0x21, 0x25, 0x37, 0x62, 0xFE, 0x41, 0xC1, 0xAE, 0xD5, 0x87, 0x21, 0x7A, 0xBD, 0xD6, 0xC7, 0x95,
+ 0x95, 0x64, 0x74, 0x70, 0x92, 0xED, 0xDB, 0xA2, 0xD7, 0x03, 0xFD, 0x1E, 0xBB, 0x76, 0x0C, 0xDC, 0x09, 0x06, 0x4E, 0x19,
+ 0x61, 0x32, 0x1F, 0x96, 0xA4, 0x40, 0xBA, 0x1F, 0xDA, 0x85, 0x2C, 0x6F, 0x6A, 0xEB, 0x90, 0x70, 0x4C, 0xD3, 0x4A, 0xB9,
+ 0x69, 0x9A, 0xD2, 0x39, 0xF4, 0x58, 0x76, 0x4F, 0xBA, 0xD2, 0x47, 0x01, 0x26, 0xEE, 0x29, 0x41, 0x5C, 0x46, 0x6C, 0x14,
+ 0x44, 0xD8, 0x26, 0xD7, 0x98, 0x1B, 0x92, 0x85, 0xD1, 0xC5, 0x60, 0x12, 0x60, 0x31, 0x59, 0xEC, 0x34, 0xD3, 0xD1, 0x14,
+ 0x30, 0xD1, 0x76, 0x26, 0x08, 0x83, 0x26, 0x78, 0xDC, 0x54, 0x12, 0x13, 0xC9, 0x38, 0x49, 0x75, 0x8C, 0x07, 0x4C, 0x21,
+ 0xE5, 0xB5, 0x3B, 0x0F, 0x04, 0x06, 0x09, 0x33, 0x6C, 0x87, 0x22, 0x02, 0x99, 0x9E, 0x8F, 0x1B, 0x75, 0x44, 0x2B, 0xF8,
+ 0x07, 0x81, 0x8A, 0x66, 0xD1, 0xF8, 0x8B, 0x26, 0xB0, 0x9B, 0x2C, 0x92, 0x24, 0x3E, 0x34, 0x8A, 0xEF, 0xDA, 0x06, 0x55,
+ 0x98, 0x1B, 0xB3, 0x97, 0x4D, 0x5A, 0x6F, 0x48, 0x9F, 0xB2, 0x5F, 0x67, 0xC8, 0x66, 0x76, 0xE6, 0x74, 0xE0, 0x49, 0xDF,
+ 0xCD, 0x49, 0x42, 0x22, 0x74, 0x0A, 0x66, 0x28, 0xD6, 0x01, 0xC1, 0x62, 0xF8, 0xDC, 0x85, 0xF0, 0x6B, 0x58, 0xEF, 0x8E,
+ 0x0E, 0x6C, 0x20, 0xD5, 0x4C, 0xC6, 0x26, 0xA3, 0x5E, 0x09, 0x8E, 0xF1, 0x86, 0xFF, 0xF5, 0xAE, 0x4D, 0x8D, 0x3C, 0x19,
+ 0x91, 0x53, 0x5E, 0x38, 0x9C, 0x0C, 0x13, 0xA9, 0xC4, 0x25, 0xDD, 0x61, 0x32, 0xAE, 0xAD, 0x6A, 0x40, 0xF4, 0x32, 0xD4,
+ 0x84, 0x39, 0xCB, 0x46, 0x46, 0x37, 0xCF, 0xD3, 0x44, 0x50, 0x82, 0x21, 0xC7, 0x27, 0x9A, 0xF2, 0x02, 0xF9, 0x72, 0xC6,
+ 0x3C, 0xA9, 0x3A, 0x94, 0x5B, 0xB3, 0xD5, 0x09, 0x1E, 0xF5, 0x6C, 0x0E, 0x1E, 0x91, 0xED, 0x66, 0xB2, 0xE1, 0x69, 0x16,
+ 0xF5, 0x84, 0xD0, 0xF7, 0xA6, 0x39, 0x59, 0x2C, 0x7A, 0x02, 0x7C, 0x58, 0xD8, 0xF5, 0xFC, 0xE9, 0x8E, 0xED, 0x6B, 0xDE,
+ 0xE5, 0x6C, 0x1B, 0x61, 0x88, 0xAD, 0xCB, 0x34, 0x7F, 0x84, 0x7C, 0x6F, 0x1C, 0x82, 0x97, 0x42, 0x0D, 0x24, 0xC1, 0x7C,
+ 0x77, 0x6F, 0x73, 0x5D, 0x2B, 0x0E, 0xC7, 0xD9, 0x84, 0x6B, 0x86, 0xD7, 0xF1, 0x7E, 0x50, 0x1E, 0x34, 0x53, 0xA6, 0xF6,
+ 0xB6, 0x78, 0x62, 0x5C, 0x33, 0x12, 0x1E, 0xDC, 0x70, 0x2D, 0x9F, 0xD4, 0x60, 0x8E, 0x90, 0xFB, 0x02, 0x8D, 0x4F, 0xAB,
+ 0xF4, 0xF5, 0x6E, 0x40, 0xB0, 0x8F, 0x05, 0xFD, 0xFF, 0x55, 0xB2, 0x63, 0x9F, 0x60, 0x8A, 0x2F, 0x6F, 0xAD, 0x20, 0x68,
+ 0x63, 0x96, 0x4D, 0x58, 0xB5, 0x33, 0x6A, 0xDF, 0xA2, 0x62, 0x91, 0xD3, 0xC8, 0xC5, 0x0F, 0x4C, 0x3A, 0xA1, 0xB9, 0x9D,
+ 0x96, 0x33, 0x7A, 0xA1, 0xDB, 0x48, 0x25, 0xB8, 0x29, 0x79, 0xD6, 0x58, 0x10, 0x92, 0x05, 0xAF, 0x98, 0xEB, 0x71, 0x8E,
+ 0x0E, 0x81, 0x9A, 0x13, 0x10, 0xEA, 0x6B, 0x5A, 0x31, 0x6D, 0x8C, 0x1A, 0x04, 0x77, 0x13, 0x59, 0x8C, 0x3A, 0x00, 0x30,
+ 0x71, 0x1A, 0xCB, 0xBA, 0x1D, 0xCA, 0x6C, 0x93, 0x47, 0x8E, 0xF3, 0xA6, 0x89, 0x73, 0x98, 0xD4, 0x8B, 0xED, 0x4A, 0x22,
+ 0x62, 0x9B, 0x74, 0xC9, 0x8E, 0x01, 0x67, 0x88, 0xED, 0xEC, 0x21, 0x20, 0x29, 0xD0, 0xFE, 0xA8, 0x32, 0xB7, 0x27, 0x8C,
+ 0xBF, 0x68, 0xE6, 0xF4, 0x59, 0x9C, 0x27, 0x05, 0x48, 0xD2, 0xDA, 0x7A, 0xF9, 0x1B, 0xDF, 0x3E, 0xB2, 0xEB, 0x30, 0xED,
+ 0x23, 0x82, 0x13, 0x72, 0xE4, 0x73, 0xC9, 0x18, 0xCA, 0x24, 0x7E, 0x4E, 0x39, 0x16, 0x28, 0xF8, 0xC3, 0x3E, 0x03, 0xC5,
+ 0x2B, 0xB5, 0x77, 0xC7, 0xEF, 0x9D, 0x8E, 0xA7, 0xB1, 0x36, 0x3E, 0xA0, 0x3F, 0x3A, 0x30, 0x3D, 0x89, 0xFF, 0xE7, 0xE5,
+ 0x84, 0x59, 0x39, 0x34, 0xCA, 0x36, 0xEC, 0xBC, 0x74, 0x1A, 0x2D, 0x1D, 0xEC, 0x23, 0x9E, 0x0E, 0x07, 0x56, 0x63, 0x66,
+ 0xDC, 0x32, 0x43, 0x96, 0x63, 0x2A, 0x24, 0xB5, 0x30, 0x18, 0xCA, 0x3B, 0xA6, 0x93, 0xAA, 0x59, 0x93, 0xB5, 0x26, 0xAD,
+ 0x3F, 0x75, 0x17, 0x23, 0x45, 0xC9, 0x70, 0xDF, 0x72, 0xBE, 0x10, 0x65, 0xEA, 0xA4, 0x4B, 0x39, 0xD8, 0x17, 0x40, 0xB8,
+ 0xE8, 0xC2, 0xF3, 0x01, 0x74, 0xDD, 0x62, 0xA7, 0xB9, 0xEC, 0x08, 0xAD, 0x5A, 0x76, 0x82, 0x38, 0x1D, 0x66, 0xCB, 0x80,
+ 0x17, 0xDC, 0x37, 0xD6, 0xAD, 0xE6, 0x6F, 0xB7, 0x28, 0x39, 0xBB, 0x94, 0x4C, 0xE2, 0xAF, 0x14, 0x1B, 0x93, 0x20, 0x38,
+ 0x0D, 0x51, 0xFE, 0x5C, 0x5C, 0xE1, 0x9C, 0xB3, 0x21, 0x4F, 0x34, 0xD7, 0xB6, 0x93, 0xD1, 0x72, 0xA8, 0xD8, 0x5F, 0x7E,
+ 0xFB, 0x4F, 0xCE, 0xD6, 0x36, 0x53, 0x2C, 0x3F, 0x09, 0x12, 0xC1, 0xA2, 0x00, 0xC5, 0x22, 0x69, 0x65, 0x8A, 0x85, 0x89,
+ 0x19, 0xF1, 0x2B, 0x46, 0x23, 0x6E, 0x39, 0xED, 0x6C, 0x40, 0x53, 0x50, 0xB2, 0x08, 0xEC, 0xC3, 0x8E, 0x54, 0x8B, 0x18,
+ 0x5F, 0xA1, 0x89, 0x31, 0x11, 0x42, 0xC7, 0x35, 0x1A, 0x69, 0xED, 0xC2, 0x16, 0x46, 0x5A, 0x1A, 0x9E, 0x5F, 0x9D, 0xCC,
+ 0xE9, 0x90, 0x5E, 0xB7, 0x91, 0xBE, 0xEA, 0xC0, 0x82, 0xA9, 0x06, 0xB7, 0x91, 0x24, 0xCF, 0x98, 0x09, 0x82, 0x43, 0x28,
+ 0x04, 0xE1, 0xAD, 0x6B, 0x2F, 0x5B, 0x3B, 0xB4, 0x76, 0xC6, 0xE4, 0xC9, 0x64, 0x44, 0x44, 0x63, 0x6A, 0x28, 0x42, 0xAB,
+ 0xEE, 0xE8, 0xB3, 0x02, 0x95, 0x64, 0xD7, 0x74, 0xF0, 0x0D, 0xF1, 0xDD, 0xD9, 0x14, 0x66, 0x68, 0x32, 0xEC, 0x38, 0x93,
+ 0x7D, 0xB2, 0xDA, 0x6A, 0x96, 0xDE, 0x27, 0x7B, 0x31, 0x3D, 0x1B, 0x95, 0x40, 0x15, 0xA7, 0xEF, 0xE6, 0xA6, 0x6A, 0xF6,
+ 0x45, 0xF8, 0x5B, 0x06, 0xAB, 0x13, 0x2E, 0xBC, 0x00, 0x9E, 0xC7, 0xBA, 0xE5, 0x5B, 0xF9, 0x38, 0xA8, 0xEA, 0x91, 0xFB,
+ 0x9E, 0x42, 0x0D, 0x9C, 0xAE, 0x46, 0x2C, 0x09, 0x99, 0x1B, 0xE0, 0x04, 0x86, 0xE0, 0x60, 0x97, 0x00, 0x27, 0x70, 0x6A,
+ 0x44, 0x4F, 0x2D, 0xED, 0x0C, 0x5A, 0xB8, 0x1B, 0x21, 0x35, 0xB6, 0x1B, 0xFF, 0xDC, 0x58, 0x88, 0x0E, 0xBE, 0xDC, 0x09,
+ 0xE8, 0x77, 0x9A, 0xF3, 0x85, 0xC6, 0x00, 0x8E, 0x07, 0x61, 0x14, 0x67, 0x1C, 0xB4, 0xF1, 0xE8, 0x43, 0x2A, 0x32, 0x75,
+ 0x91, 0x53, 0x29, 0x40, 0x06, 0x9F, 0xDA, 0xBE, 0x66, 0xB9, 0x07, 0xAF, 0xC9, 0x70, 0x43, 0xCA, 0x1C, 0x13, 0x2A, 0x24,
+ 0xC3, 0x33, 0xFB, 0x29, 0x40, 0x15, 0x42, 0x31, 0x65, 0x1D, 0x27, 0xCD, 0xEE, 0xBB, 0x6C, 0x3F, 0x39, 0xD2, 0x7C, 0xDF,
+ 0x05, 0x1C, 0x30, 0x07, 0x5E, 0x11, 0x66, 0x49, 0x8D, 0x4C, 0x2B, 0x9F, 0x8C, 0xD6, 0xD9, 0x6E, 0xE7, 0xCC, 0x4F, 0xDC,
+ 0x7A, 0x42, 0xB3, 0x5E, 0x50, 0xDE, 0xB9, 0x35, 0x6D, 0x67, 0x31, 0x73, 0x77, 0xCF, 0x8C, 0xED, 0xBB, 0xE9, 0xE6, 0x19,
+ 0xBB, 0x9C, 0xED, 0x0B, 0xF2, 0x64, 0xF1, 0x2D, 0xFE, 0x11, 0xF9, 0x18, 0xF1, 0xBF, 0x83, 0x6F, 0x75, 0x6E, 0x19, 0x00,
+ 0x00, 0x71, 0xC7, 0xB7, 0xBF, 0xFD, 0xCE, 0x2F, 0x7E, 0xFC, 0x6B, 0xBE, 0x28, 0x42, 0x66, 0x50, 0xF3, 0x16, 0x90, 0xE9,
+ 0xE9, 0x10, 0x5F, 0x58, 0x6B, 0xEE, 0x5E, 0x33, 0x4D, 0x61, 0xBD, 0xDD, 0x24, 0x6F, 0x0E, 0xA2, 0x8F, 0x8F, 0xD5, 0xC1,
+ 0x28, 0x7B, 0x37, 0xAC, 0xD8, 0x51, 0x08, 0x33, 0x62, 0xF5, 0x66, 0x7A, 0xAC, 0xD2, 0xD7, 0xD4, 0xD3, 0x1A, 0x3E, 0x9D,
+ 0x8C, 0x93, 0x45, 0xEF, 0x65, 0x38, 0xC9, 0xC9, 0x1E, 0x86, 0x58, 0x20, 0x24, 0x1C, 0x65, 0xDD, 0x38, 0xBD, 0x2D, 0x13,
+ 0x15, 0xA4, 0x8A, 0xD6, 0xC0, 0x80, 0xA9, 0xFA, 0xCD, 0x9D, 0x43, 0x71, 0x94, 0x95, 0x92, 0xB1, 0x61, 0xD5, 0x36, 0x36,
+ 0x7A, 0x80, 0x03, 0xD0, 0x49, 0x61, 0x34, 0xC1, 0x28, 0x20, 0x71, 0x64, 0xB7, 0x29, 0x1F, 0xDE, 0x14, 0x74, 0xCE, 0x1E,
+ 0xBC, 0x11, 0x5B, 0xF6, 0x96, 0x17, 0x5A, 0x5B, 0x8C, 0xDE, 0x9E, 0x67, 0xC5, 0xED, 0x08, 0x45, 0xB7, 0x81, 0xF8, 0x33,
+ 0x9D, 0x95, 0xA5, 0xB9, 0xB2, 0x2A, 0x4C, 0x51, 0x8E, 0xA8, 0x43, 0xF8, 0x01, 0x58, 0xD6, 0xAF, 0xD9, 0x0E, 0xD5, 0x9E,
+ 0x8C, 0x8B, 0x23, 0x41, 0x7E, 0xF6, 0xD6, 0xAF, 0x9E, 0x7C, 0xF0, 0x19, 0xBE, 0xA2, 0x59, 0xBE, 0x60, 0x6F, 0x8E, 0x9F,
+ 0x26, 0xA3, 0xB6, 0x7B, 0xE1, 0x74, 0xF1, 0x0C, 0x6F, 0xCA, 0xCD, 0xAD, 0x47, 0x36, 0x65, 0xDA, 0x07, 0x1D, 0x1D, 0x9C,
+ 0x52, 0xD0, 0x63, 0x9A, 0x13, 0x5F, 0xA2, 0x8C, 0x11, 0x2C, 0xD2, 0x90, 0x7B, 0xB2, 0xF9, 0x5B, 0x92, 0xE5, 0x28, 0x6E,
+ 0x13, 0x1E, 0x80, 0xC9, 0x07, 0x38, 0x5D, 0x3C, 0x33, 0xE5, 0x90, 0x90, 0x60, 0xEA, 0x78, 0xD9, 0x31, 0x00, 0x62, 0x82,
+ 0xC2, 0xB2, 0xD7, 0x2C, 0x38, 0x9C, 0x93, 0x05, 0x39, 0xCD, 0x95, 0xAC, 0x86, 0xFD, 0x26, 0xCB, 0xFA, 0xD7, 0xCD, 0x9B,
+ 0xE3, 0x37, 0xFE, 0x82, 0x71, 0xD2, 0xD1, 0x23, 0x41, 0x74, 0x2B, 0x6A, 0x95, 0x9A, 0x57, 0xB2, 0xA7, 0xBC, 0xD6, 0xDC,
+ 0xD7, 0x9A, 0xBF, 0xDE, 0x75, 0xCC, 0xD6, 0x95, 0x94, 0xAD, 0x0D, 0x9D, 0xE2, 0x9C, 0x33, 0x17, 0xD0, 0x01, 0xB5, 0xC7,
+ 0x25, 0x53, 0x20, 0x14, 0xB5, 0x34, 0x77, 0x2E, 0x1D, 0x5A, 0xA3, 0xFB, 0x0F, 0x39, 0x93, 0xE5, 0xAD, 0x37, 0x7E, 0xC6,
+ 0xE1, 0x93, 0x58, 0x12, 0x9E, 0x84, 0xB6, 0x8C, 0x1A, 0xC0, 0x7D, 0xC9, 0x7F, 0xD4, 0xCC, 0xED, 0xBF, 0xF0, 0x7A, 0x80,
+ 0xF7, 0xAD, 0xFA, 0x7C, 0xA9, 0x64, 0x47, 0x63, 0xFD, 0xD8, 0xA7, 0xB9, 0x21, 0xD7, 0x43, 0xE1, 0x93, 0x04, 0xD9, 0x91,
+ 0xB2, 0x7B, 0x81, 0xA3, 0x68, 0xEC, 0xB5, 0x9E, 0xA1, 0x6C, 0x0E, 0x61, 0x76, 0xD8, 0xCD, 0x40, 0xCC, 0x57, 0xD9, 0x94,
+ 0xB2, 0x90, 0xBA, 0x51, 0x9A, 0x5C, 0xA6, 0xCF, 0x45, 0xAB, 0x3D, 0x94, 0x0C, 0x52, 0x1A, 0xB7, 0x1C, 0x97, 0x19, 0x93,
+ 0xC2, 0x79, 0x65, 0xDC, 0x25, 0x1F, 0xE7, 0x2C, 0x4B, 0x1A, 0x44, 0xE3, 0xCE, 0x3E, 0x8B, 0xC6, 0x8E, 0x89, 0x04, 0xEC,
+ 0x9F, 0x95, 0x6D, 0x1D, 0x76, 0xC4, 0x3D, 0x22, 0x5C, 0x4F, 0xD9, 0x61, 0x3F, 0xFC, 0x08, 0x16, 0x5B, 0xB9, 0xBB, 0xE9,
+ 0xAF, 0x3A, 0x9F, 0xD5, 0xD0, 0x68, 0x3F, 0x30, 0xC7, 0xE7, 0xCE, 0x9E, 0x3F, 0x7B, 0x96, 0x2F, 0x93, 0x54, 0xFA, 0xA6,
+ 0xEB, 0x56, 0x6C, 0x21, 0x33, 0x06, 0xA0, 0xC0, 0x52, 0xCE, 0xA2, 0x7C, 0xEE, 0xF1, 0x17, 0xF9, 0x86, 0x1C, 0xB3, 0xB7,
+ 0x4E, 0xF6, 0xF3, 0x3A, 0xD5, 0x8C, 0x47, 0xA3, 0x56, 0xEB, 0x5E, 0xB8, 0xB3, 0xD7, 0x5F, 0xAE, 0x83, 0x53, 0x01, 0xBD,
+ 0x88, 0x52, 0xD1, 0xC9, 0x00, 0xCE, 0xC9, 0xBB, 0x1B, 0xC6, 0xA0, 0x90, 0x23, 0xF1, 0x11, 0xDD, 0x40, 0x0A, 0x17, 0xE9,
+ 0xC3, 0x3B, 0x1B, 0xA1, 0x7B, 0x98, 0x93, 0x0E, 0x8C, 0xF4, 0x0D, 0x81, 0xC3, 0x0C, 0xC1, 0x09, 0x9B, 0x7C, 0x66, 0xCE,
+ 0x98, 0xE1, 0x96, 0x66, 0xA2, 0x20, 0xF2, 0x8C, 0x39, 0x74, 0x2E, 0x39, 0x06, 0x96, 0x5C, 0xF3, 0xE2, 0xF3, 0xCF, 0xD3,
+ 0xB6, 0x76, 0xF0, 0x3C, 0xC1, 0x22, 0xA5, 0x77, 0x78, 0xAD, 0x5E, 0x2B, 0x20, 0x5B, 0x5E, 0x38, 0x96, 0x38, 0x5A, 0xDC,
+ 0x6E, 0xB7, 0x59, 0x23, 0xA7, 0x2C, 0xDD, 0xB2, 0xCA, 0x2C, 0xCC, 0xB6, 0x49, 0x6C, 0x93, 0x4A, 0x7A, 0x85, 0xC6, 0x15,
+ 0xE8, 0x41, 0xD1, 0x8E, 0x65, 0xCC, 0x89, 0x1A, 0x0A, 0xF2, 0x4B, 0x69, 0xF6, 0x31, 0x9B, 0x62, 0x0C, 0x7E, 0x68, 0xD7,
+ 0x15, 0x30, 0xD8, 0x99, 0xCB, 0x92, 0xFB, 0x4A, 0x91, 0x4F, 0xF7, 0xD4, 0x6C, 0x86, 0x35, 0xFF, 0x9A, 0x0B, 0x61, 0x00,
+ 0x7D, 0xD9, 0xFA, 0x4A, 0x3F, 0x30, 0x28, 0x7F, 0x4A, 0xB2, 0xAA, 0x91, 0xB5, 0x8C, 0x71, 0xC4, 0xF6, 0x45, 0x2B, 0xCE,
+ 0x66, 0xAB, 0x11, 0x1D, 0x18, 0xCE, 0x96, 0x2C, 0xDD, 0x88, 0x42, 0x88, 0x36, 0x94, 0x02, 0x48, 0x02, 0x6E, 0x89, 0xE0,
+ 0x8E, 0xB6, 0x9D, 0xEE, 0xAE, 0x0E, 0xAB, 0xB5, 0xFF, 0x1E, 0x04, 0xDA, 0xA2, 0x00, 0x7A, 0x7F, 0x94, 0x48, 0xA4, 0x92,
+ 0x7C, 0x78, 0x40, 0x09, 0x4E, 0x27, 0xDF, 0x92, 0x7A, 0xCE, 0x99, 0x67, 0x91, 0x0E, 0xA1, 0x03, 0xD3, 0xDA, 0x73, 0xC8,
+ 0xA9, 0xD6, 0xFC, 0x15, 0x55, 0x74, 0xD9, 0x60, 0xE8, 0xA4, 0x86, 0xAE, 0x62, 0xB4, 0x4C, 0xB5, 0x0F, 0xEA, 0x05, 0x82,
+ 0xD3, 0x84, 0x7D, 0xA4, 0x37, 0x65, 0xE2, 0x87, 0x09, 0x09, 0x7E, 0xCC, 0xF1, 0x25, 0x3B, 0x9A, 0xC5, 0x7E, 0xFF, 0x19,
+ 0xB4, 0xC7, 0x09, 0x45, 0x9C, 0x47, 0xC4, 0x56, 0x35, 0x4E, 0x2F, 0xA1, 0x42, 0xA4, 0x24, 0xEA, 0x6E, 0xED, 0xAE, 0xAF,
+ 0xA8, 0x97, 0x49, 0x70, 0x64, 0x02, 0xCD, 0x12, 0x23, 0x7D, 0x67, 0xB8, 0x6F, 0x33, 0xAE, 0x93, 0xBD, 0x41, 0xBD, 0x6D,
+ 0x94, 0x0E, 0xD4, 0xCC, 0x9D, 0xA5, 0x71, 0x55, 0xEF, 0x9E, 0x2A, 0xBD, 0xF1, 0xCE, 0x35, 0xA3, 0x43, 0xA5, 0x93, 0x65,
+ 0x3D, 0xC3, 0x4D, 0xFF, 0x9D, 0x2E, 0x8A, 0x66, 0xA2, 0xD1, 0x81, 0xA2, 0x15, 0xC9, 0x85, 0x5C, 0x9A, 0x8D, 0x42, 0xD0,
+ 0x48, 0x7D, 0x10, 0x00, 0xFF, 0x40, 0x86, 0xE0, 0xE4, 0x42, 0x34, 0x64, 0x98, 0xE5, 0x2E, 0x98, 0x2E, 0x65, 0x2A, 0xAE,
+ 0xC0, 0x07, 0x6B, 0x6E, 0xE8, 0xA4, 0x44, 0x9A, 0xE3, 0x3B, 0x97, 0x69, 0x0C, 0x6D, 0x09, 0xD9, 0xD6, 0x0A, 0x51, 0x7E,
+ 0xC1, 0x88, 0x0E, 0x2C, 0xA6, 0x5B, 0xF9, 0x9E, 0xF2, 0x42, 0xAA, 0x10, 0x53, 0xB2, 0x7A, 0x73, 0x76, 0xF5, 0x1B, 0x1B,
+ 0x24, 0xA5, 0x43, 0x65, 0x06, 0xC5, 0xAA, 0x03, 0x4D, 0xBD, 0x24, 0xBB, 0x9D, 0x35, 0x4F, 0x5B, 0x17, 0x74, 0x9F, 0x52,
+ 0xE2, 0x12, 0x38, 0x77, 0xB8, 0xB7, 0x7B, 0x19, 0x7B, 0x1A, 0x68, 0xE1, 0x91, 0x68, 0xD1, 0xC7, 0x25, 0x18, 0x40, 0x45,
+ 0x0C, 0x09, 0x08, 0xE3, 0x11, 0x0D, 0x2A, 0x8E, 0x4B, 0x2D, 0x90, 0x7D, 0x89, 0x5F, 0xB6, 0x7C, 0x94, 0x64, 0x38, 0x86,
+ 0x12, 0xFC, 0x25, 0x42, 0x3F, 0x45, 0xA2, 0xE9, 0x6C, 0x78, 0x73, 0x50, 0x5E, 0x37, 0xBC, 0x99, 0x17, 0x74, 0x77, 0x80,
+ 0x4A, 0x0E, 0x3A, 0xC2, 0xE6, 0x70, 0x48, 0x06, 0xEC, 0x01, 0xD6, 0x83, 0x86, 0xDC, 0x21, 0x9F, 0x04, 0x80, 0xC8, 0x85,
+ 0xA6, 0x35, 0x14, 0x10, 0x48, 0x5F, 0x81, 0x84, 0x8F, 0x31, 0xA7, 0x9C, 0xE3, 0xE1, 0x17, 0xC2, 0xC9, 0x05, 0x70, 0xBC,
+ 0x96, 0x0C, 0xAE, 0x66, 0x5A, 0x00, 0xAD, 0x85, 0x36, 0x1C, 0x4D, 0x21, 0x9C, 0xC3, 0x9B, 0xE3, 0x7B, 0x43, 0xAB, 0x7A,
+ 0x80, 0x54, 0x49, 0xA3, 0x1D, 0x42, 0x4B, 0x6E, 0x5D, 0xF6, 0x57, 0x5A, 0x2B, 0x8D, 0xB8, 0x85, 0xD9, 0xC4, 0xC9, 0x3F,
+ 0x55, 0xE9, 0x43, 0x02, 0x97, 0xF3, 0x17, 0xE6, 0x91, 0x7A, 0x4A, 0x0D, 0x48, 0x04, 0x9A, 0x33, 0x63, 0xAA, 0x1E, 0xB7,
+ 0x47, 0x75, 0xC2, 0x97, 0x57, 0x32, 0xF1, 0x87, 0xBA, 0x8A, 0xDC, 0xB5, 0xE5, 0x27, 0x66, 0x31, 0x67, 0x01, 0x24, 0x78,
+ 0x5C, 0x41, 0x62, 0x83, 0x47, 0xEE, 0x36, 0x69, 0xB6, 0x9A, 0xB0, 0x31, 0xCC, 0xC7, 0x15, 0x77, 0x18, 0x15, 0x96, 0x0D,
+ 0xAA, 0x56, 0x07, 0x58, 0xB7, 0x3E, 0x08, 0xDB, 0xCE, 0x71, 0x0B, 0x8F, 0xAF, 0x08, 0x97, 0x42, 0xAC, 0x5B, 0x46, 0x02,
+ 0x9C, 0x9E, 0x61, 0x44, 0xAF, 0xB9, 0xBF, 0xEC, 0xB2, 0x53, 0xE9, 0x9B, 0x23, 0xCE, 0xA4, 0xA9, 0x6B, 0x9E, 0x13, 0xC5,
+ 0xC1, 0xE2, 0x12, 0xA2, 0x17, 0xBA, 0xFB, 0xB9, 0x8D, 0xA4, 0x14, 0x82, 0x90, 0x05, 0xE7, 0x7E, 0x18, 0xE4, 0x99, 0x03,
+ 0x49, 0x82, 0x9D, 0xE2, 0x6C, 0x1E, 0xE1, 0xA0, 0x45, 0x1C, 0x42, 0xBE, 0x4A, 0xA2, 0x67, 0x98, 0x34, 0x9F, 0x0F, 0x8F,
+ 0xEF, 0x83, 0x09, 0x4A, 0xEC, 0x39, 0x19, 0x8B, 0xA4, 0x31, 0xE0, 0x91, 0xA9, 0x0A, 0x17, 0x41, 0x47, 0xFA, 0x3B, 0xD2,
+ 0x37, 0x7D, 0x7C, 0x93, 0xB0, 0x9F, 0x14, 0x1E, 0xBC, 0x09, 0x12, 0x4A, 0xF5, 0x92, 0x56, 0x4C, 0x07, 0x49, 0x0A, 0x6F,
+ 0xDE, 0x1B, 0x13, 0x1E, 0x3A, 0x86, 0x34, 0xCC, 0xD9, 0xFC, 0xC4, 0x57, 0xF4, 0xC9, 0xD9, 0x5D, 0x1D, 0x43, 0x20, 0x27,
+ 0x61, 0x0C, 0x25, 0x81, 0xA2, 0x69, 0x09, 0xF2, 0x65, 0xB8, 0x58, 0x92, 0x57, 0xEE, 0xE8, 0x43, 0x96, 0x7B, 0x72, 0x88,
+ 0x05, 0x28, 0xC1, 0xA2, 0xFF, 0xD5, 0xE4, 0x2D, 0x45, 0x1B, 0x3C, 0xB1, 0xD7, 0x5E, 0x4B, 0x77, 0xDB, 0xB6, 0xA2, 0x24,
+ 0xE7, 0xDA, 0x94, 0xEC, 0x23, 0x51, 0xD7, 0x90, 0xF1, 0x0D, 0xCD, 0xCF, 0xB4, 0x28, 0xCC, 0x84, 0x4F, 0x27, 0x79, 0x52,
+ 0xD6, 0x63, 0x98, 0xA6, 0x1C, 0x53, 0xB7, 0xA5, 0xFC, 0xA1, 0x3D, 0xC9, 0xAE, 0xA6, 0xF2, 0xA2, 0x0A, 0x3E, 0x61, 0x5B,
+ 0x43, 0x37, 0xFE, 0xCE, 0x4E, 0x79, 0xE6, 0xFE, 0xD2, 0xF8, 0x9C, 0x78, 0x11, 0x79, 0xBA, 0x6C, 0x7D, 0xE0, 0x6C, 0x14,
+ 0x90, 0xDA, 0xCF, 0x1F, 0x3B, 0xD5, 0x3F, 0x74, 0xDA, 0x2F, 0x27, 0xE9, 0x40, 0x48, 0x9F, 0xEE, 0xD0, 0x51, 0x2F, 0x88,
+ 0xBA, 0xB6, 0x7F, 0x60, 0x11, 0xC9, 0xE6, 0x4E, 0xF2, 0x04, 0xB7, 0xB6, 0xB0, 0xCD, 0x0C, 0xAB, 0x03, 0xD3, 0xB7, 0xF0,
+ 0x45, 0xBE, 0xE7, 0x9D, 0x2B, 0x93, 0x4E, 0x42, 0x05, 0x5F, 0xEE, 0xCB, 0xEE, 0xE5, 0xBE, 0x9E, 0x15, 0x75, 0x15, 0x2D,
+ 0x14, 0xF0, 0xD8, 0x1C, 0x86, 0xCB, 0xB1, 0xB4, 0xB8, 0x82, 0x7A, 0x06, 0xEF, 0xD3, 0x51, 0x27, 0xBE, 0x35, 0x52, 0xC7,
+ 0x18, 0x8E, 0x8C, 0xB9, 0xEB, 0xEA, 0xC0, 0x86, 0x50, 0x97, 0x15, 0xAC, 0x7B, 0x16, 0x14, 0x58, 0xC2, 0x42, 0xCC, 0x16,
+ 0x06, 0x17, 0x5E, 0x04, 0xDF, 0x21, 0x8E, 0xB9, 0xF4, 0x55, 0xEF, 0xB5, 0xE9, 0xD6, 0x2A, 0x29, 0x4F, 0x68, 0x74, 0x66,
+ 0xD1, 0xEB, 0x97, 0xB2, 0x4B, 0x1E, 0x34, 0x5D, 0x14, 0x9D, 0x74, 0xB3, 0x4C, 0x73, 0x74, 0xA4, 0x97, 0x22, 0xEF, 0xC9,
+ 0x2F, 0xF0, 0xD2, 0x09, 0x93, 0x92, 0x12, 0x52, 0xD9, 0x70, 0xCA, 0xA6, 0x81, 0xBE, 0xCE, 0x25, 0x1C, 0xBE, 0xCE, 0x4E,
+ 0xF1, 0xB6, 0xBA, 0x4E, 0xDE, 0x3D, 0xE3, 0x17, 0xE6, 0xBD, 0xC4, 0x67, 0x9A, 0xCC, 0x4E, 0x69, 0xE6, 0x29, 0x77, 0x6D,
+ 0x10, 0x36, 0xB0, 0x26, 0xB0, 0x63, 0x8D, 0xDD, 0x1A, 0xB8, 0xC5, 0x1C, 0xD4, 0xA0, 0xBF, 0xB5, 0x0D, 0x35, 0xAB, 0x03,
+ 0x5B, 0x30, 0xDB, 0xB2, 0x4E, 0x7B, 0x47, 0x96, 0x5D, 0x20, 0x85, 0xC2, 0xD4, 0x69, 0x4C, 0x4C, 0xD9, 0x0C, 0xC2, 0x90,
+ 0x8E, 0x3F, 0xE4, 0x6B, 0x8C, 0xD9, 0xE3, 0x0E, 0xCF, 0x9E, 0x6F, 0x5C, 0xE0, 0x5B, 0xD2, 0x38, 0xDA, 0x87, 0x33, 0xCA,
+ 0xF9, 0xBC, 0x7C, 0xD9, 0x83, 0xF4, 0x51, 0x4C, 0xDC, 0xD2, 0x13, 0x74, 0x3C, 0xE4, 0xB0, 0x11, 0x8A, 0x98, 0x8F, 0x2B,
+ 0x6B, 0x91, 0x78, 0x8C, 0xC3, 0x8B, 0x37, 0x47, 0xB3, 0x1B, 0x29, 0x3B, 0xE8, 0x14, 0x38, 0xB2, 0xDF, 0x5C, 0xC6, 0x14,
+ 0xA1, 0xCE, 0x28, 0x46, 0x03, 0xAC, 0xA4, 0xF6, 0x86, 0xCA, 0x6A, 0xC6, 0x78, 0x96, 0x55, 0x29, 0xE0, 0xA3, 0x8D, 0x75,
+ 0x3B, 0x53, 0x95, 0x51, 0x9F, 0x9F, 0x3B, 0xE5, 0xF0, 0x13, 0x14, 0x72, 0x86, 0x33, 0x9C, 0xE5, 0xE8, 0x27, 0x4D, 0x05,
+ 0xDE, 0x22, 0xD3, 0x47, 0x76, 0x3E, 0xCB, 0x96, 0x8D, 0x8E, 0xC5, 0x8B, 0x3A, 0x06, 0x98, 0x56, 0xF2, 0x7D, 0x9C, 0x6C,
+ 0xEA, 0xC3, 0x09, 0x68, 0x4E, 0x10, 0x12, 0x01, 0x22, 0x6D, 0xF4, 0x5B, 0x20, 0xD2, 0xD0, 0x67, 0x21, 0x88, 0xC0, 0x8E,
+ 0x0E, 0xA2, 0xFC, 0x46, 0x02, 0x2F, 0x56, 0xEF, 0x55, 0xB6, 0xD7, 0xE4, 0xBD, 0x75, 0x93, 0xBD, 0x1E, 0xDB, 0xB1, 0x30,
+ 0x0D, 0x28, 0xC1, 0xA2, 0xD9, 0xFE, 0x42, 0xEF, 0x9D, 0xE9, 0x2B, 0x04, 0xA7, 0xC9, 0xD3, 0x74, 0xE8, 0x4F, 0x5B, 0x5B,
+ 0x09, 0x83, 0x6C, 0x8A, 0xE9, 0x6A, 0xEA, 0xE9, 0x69, 0x1F, 0xE2, 0xC4, 0x07, 0xF6, 0x67, 0x00, 0x4D, 0xD3, 0xC6, 0x4F,
+ 0x32, 0xFD, 0x41, 0x39, 0xD1, 0x08, 0x8F, 0xD1, 0x45, 0x35, 0x43, 0x80, 0xD1, 0x60, 0xA6, 0x1F, 0xC1, 0xC7, 0x63, 0xD4,
+ 0x4E, 0x7B, 0xC7, 0xA9, 0x9E, 0x3C, 0xE3, 0x21, 0x45, 0x1E, 0xE1, 0x14, 0x29, 0xBD, 0x57, 0xC9, 0xC3, 0x2E, 0x83, 0xD5,
+ 0xBD, 0x70, 0xE8, 0xC4, 0x1A, 0x0F, 0xC5, 0x21, 0xA4, 0x7F, 0x62, 0x0A, 0x2E, 0xB7, 0x00, 0x96, 0x81, 0x81, 0x6C, 0xA2,
+ 0x37, 0xF3, 0x23, 0x33, 0x52, 0xD6, 0x8F, 0x2D, 0x2E, 0x29, 0x2D, 0x17, 0xD9, 0x80, 0xC6, 0xB4, 0x9D, 0xFE, 0x33, 0x9C,
+ 0x5F, 0xD2, 0x50, 0xCE, 0xD5, 0x85, 0xCA, 0x40, 0xDE, 0x4D, 0x2E, 0xC8, 0x16, 0x7E, 0xA6, 0x95, 0x7A, 0xD4, 0x8D, 0x1E,
+ 0x3B, 0xA1, 0x7E, 0x6D, 0xCB, 0x63, 0xAF, 0x64, 0x2D, 0xC2, 0x8C, 0x98, 0xB9, 0xF9, 0x5F, 0x72, 0xAC, 0x87, 0x69, 0x99,
+ 0xA9, 0x97, 0x8C, 0x29, 0xD9, 0x6C, 0x5E, 0x64, 0xB1, 0xC8, 0xB6, 0x2B, 0xB4, 0x1D, 0x6B, 0x4E, 0x08, 0x93, 0xD1, 0x1B,
+ 0xA6, 0x00, 0x19, 0x00, 0xDA, 0x80, 0x50, 0x37, 0x7C, 0x7C, 0xA0, 0x45, 0x31, 0x1A, 0xE2, 0xCF, 0xD9, 0x7B, 0xCB, 0xE1,
+ 0x19, 0x55, 0xC5, 0x55, 0xA4, 0x0F, 0x0C, 0xF2, 0x78, 0x82, 0x39, 0xCD, 0xCB, 0x99, 0x93, 0x8F, 0x16, 0xBD, 0xC7, 0x0F,
+ 0x64, 0x8B, 0x88, 0x96, 0xAC, 0x9C, 0xF4, 0x69, 0xB6, 0x2A, 0x58, 0x5E, 0xAA, 0x5E, 0x48, 0x47, 0x41, 0x4F, 0x56, 0x30,
+ 0xA2, 0xB7, 0x4B, 0xE3, 0xAD, 0x76, 0x3D, 0x47, 0x96, 0x6C, 0x92, 0x36, 0xDA, 0xC2, 0x75, 0x9C, 0xA2, 0x57, 0x76, 0x15,
+ 0x68, 0xFE, 0x23, 0x2A, 0x31, 0x07, 0x68, 0xE8, 0xB2, 0x75, 0xBC, 0x8A, 0x52, 0x0A, 0x31, 0xDF, 0x79, 0x1C, 0x87, 0x88,
+ 0x9B, 0x6B, 0xA6, 0x2B, 0xC7, 0xA3, 0x91, 0x9A, 0xCF, 0xF2, 0xE5, 0x43, 0xE2, 0x07, 0x7C, 0x6C, 0x93, 0x11, 0x8D, 0x38,
+ 0x81, 0x0D, 0x71, 0x5E, 0x73, 0xF6, 0x26, 0xFE, 0x9A, 0xF6, 0x48, 0x00, 0x70, 0xB9, 0x40, 0x7A, 0xD7, 0xA9, 0xC5, 0xDC,
+ 0x0B, 0xEF, 0x9F, 0x7B, 0x2B, 0x29, 0x7D, 0x7D, 0xB7, 0x89, 0x2D, 0x63, 0x09, 0xBF, 0xD9, 0xB3, 0x51, 0xC3, 0xEC, 0x59,
+ 0x12, 0x99, 0xB1, 0x09, 0x26, 0xA3, 0xCA, 0x9D, 0xE1, 0x07, 0x72, 0xD4, 0xE4, 0xF1, 0x72, 0x5C, 0x1D, 0xAF, 0x80, 0x81,
+ 0xF3, 0xC5, 0x33, 0x1C, 0x65, 0x2A, 0xE9, 0x83, 0xAF, 0x58, 0x8C, 0xEE, 0x16, 0x70, 0x6F, 0x1D, 0x82, 0xB0, 0xA2, 0x93,
+ 0x0F, 0xC2, 0x22, 0x54, 0x3A, 0x0B, 0x36, 0xB6, 0x5C, 0xEB, 0x6D, 0xB4, 0x0A, 0xDD, 0x09, 0xAD, 0x1E, 0xBE, 0xFC, 0x29,
+ 0x44, 0xEF, 0x12, 0xEA, 0xB5, 0xE1, 0xA3, 0x1B, 0x1F, 0x74, 0x49, 0x12, 0x82, 0x67, 0x08, 0xEB, 0x46, 0xA4, 0x4F, 0x37,
+ 0x54, 0xA5, 0x6F, 0x9D, 0x40, 0xDE, 0xB1, 0x41, 0x21, 0x4D, 0xC0, 0x99, 0xCE, 0x63, 0x5C, 0x7C, 0x3C, 0xD8, 0x25, 0x4A,
+ 0x8C, 0xC0, 0xD9, 0xF9, 0x9C, 0x66, 0x6F, 0xC5, 0x74, 0x02, 0xB2, 0xE8, 0xC0, 0xD3, 0xFA, 0x57, 0x3F, 0xD0, 0x57, 0x73,
+ 0x9A, 0xF2, 0xE6, 0x5A, 0x01, 0x4A, 0x27, 0xD2, 0xD2, 0x31, 0x5E, 0x10, 0x44, 0x6A, 0x24, 0x77, 0xDD, 0x69, 0x9D, 0x37,
+ 0x0B, 0xB2, 0xD7, 0xB6, 0x53, 0x34, 0xA6, 0x65, 0xA4, 0x31, 0xD9, 0x0C, 0xD7, 0x84, 0x8C, 0x23, 0x47, 0x21, 0x4D, 0x57,
+ 0xFE, 0xCB, 0x64, 0x06, 0x79, 0x32, 0xA7, 0x3E, 0x13, 0x96, 0xA4, 0x28, 0x83, 0xE1, 0x33, 0xE6, 0x42, 0xE8, 0xE2, 0x6D,
+ 0x93, 0xC5, 0x3A, 0x07, 0xAC, 0x29, 0x22, 0xCD, 0x95, 0xBA, 0xD2, 0x65, 0x68, 0x3B, 0xD0, 0x24, 0x3A, 0xD0, 0x2A, 0x49,
+ 0x8D, 0x5A, 0xF3, 0x16, 0x79, 0xC4, 0xC4, 0x52, 0xBB, 0x1C, 0x47, 0x31, 0xB3, 0x53, 0x39, 0x9A, 0xC4, 0xD1, 0x87, 0x1C,
+ 0xCD, 0x11, 0x11, 0x10, 0x24, 0xD3, 0x22, 0x13, 0x63, 0x95, 0xD9, 0x61, 0xCD, 0xDF, 0x99, 0xC3, 0x38, 0xF9, 0x0F, 0xD9,
+ 0x67, 0x90, 0x4E, 0x53, 0x9D, 0x96, 0x96, 0x6D, 0x09, 0x2C, 0x90, 0xDD, 0x25, 0x0A, 0x44, 0x7C, 0x36, 0x3E, 0x18, 0x3A,
+ 0xA0, 0x16, 0xA5, 0x51, 0x4C, 0xC4, 0x33, 0x6C, 0x14, 0x61, 0x24, 0x9A, 0x13, 0xFB, 0xA6, 0x31, 0xA1, 0x14, 0xFE, 0x8B,
+ 0x3B, 0x1B, 0xF0, 0xF6, 0xE9, 0x1C, 0x5B, 0xF6, 0x60, 0x0E, 0xA5, 0x16, 0xA2, 0x57, 0x4D, 0xA8, 0xCF, 0x49, 0xBC, 0x75,
+ 0xFD, 0xE0, 0x94, 0xD8, 0xE5, 0x3C, 0xC7, 0xD3, 0x73, 0x55, 0x53, 0x55, 0xF8, 0x56, 0xDE, 0xB5, 0xB3, 0xE3, 0x63, 0xE6,
+ 0x1C, 0xBA, 0xD9, 0x44, 0x05, 0x48, 0xB1, 0x4A, 0xDF, 0x3B, 0xE3, 0xAC, 0x33, 0xCF, 0xE4, 0x20, 0x4D, 0xC3, 0xE3, 0x13,
+ 0xF6, 0xC6, 0x84, 0x89, 0x62, 0x34, 0x72, 0xC4, 0xA0, 0x97, 0xAC, 0xA6, 0xA3, 0x0E, 0x3F, 0x07, 0x97, 0x24, 0x42, 0x04,
+ 0xF8, 0x58, 0x41, 0xE3, 0x10, 0xA6, 0x99, 0xEC, 0x88, 0x5E, 0x65, 0x6D, 0xEF, 0x6A, 0x5B, 0xDF, 0xBB, 0x5C, 0x71, 0x43,
+ 0xE9, 0x96, 0x52, 0x4B, 0x3D, 0x40, 0x27, 0x47, 0x0E, 0xE1, 0x40, 0x20, 0x88, 0x91, 0x9E, 0x0C, 0xB5, 0x19, 0xF8, 0xA9,
+ 0x0E, 0xBC, 0xB9, 0xA0, 0xB7, 0x2D, 0xA3, 0x89, 0x87, 0x30, 0x4A, 0xA6, 0xCD, 0x20, 0x24, 0x38, 0x1F, 0x89, 0x7D, 0x78,
+ 0x67, 0x9E, 0x41, 0xAB, 0x52, 0x28, 0x78, 0xC6, 0xA6, 0x24, 0x2B, 0xD5, 0x61, 0x99, 0x71, 0x05, 0x5B, 0xEF, 0x8C, 0xD4,
+ 0x68, 0x7E, 0xC2, 0xC3, 0x90, 0x42, 0xD7, 0x08, 0x5D, 0x8E, 0x88, 0x12, 0x11, 0xCC, 0x93, 0x67, 0xB2, 0x29, 0xE3, 0x54,
+ 0x4D, 0x9B, 0x93, 0x43, 0xB1, 0x3E, 0x4D, 0x11, 0x52, 0x27, 0x39, 0x6A, 0x25, 0xFA, 0xAF, 0x9D, 0x8D, 0x37, 0xBE, 0xB3,
+ 0x67, 0x31, 0xDE, 0x44, 0x0D, 0xB2, 0x3D, 0x70, 0x32, 0xEF, 0x19, 0xBB, 0x41, 0xF4, 0xEA, 0x01, 0xB8, 0x2F, 0xEA, 0x21,
+ 0x8C, 0xB9, 0x3A, 0x10, 0x3F, 0xD0, 0x1D, 0x22, 0x06, 0x8E, 0x9C, 0x53, 0x95, 0x54, 0xB5, 0xFF, 0x17, 0x16, 0x99, 0xD1,
+ 0x86, 0x7F, 0x90, 0x34, 0x08, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82
+};
+
+NPT_UInt8 Platinum_48x48_jpg[3041] =
+{
+ 0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00,
+ 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xDB, 0x00, 0x43, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0xFF, 0xC0,
+ 0x00, 0x11, 0x08, 0x00, 0x30, 0x00, 0x30, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00,
+ 0x1D, 0x00, 0x00, 0x01, 0x04, 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06,
+ 0x07, 0x08, 0x09, 0x03, 0x04, 0x01, 0x02, 0x0A, 0xFF, 0xC4, 0x00, 0x31, 0x10, 0x00, 0x01, 0x04, 0x02, 0x01, 0x03, 0x02,
+ 0x05, 0x03, 0x02, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x11, 0x08, 0x12, 0x21,
+ 0x00, 0x31, 0x09, 0x13, 0x14, 0x41, 0x71, 0x15, 0x51, 0x61, 0x16, 0x22, 0x17, 0x32, 0x81, 0x91, 0xA1, 0xC1, 0xF0, 0xFF,
+ 0xC4, 0x00, 0x1A, 0x01, 0x00, 0x02, 0x03, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x03, 0x00, 0x01, 0x04, 0x05, 0x06, 0xFF, 0xC4, 0x00, 0x30, 0x11, 0x01, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04,
+ 0x06, 0x01, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x11, 0x21, 0x00, 0x03, 0x31, 0x12, 0x41, 0x51, 0x61, 0x71,
+ 0x04, 0x13, 0x22, 0x91, 0x32, 0x42, 0x81, 0xA1, 0xD1, 0xF0, 0xB1, 0x14, 0x15, 0x23, 0xE1, 0xF1, 0xC1, 0xFF, 0xDA, 0x00,
+ 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3F, 0x00, 0xAF, 0x09, 0xB2, 0x4E, 0x79, 0xFE, 0xF5, 0xF6, 0xFD,
+ 0xFE, 0xC9, 0xE7, 0xF7, 0xF2, 0xBF, 0xBF, 0xB7, 0x1F, 0xB2, 0xF8, 0xF5, 0xEB, 0x19, 0xA3, 0xFF, 0x00, 0x55, 0xFB, 0x3F,
+ 0xCE, 0x47, 0xB6, 0xBB, 0x44, 0x26, 0xF8, 0x3C, 0x77, 0xB7, 0xD8, 0xE3, 0xFF, 0x00, 0xBE, 0x71, 0xA1, 0x13, 0xE4, 0x6B,
+ 0xC2, 0xA7, 0x7F, 0xF1, 0xC7, 0x3C, 0xFB, 0xAF, 0xF0, 0xA8, 0xAB, 0xED, 0xCF, 0xB7, 0xB2, 0x7F, 0x3E, 0x85, 0x92, 0x94,
+ 0xF9, 0xBF, 0x6E, 0x7F, 0x9F, 0xDB, 0x45, 0xF2, 0xB8, 0xB9, 0x57, 0xB6, 0x5F, 0xD6, 0xC7, 0xD3, 0xB3, 0xDF, 0xC6, 0xB0,
+ 0x63, 0x7B, 0x6E, 0xA7, 0x02, 0xCE, 0xF0, 0x5B, 0xEC, 0x90, 0x2A, 0xEB, 0x4C, 0x70, 0x4C, 0xCF, 0x17, 0x5B, 0xC0, 0x2E,
+ 0x7E, 0x72, 0xD2, 0x95, 0x59, 0x25, 0xD8, 0x51, 0x4C, 0x2D, 0xCB, 0x87, 0x7C, 0x73, 0xC7, 0x48, 0x5B, 0xE4, 0x88, 0x5B,
+ 0xA9, 0xA0, 0x7B, 0x25, 0x82, 0xA2, 0x73, 0x49, 0x8D, 0xDD, 0xD0, 0xF9, 0xCD, 0xBD, 0x3A, 0x08, 0xF5, 0x74, 0xF5, 0x34,
+ 0xCA, 0xEB, 0xA6, 0xFE, 0x92, 0xF0, 0xD1, 0x68, 0xAD, 0x60, 0xCD, 0x78, 0x93, 0x08, 0x46, 0x49, 0x77, 0xD3, 0x22, 0x2F,
+ 0x28, 0x87, 0x8E, 0xCD, 0x7E, 0x1A, 0x39, 0x0C, 0xE1, 0xD4, 0xA9, 0xF8, 0x8C, 0xF5, 0x17, 0xD3, 0x36, 0xD7, 0xEA, 0x02,
+ 0x3B, 0x2E, 0x98, 0xB0, 0xD8, 0xF5, 0xDE, 0x2E, 0x4E, 0x0D, 0x8C, 0x4D, 0x97, 0x61, 0x62, 0x86, 0x2D, 0x78, 0x98, 0xB6,
+ 0xC9, 0x81, 0x85, 0x09, 0x9A, 0x63, 0xE2, 0x08, 0x13, 0xBE, 0x82, 0x16, 0xD7, 0x12, 0xC0, 0x60, 0x99, 0x41, 0x64, 0x22,
+ 0x12, 0x4B, 0x26, 0xB0, 0x84, 0x61, 0xBE, 0xB5, 0xF1, 0x22, 0x36, 0x9D, 0xCD, 0x8B, 0xDB, 0xDD, 0x9F, 0x54, 0x8B, 0x32,
+ 0xAF, 0x48, 0x35, 0x9F, 0x5A, 0xFF, 0x00, 0x26, 0x68, 0xD0, 0x7C, 0x3F, 0xD1, 0xB7, 0x5B, 0x8F, 0x54, 0x99, 0x2C, 0x5B,
+ 0xB7, 0xA1, 0x31, 0x27, 0x9A, 0xBA, 0xE1, 0x57, 0x25, 0x95, 0x9D, 0x57, 0xB4, 0xFB, 0x50, 0x59, 0xAA, 0x23, 0xC4, 0x5B,
+ 0x89, 0x43, 0x1E, 0x41, 0x06, 0x52, 0x6D, 0xA9, 0x19, 0xBF, 0xEB, 0x56, 0xEE, 0x9E, 0x7C, 0x5A, 0x4C, 0x7C, 0x10, 0xC2,
+ 0xC5, 0xBF, 0xA6, 0xDC, 0x3B, 0x28, 0x20, 0x88, 0x7B, 0xD6, 0x17, 0x76, 0x99, 0x14, 0x46, 0x4F, 0x78, 0x64, 0xA4, 0xC9,
+ 0x4F, 0x30, 0xE3, 0x55, 0xD7, 0x45, 0x21, 0x57, 0xF3, 0xA5, 0xD6, 0xCB, 0x21, 0xC5, 0x21, 0x5E, 0x39, 0xF5, 0xEC, 0x1D,
+ 0xF2, 0xF9, 0xD1, 0xFC, 0xDC, 0xDB, 0x17, 0x25, 0x55, 0x1F, 0x8B, 0xA9, 0x3A, 0xBA, 0xB9, 0xC9, 0x8A, 0xA2, 0x3F, 0x7A,
+ 0xD0, 0x72, 0x2E, 0x5C, 0xE4, 0x54, 0xEF, 0xE3, 0xF0, 0xBF, 0x9F, 0x0B, 0xCF, 0x3C, 0xFB, 0xF0, 0xBF, 0xC7, 0x8F, 0xB7,
+ 0xA2, 0x77, 0x1F, 0x57, 0xC5, 0xBE, 0xBF, 0xC7, 0xDE, 0x83, 0xD7, 0x53, 0xE6, 0xCB, 0xC0, 0x79, 0xE7, 0x3C, 0xFA, 0xDF,
+ 0x7F, 0x2D, 0xE9, 0x4E, 0xEB, 0xBE, 0xEF, 0x1D, 0xEE, 0x55, 0x5F, 0x64, 0xF2, 0xBC, 0xFF, 0x00, 0x3E, 0xEA, 0xBF, 0x9E,
+ 0x3D, 0x39, 0xDD, 0x2B, 0xB6, 0x78, 0x6F, 0xFB, 0x79, 0xFF, 0x00, 0xBF, 0x3A, 0x63, 0x28, 0x1D, 0xFF, 0x00, 0x46, 0xBC,
+ 0xF1, 0x87, 0xD8, 0xF3, 0xCE, 0x81, 0xDE, 0x5F, 0x97, 0x52, 0x34, 0x85, 0x7D, 0x34, 0xB2, 0xAC, 0x6C, 0x49, 0x5B, 0x0A,
+ 0xB9, 0x62, 0x74, 0xCD, 0x45, 0x45, 0x56, 0x31, 0xF2, 0x27, 0x6B, 0x16, 0x46, 0xA2, 0xB5, 0x8F, 0x7A, 0x2B, 0x11, 0xEA,
+ 0xD5, 0x7A, 0xF6, 0xF7, 0x7A, 0x5C, 0xB7, 0x51, 0x29, 0xBF, 0xD8, 0xE3, 0xB6, 0x32, 0xE3, 0xD8, 0x78, 0xE3, 0x42, 0xEE,
+ 0x54, 0x8B, 0x8F, 0x39, 0xC9, 0x46, 0x2C, 0xA1, 0x30, 0xF7, 0x7B, 0xE0, 0xCE, 0xA5, 0x4C, 0xDD, 0x25, 0x33, 0xAA, 0xBD,
+ 0x39, 0x95, 0xEC, 0xBE, 0x92, 0x2D, 0xC8, 0xDC, 0x38, 0xBE, 0x3F, 0x57, 0x24, 0x5B, 0x23, 0x5C, 0x4E, 0xD1, 0x44, 0xDF,
+ 0x5A, 0x89, 0xF3, 0x8C, 0xD8, 0x6C, 0x63, 0xCE, 0x75, 0xF8, 0x8D, 0x8E, 0x7B, 0xEC, 0x74, 0x29, 0xE6, 0x54, 0x13, 0x63,
+ 0xE0, 0x23, 0xD9, 0x50, 0x10, 0x0C, 0x82, 0x1D, 0x7F, 0x51, 0x86, 0xCD, 0x2A, 0x0C, 0xEC, 0xB3, 0xDD, 0x37, 0x31, 0x3A,
+ 0x05, 0xA2, 0x47, 0xE1, 0x5A, 0xCC, 0x6D, 0xCC, 0x66, 0x19, 0xE9, 0x41, 0xBA, 0x4E, 0xA3, 0x3A, 0x09, 0x6E, 0x46, 0x69,
+ 0x19, 0xA6, 0xDC, 0xAE, 0x89, 0x52, 0xC2, 0x77, 0x76, 0x5F, 0xE5, 0x53, 0x20, 0xD2, 0xDD, 0x0C, 0xBB, 0x30, 0xFB, 0x33,
+ 0xA2, 0xFE, 0xA7, 0xF4, 0x4E, 0x33, 0xAD, 0xB7, 0xB6, 0xE8, 0xC1, 0x6D, 0x31, 0xAC, 0x77, 0x7C, 0x57, 0xD9, 0x9F, 0x40,
+ 0x4D, 0x8B, 0x25, 0x88, 0xC2, 0x2C, 0xF1, 0x70, 0x31, 0x7A, 0x3C, 0x88, 0xAB, 0x21, 0x64, 0x8A, 0x39, 0x42, 0x5B, 0xC3,
+ 0xE2, 0x75, 0xED, 0x63, 0xA7, 0x6B, 0x56, 0xC8, 0x12, 0x9C, 0x7C, 0x3D, 0xF0, 0x3D, 0x92, 0xBC, 0x46, 0xE5, 0x29, 0x75,
+ 0x12, 0x96, 0x19, 0x11, 0x15, 0x25, 0xD3, 0x1B, 0x6A, 0x8F, 0xC5, 0x48, 0xBC, 0xDB, 0xDA, 0xB4, 0xAD, 0xB8, 0x8F, 0x51,
+ 0x19, 0x12, 0x76, 0xC0, 0x91, 0x1B, 0x68, 0x55, 0x13, 0x17, 0x20, 0x39, 0x4E, 0x1E, 0xCF, 0x66, 0x78, 0x88, 0x08, 0x8D,
+ 0xA8, 0x43, 0xE0, 0x73, 0x7B, 0x93, 0xFC, 0xCA, 0x9E, 0x7C, 0xA2, 0x2A, 0x72, 0xBE, 0x15, 0xBC, 0xB5, 0x5A, 0xA8, 0x9E,
+ 0x55, 0x51, 0x5A, 0xEE, 0x38, 0x5E, 0x7D, 0x33, 0x06, 0x78, 0xFB, 0xFF, 0x00, 0xE2, 0xFE, 0xF5, 0xED, 0xA3, 0x62, 0xC2,
+ 0x87, 0x0B, 0xC6, 0x39, 0xE6, 0xDF, 0xB9, 0xC6, 0x39, 0xD2, 0x6C, 0x9B, 0x27, 0x35, 0x55, 0xBD, 0xDC, 0x2A, 0x73, 0xEF,
+ 0xCF, 0xDB, 0xF6, 0xE7, 0x85, 0x4F, 0x7F, 0x1F, 0xED, 0xC7, 0xAB, 0xD5, 0x6B, 0xAD, 0xCD, 0xF9, 0xC3, 0x04, 0x4C, 0x95,
+ 0xCA, 0xC5, 0x31, 0xB1, 0x48, 0xB0, 0x7C, 0xC7, 0x48, 0xD6, 0x2C, 0x88, 0xD5, 0x56, 0xA4, 0x8E, 0x85, 0x7E, 0x6B, 0x58,
+ 0xE5, 0x4E, 0xD7, 0xBE, 0x35, 0x49, 0x18, 0x8A, 0xAF, 0x8F, 0x87, 0xB5, 0x17, 0xD0, 0xCA, 0xE9, 0x4A, 0xB3, 0x25, 0x96,
+ 0x5F, 0xAF, 0x0D, 0x79, 0xA4, 0x6B, 0x87, 0x51, 0xF4, 0xE7, 0x15, 0x60, 0x9C, 0xF7, 0x1A, 0xBA, 0xF7, 0xFD, 0x1D, 0x3D,
+ 0x5B, 0x1B, 0xAC, 0x8D, 0x37, 0xB7, 0x75, 0x56, 0x3F, 0x8B, 0x1B, 0xD2, 0x81, 0x3A, 0x43, 0x75, 0x62, 0x21, 0x54, 0xD4,
+ 0xA6, 0x6F, 0xAD, 0x32, 0x28, 0xAD, 0xB5, 0x9E, 0xC9, 0xAF, 0x01, 0xB0, 0x86, 0x61, 0x59, 0xA6, 0x20, 0x7B, 0x88, 0x22,
+ 0x8F, 0x2F, 0x9C, 0x46, 0x3C, 0xD6, 0xE5, 0xD8, 0xBA, 0xE3, 0x01, 0x5B, 0xD8, 0x23, 0xD2, 0xFF, 0x00, 0x15, 0x26, 0x42,
+ 0x7E, 0xB4, 0x64, 0x9B, 0x8D, 0xB6, 0x4C, 0xEF, 0xD3, 0xF4, 0xCE, 0xB2, 0xFE, 0x19, 0xC7, 0xB7, 0x38, 0x94, 0x2B, 0xB1,
+ 0x2E, 0x35, 0x51, 0xDC, 0xDD, 0x16, 0x33, 0xFA, 0xE3, 0x27, 0x1D, 0x5D, 0x2F, 0x4B, 0xCD, 0xC5, 0xC3, 0x45, 0x62, 0x32,
+ 0x8B, 0xEE, 0x77, 0x79, 0xB4, 0x2E, 0x2D, 0x6B, 0xD3, 0x56, 0xB9, 0xA8, 0xEB, 0xFF, 0x00, 0x43, 0xF5, 0x8D, 0xAC, 0x31,
+ 0x5D, 0xA8, 0xFA, 0xC9, 0x29, 0x28, 0xF4, 0xFE, 0x30, 0xFD, 0x93, 0x26, 0xC3, 0xB2, 0xB0, 0x92, 0xF0, 0x31, 0xA6, 0x1E,
+ 0xD8, 0xB4, 0xC2, 0xC4, 0xD7, 0xB3, 0x4B, 0x8A, 0x0E, 0xD3, 0x4A, 0x2A, 0x07, 0x64, 0x97, 0x21, 0xA0, 0xD6, 0xA7, 0x63,
+ 0x76, 0xAD, 0x46, 0x59, 0x9D, 0x56, 0x43, 0x08, 0x12, 0x59, 0xFC, 0xBE, 0xA8, 0x4E, 0x0D, 0xCC, 0x4F, 0x97, 0x26, 0xCA,
+ 0xEE, 0xDC, 0xE2, 0x94, 0x0A, 0x22, 0xA3, 0x46, 0x35, 0x5F, 0xF1, 0x6E, 0x3D, 0x2C, 0x65, 0x2E, 0x98, 0xAC, 0xE4, 0xB0,
+ 0x20, 0xE1, 0xA2, 0xAD, 0x91, 0x72, 0xC0, 0xD0, 0x88, 0xA6, 0x07, 0x56, 0xEF, 0xAB, 0x3E, 0x30, 0xB8, 0x77, 0x53, 0x58,
+ 0x19, 0xDA, 0x8B, 0xE2, 0x2D, 0x84, 0xB3, 0x70, 0xE1, 0xF7, 0x67, 0x8F, 0x75, 0x53, 0x7D, 0x8B, 0x14, 0x15, 0x06, 0x71,
+ 0x83, 0xDF, 0x80, 0xC7, 0xC1, 0x0D, 0xBE, 0x3C, 0xF7, 0x04, 0x3D, 0x3A, 0x3C, 0x81, 0x66, 0x20, 0x63, 0x00, 0x6C, 0x91,
+ 0x02, 0x50, 0x72, 0xAC, 0x24, 0xC7, 0x3C, 0x5F, 0x30, 0x57, 0xB3, 0xFD, 0x2C, 0x64, 0x46, 0x5F, 0x0F, 0x38, 0xC2, 0x79,
+ 0x25, 0x07, 0xB8, 0xF6, 0xAB, 0x3A, 0xBC, 0x92, 0x1B, 0xCF, 0x9E, 0x33, 0x91, 0xF9, 0x72, 0xEB, 0xD9, 0x94, 0xB6, 0xD3,
+ 0x91, 0x6C, 0x4E, 0xF9, 0xC3, 0x5C, 0x73, 0xFF, 0x00, 0xAB, 0xAE, 0xA7, 0x77, 0xAF, 0xC1, 0x2F, 0x34, 0xD1, 0x74, 0x15,
+ 0x74, 0x7A, 0xAF, 0x69, 0xD5, 0xE5, 0x3A, 0xA6, 0x80, 0xAA, 0x7C, 0x2E, 0x8B, 0x0F, 0x3E, 0x83, 0x18, 0xB6, 0xD8, 0x12,
+ 0xD9, 0xD9, 0x4E, 0x73, 0x1B, 0xB2, 0x72, 0xF5, 0x0E, 0xFC, 0xF6, 0xC1, 0xFA, 0xC9, 0x24, 0x1C, 0x7E, 0x40, 0x1D, 0x6B,
+ 0xB2, 0x10, 0x6B, 0xC8, 0x26, 0xB6, 0x9E, 0x41, 0x43, 0xFA, 0x16, 0x57, 0xAD, 0xD8, 0xF8, 0x9D, 0xBB, 0x65, 0x28, 0x31,
+ 0x93, 0x52, 0x93, 0x9A, 0xED, 0xF4, 0x9C, 0x38, 0xF3, 0x8F, 0xBA, 0xAC, 0xDA, 0x97, 0xC5, 0x75, 0x49, 0x67, 0x19, 0x45,
+ 0xCC, 0x94, 0xEA, 0x0E, 0x98, 0xFE, 0x53, 0x05, 0xA6, 0x02, 0xF3, 0xCF, 0x7B, 0x7C, 0x9D, 0x49, 0x93, 0xA5, 0xF4, 0xC6,
+ 0x5C, 0xC5, 0x5E, 0x2D, 0x30, 0x76, 0x66, 0x16, 0x70, 0x94, 0xE0, 0x92, 0x59, 0x81, 0xD3, 0x8A, 0x54, 0xEF, 0x94, 0x7A,
+ 0x81, 0xCD, 0x3C, 0xA3, 0x4E, 0x2E, 0x3A, 0xB8, 0x55, 0xA1, 0x29, 0x47, 0x18, 0x51, 0x73, 0xC9, 0x0B, 0xE6, 0x26, 0x69,
+ 0x25, 0x7A, 0xAF, 0xA0, 0x27, 0x24, 0xC5, 0x17, 0x90, 0x2A, 0xCE, 0xE1, 0x58, 0x7B, 0x97, 0x8C, 0xFB, 0x5E, 0x9C, 0xA5,
+ 0xFB, 0xE4, 0x30, 0x7A, 0xF0, 0x70, 0xE7, 0x27, 0x6F, 0x05, 0x3A, 0xDF, 0x9A, 0xC9, 0x8A, 0x8B, 0xDE, 0xA9, 0xC7, 0x85,
+ 0xF2, 0xE4, 0x4F, 0x6F, 0xBF, 0x95, 0xE3, 0xD9, 0x7D, 0xBD, 0xFF, 0x00, 0xED, 0x9D, 0x63, 0x78, 0xEF, 0x59, 0xE2, 0x9F,
+ 0x2D, 0x63, 0xBF, 0x9F, 0xE2, 0x7F, 0x3E, 0x3D, 0xBF, 0xBE, 0x9A, 0x04, 0x69, 0x01, 0x24, 0x13, 0x4C, 0xAC, 0x47, 0x35,
+ 0x18, 0xF7, 0xAA, 0xB5, 0xA8, 0xE5, 0x54, 0x46, 0xAA, 0xAF, 0x6F, 0x6F, 0x2A, 0xE5, 0x5E, 0x17, 0xB5, 0x13, 0x9E, 0x57,
+ 0x8E, 0x3C, 0xAA, 0x7A, 0x5A, 0x99, 0x68, 0x3E, 0xFE, 0xB7, 0xFD, 0xF6, 0xAE, 0xFA, 0x9A, 0x79, 0x3A, 0x67, 0xD7, 0x16,
+ 0xDB, 0x83, 0x03, 0xDE, 0x78, 0x9E, 0xB1, 0xCB, 0x30, 0x3B, 0xAF, 0xD1, 0x4F, 0x03, 0x67, 0x65, 0x98, 0x4D, 0x4E, 0x55,
+ 0xF5, 0x19, 0x92, 0x94, 0x35, 0x6C, 0x18, 0x90, 0x79, 0x00, 0xD8, 0xC9, 0x02, 0x86, 0x32, 0x53, 0x8F, 0x09, 0x2D, 0x1A,
+ 0xFA, 0xE6, 0xB6, 0x63, 0x8B, 0x22, 0xC5, 0xF4, 0xE1, 0x5A, 0xA0, 0xA3, 0xC2, 0x0A, 0x4D, 0xA7, 0xE0, 0xF6, 0xCD, 0xDD,
+ 0xBD, 0xF8, 0x43, 0x72, 0x19, 0x94, 0x67, 0xD2, 0x3D, 0xC3, 0xA4, 0xBF, 0xCA, 0x47, 0x9B, 0x72, 0xAD, 0x0D, 0x70, 0xE4,
+ 0x9E, 0xE6, 0xDC, 0x77, 0x2F, 0x85, 0xFA, 0x57, 0xF2, 0xF3, 0xDE, 0xB3, 0x6F, 0x49, 0x58, 0x4C, 0x73, 0x8C, 0xC4, 0x2C,
+ 0x8E, 0x2D, 0x91, 0x41, 0x74, 0x55, 0x74, 0x43, 0x1E, 0x3A, 0x0A, 0x44, 0xA3, 0xAC, 0x4B, 0x14, 0xF1, 0x3B, 0xFB, 0x5E,
+ 0xE4, 0x72, 0x2C, 0x6A, 0x88, 0xA8, 0x8E, 0x56, 0xAB, 0xD7, 0x84, 0xED, 0x5E, 0x79, 0x6A, 0xFD, 0xBD, 0x64, 0xDC, 0x96,
+ 0xF4, 0x67, 0xD2, 0xC5, 0x2A, 0x54, 0xE1, 0x28, 0x2A, 0xF2, 0x7A, 0xE0, 0x5B, 0x3D, 0x79, 0xD6, 0x82, 0x05, 0x64, 0xA6,
+ 0xB9, 0xBB, 0xE7, 0xF6, 0xAE, 0x3F, 0xB9, 0xD5, 0x9E, 0x74, 0x5B, 0xAB, 0x6F, 0xB2, 0xEC, 0x67, 0x28, 0xD9, 0xF9, 0x76,
+ 0x33, 0x79, 0x7B, 0x47, 0x87, 0x53, 0x5B, 0x98, 0x88, 0x24, 0xB6, 0x55, 0x90, 0xAD, 0xF5, 0x5D, 0x5C, 0xE5, 0xD4, 0x46,
+ 0x5D, 0xBD, 0x57, 0x16, 0x75, 0x50, 0xBA, 0xCE, 0x30, 0x19, 0x3D, 0x98, 0x6E, 0x69, 0x61, 0x8D, 0x24, 0xE4, 0xB6, 0x56,
+ 0xA3, 0x58, 0xAD, 0xEA, 0x7C, 0x1E, 0xDA, 0xED, 0x4B, 0x72, 0x71, 0xBE, 0xA2, 0x44, 0x46, 0xB2, 0x87, 0x6E, 0x28, 0x5C,
+ 0x59, 0xE3, 0x35, 0xD9, 0x1B, 0xB3, 0x76, 0xD2, 0x31, 0x97, 0x4C, 0x97, 0x15, 0x4A, 0x1C, 0x2E, 0x4A, 0xB7, 0xD9, 0xC7,
+ 0x27, 0x7D, 0x57, 0x5D, 0xEE, 0xC8, 0xDA, 0x39, 0xF1, 0xB6, 0x97, 0xD9, 0xD4, 0xB8, 0x79, 0x39, 0x06, 0x42, 0x54, 0x76,
+ 0x57, 0x27, 0x55, 0xE1, 0x35, 0x54, 0xB6, 0x43, 0xD8, 0xB5, 0x5C, 0xB3, 0x0E, 0x3D, 0x88, 0x12, 0xC6, 0x5C, 0xEE, 0x8A,
+ 0x47, 0xBC, 0x62, 0xCC, 0xB7, 0x7D, 0x9D, 0x8D, 0xAC, 0x90, 0x34, 0xDB, 0x72, 0xCE, 0x3F, 0xB8, 0x87, 0x72, 0x19, 0xEE,
+ 0x4A, 0xFA, 0x88, 0x1D, 0x56, 0x9D, 0x31, 0x23, 0xD3, 0x9E, 0x05, 0x73, 0x5E, 0x5B, 0x6F, 0xBF, 0x1A, 0x74, 0x63, 0x22,
+ 0xBE, 0xBB, 0xA3, 0x21, 0x10, 0xF1, 0x8A, 0x0B, 0xE0, 0xA3, 0xC1, 0xC1, 0xE3, 0x9B, 0x29, 0xCE, 0x9B, 0x95, 0x12, 0x51,
+ 0x51, 0x5C, 0xC7, 0xC4, 0xF6, 0x96, 0x08, 0xD6, 0x11, 0xFC, 0xB7, 0x3A, 0x37, 0x7C, 0xC8, 0xA1, 0x2D, 0xAE, 0x8E, 0x22,
+ 0x58, 0xE8, 0xDB, 0xF2, 0x49, 0x46, 0xBD, 0x58, 0xD5, 0x95, 0x8E, 0x64, 0x8C, 0x91, 0xED, 0x59, 0x39, 0x82, 0x53, 0xDB,
+ 0x2B, 0x1B, 0x05, 0xA7, 0x16, 0x9E, 0x31, 0x2F, 0x5E, 0xE3, 0xA3, 0x4B, 0xC5, 0xA7, 0x0D, 0x9F, 0xAE, 0x3F, 0xBE, 0x9E,
+ 0xDA, 0xC1, 0x21, 0x6E, 0x08, 0x07, 0x7D, 0x43, 0xA5, 0x21, 0x58, 0xC5, 0x59, 0x15, 0x1A, 0x92, 0xCD, 0x22, 0xAB, 0xBB,
+ 0x9E, 0xFE, 0xC6, 0xF6, 0x77, 0xBD, 0x51, 0x5C, 0xF4, 0x89, 0x8B, 0x1A, 0x3B, 0x84, 0x8E, 0x3E, 0xDE, 0x5B, 0xC4, 0xEB,
+ 0x7A, 0x6B, 0x37, 0x76, 0xE1, 0x68, 0xEF, 0xC2, 0x16, 0x9C, 0x56, 0x6F, 0x06, 0x2B, 0x57, 0xA5, 0x6E, 0x8B, 0xEA, 0x8B,
+ 0x64, 0x74, 0xBD, 0xB3, 0x3F, 0xC4, 0x9D, 0x01, 0x85, 0xE1, 0xD9, 0x2E, 0x4F, 0x61, 0x5A, 0xCC, 0x4E, 0xCE, 0x4D, 0xBF,
+ 0x8C, 0x4A, 0x78, 0x19, 0x0D, 0x15, 0x85, 0x88, 0x85, 0xDA, 0xE2, 0x54, 0xD4, 0x61, 0xDB, 0x57, 0x17, 0x48, 0x06, 0x48,
+ 0x68, 0x55, 0x8C, 0x2E, 0xFA, 0xD0, 0xF5, 0xB8, 0x1A, 0x30, 0x45, 0x70, 0xC1, 0x88, 0xC6, 0x4F, 0x33, 0xCB, 0x6B, 0x7E,
+ 0x5B, 0x13, 0x65, 0xB3, 0x02, 0x6C, 0xAA, 0x0B, 0x31, 0x2E, 0x37, 0xF8, 0x63, 0x1B, 0xC5, 0xB5, 0xF5, 0x36, 0x88, 0x3E,
+ 0x75, 0x9B, 0x77, 0x6A, 0x5B, 0xC6, 0x40, 0xA5, 0x4E, 0x49, 0x49, 0x38, 0xE1, 0xC1, 0xE2, 0xD7, 0xD4, 0x4A, 0xD5, 0x83,
+ 0xE6, 0x9F, 0x13, 0x6F, 0x86, 0x36, 0x7D, 0x53, 0x7D, 0x97, 0xE4, 0x1D, 0x1C, 0xF5, 0x11, 0x5B, 0xB9, 0x0B, 0x80, 0x62,
+ 0x71, 0xDD, 0x7C, 0x16, 0x41, 0x85, 0xC3, 0xAF, 0x72, 0xAC, 0x8E, 0x46, 0x32, 0x1B, 0x31, 0x84, 0xCF, 0x60, 0x20, 0xDB,
+ 0xBC, 0x73, 0x1C, 0x0A, 0xC7, 0xE6, 0x94, 0xC9, 0xAC, 0xB1, 0xDB, 0x12, 0x66, 0xA4, 0x86, 0x19, 0x06, 0x85, 0x49, 0x9D,
+ 0x62, 0x66, 0xDF, 0xF7, 0x1D, 0x89, 0x17, 0x2D, 0xA9, 0x33, 0x0C, 0x0C, 0x62, 0xDB, 0x74, 0x7D, 0x77, 0x55, 0xEB, 0x47,
+ 0x16, 0x1A, 0xCB, 0x19, 0x7C, 0x44, 0x3A, 0x61, 0x1D, 0xC7, 0xA7, 0x88, 0xDC, 0x6E, 0x49, 0x79, 0xE9, 0xBC, 0x1D, 0xB3,
+ 0x8A, 0x32, 0x6A, 0x1C, 0xEF, 0x9E, 0xAD, 0x05, 0xEA, 0x73, 0x4F, 0x62, 0x98, 0x2E, 0x1F, 0xAD, 0xCF, 0xE9, 0x7C, 0x1D,
+ 0x69, 0xB0, 0x1D, 0x91, 0xDF, 0xE0, 0x78, 0x2E, 0xCC, 0xC8, 0xAE, 0x29, 0x33, 0xD7, 0x65, 0x54, 0x9F, 0xA7, 0xD0, 0xE6,
+ 0xF2, 0x5E, 0x20, 0xB8, 0xED, 0xD2, 0xD8, 0x62, 0x16, 0x94, 0x52, 0x56, 0x2D, 0x49, 0x9F, 0x34, 0x2A, 0xF9, 0x6F, 0x21,
+ 0xB1, 0xAF, 0x73, 0x54, 0x8E, 0xD8, 0xF3, 0xEF, 0xFC, 0x5B, 0xF1, 0x3B, 0x21, 0x12, 0x5B, 0x0C, 0x26, 0x5C, 0x09, 0x7E,
+ 0x28, 0xA7, 0xD1, 0x21, 0x08, 0xB5, 0x19, 0x46, 0x91, 0x2B, 0x23, 0x8D, 0x3B, 0x6F, 0x6A, 0x4E, 0xE4, 0x9D, 0xEB, 0x92,
+ 0xC7, 0x96, 0x5F, 0x94, 0xF1, 0x55, 0x8C, 0xB6, 0x01, 0x9A, 0x5E, 0x0D, 0x47, 0x15, 0xB0, 0xB6, 0x26, 0x47, 0x91, 0x6E,
+ 0x67, 0xD7, 0xD8, 0x4A, 0xD8, 0x5A, 0x51, 0xAF, 0x1E, 0x01, 0xA7, 0x3A, 0x68, 0x61, 0x64, 0x0E, 0x34, 0xD6, 0x8D, 0x1C,
+ 0x51, 0x4F, 0x64, 0x53, 0x63, 0x6C, 0xB6, 0x06, 0xA4, 0x51, 0x48, 0x79, 0x4B, 0x21, 0x73, 0x31, 0x48, 0x9A, 0x57, 0xBD,
+ 0x31, 0xA7, 0x33, 0x6E, 0x5C, 0xDD, 0x03, 0xC1, 0xF5, 0x21, 0x46, 0x79, 0x5B, 0xE6, 0xD4, 0xB5, 0xD6, 0xC8, 0xC6, 0x80,
+ 0xE6, 0xBD, 0x8A, 0x3F, 0x63, 0xF5, 0xA3, 0xDB, 0x44, 0x9C, 0x62, 0x7B, 0xAB, 0xBF, 0x3F, 0x7F, 0xC7, 0x9F, 0x0B, 0xC7,
+ 0xDB, 0xFE, 0x3F, 0x21, 0xD1, 0x2A, 0xE3, 0x3E, 0xE7, 0xF7, 0xFC, 0xFF, 0x00, 0x37, 0xAD, 0x49, 0xCC, 0x6A, 0xB5, 0x51,
+ 0xDC, 0xB9, 0x17, 0x9E, 0x3D, 0x95, 0x3F, 0xD5, 0x3F, 0xF2, 0xA7, 0x0B, 0xC2, 0xF3, 0xC7, 0xAB, 0x22, 0x0D, 0xAD, 0x01,
+ 0x63, 0x66, 0x7C, 0x51, 0xCF, 0xEC, 0xFD, 0x9B, 0x25, 0x27, 0x25, 0x77, 0xE2, 0xBD, 0xDD, 0x0E, 0x5C, 0x8B, 0x19, 0x0E,
+ 0x86, 0xC6, 0x20, 0xEF, 0xE9, 0x0E, 0xCC, 0x2E, 0xE7, 0x9F, 0x1E, 0x83, 0x1A, 0x88, 0x79, 0x88, 0xBE, 0xC6, 0xEB, 0xA1,
+ 0x9A, 0x02, 0x2C, 0xF2, 0x72, 0x64, 0x96, 0x14, 0x0A, 0xAC, 0x52, 0x81, 0x46, 0x89, 0x54, 0x44, 0x32, 0x4B, 0x61, 0x60,
+ 0x69, 0x90, 0x45, 0x0A, 0x8E, 0x10, 0x96, 0x48, 0x55, 0xB2, 0x8F, 0x4A, 0xC5, 0x3A, 0x97, 0xA6, 0x30, 0x3F, 0x14, 0x4E,
+ 0x65, 0x35, 0x68, 0xE2, 0xC0, 0x2D, 0x16, 0xFB, 0x36, 0xB6, 0x63, 0x2E, 0x83, 0x9B, 0xFA, 0xAD, 0xA4, 0x3C, 0xF9, 0xA7,
+ 0x01, 0xEF, 0xEB, 0xA0, 0x6C, 0xA8, 0xAC, 0xE2, 0x17, 0x38, 0x78, 0x3B, 0xE2, 0x62, 0x7C, 0xB4, 0x46, 0x35, 0x15, 0x8D,
+ 0x6B, 0x51, 0xAD, 0x6B, 0x79, 0x4E, 0x51, 0xA8, 0xDE, 0x1B, 0xE3, 0x9E, 0x53, 0xEF, 0xED, 0xCA, 0x80, 0x3B, 0x1F, 0x63,
+ 0x4C, 0xAA, 0xCF, 0xDB, 0xF5, 0x7D, 0x5F, 0x37, 0xFE, 0x03, 0x4A, 0x2C, 0x4F, 0x3D, 0x97, 0x54, 0x66, 0x74, 0x59, 0xD8,
+ 0xD5, 0x42, 0x5D, 0x09, 0x51, 0x34, 0xB0, 0x5E, 0x51, 0x1B, 0x58, 0x1D, 0xC8, 0x57, 0xB8, 0xDD, 0x84, 0x2E, 0x12, 0xF2,
+ 0xAC, 0xBA, 0x73, 0xF8, 0x0A, 0xDA, 0x29, 0xC3, 0x7A, 0xBD, 0x6B, 0x0B, 0x7C, 0x31, 0xD8, 0x36, 0x37, 0x80, 0xD2, 0x82,
+ 0x90, 0xB6, 0x9C, 0x31, 0x46, 0x7F, 0x2E, 0x44, 0x9F, 0xA8, 0xBA, 0x91, 0x43, 0x71, 0x79, 0x2B, 0x03, 0x5C, 0x82, 0x9E,
+ 0xF9, 0xD0, 0x4E, 0xEA, 0xCE, 0x63, 0x9A, 0xAB, 0xB3, 0x84, 0xAF, 0x6F, 0xF1, 0xA1, 0xF7, 0x59, 0x16, 0x25, 0x67, 0x72,
+ 0x7C, 0xF8, 0x55, 0xCD, 0x4D, 0xBE, 0x3C, 0x4C, 0xAE, 0x36, 0xB1, 0x29, 0xCA, 0xB5, 0x36, 0x2A, 0xB0, 0x8C, 0x98, 0x89,
+ 0x05, 0xA3, 0x2E, 0x5B, 0xC0, 0x81, 0xB8, 0x65, 0x85, 0x58, 0xCD, 0x8A, 0x12, 0x20, 0xB3, 0x89, 0xF6, 0x51, 0x44, 0xA3,
+ 0xA1, 0xE4, 0x94, 0x63, 0xA6, 0x26, 0x69, 0x36, 0x37, 0x51, 0x91, 0x28, 0xB9, 0x02, 0xEB, 0x3D, 0x9E, 0xA0, 0xC8, 0x72,
+ 0x52, 0xE4, 0xCE, 0xA4, 0x27, 0xD6, 0x08, 0xD9, 0xE8, 0xF1, 0x8E, 0x5B, 0x01, 0x6F, 0xD3, 0x1D, 0xEB, 0x8D, 0x7F, 0xFF,
+ 0xD9
+};
+
+NPT_UInt8 Platinum_48x48_png[4681] =
+{
+ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30,
+ 0x00, 0x00, 0x00, 0x30, 0x08, 0x02, 0x00, 0x00, 0x00, 0xD8, 0x60, 0x6E, 0xD0, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
+ 0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4D, 0x41, 0x00, 0x00, 0xB1, 0x8F, 0x0B, 0xFC,
+ 0x61, 0x05, 0x00, 0x00, 0x00, 0x20, 0x63, 0x48, 0x52, 0x4D, 0x00, 0x00, 0x7A, 0x26, 0x00, 0x00, 0x80, 0x84, 0x00, 0x00,
+ 0xFA, 0x00, 0x00, 0x00, 0x80, 0xE8, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0xEA, 0x60, 0x00, 0x00, 0x3A, 0x98, 0x00, 0x00,
+ 0x17, 0x70, 0x9C, 0xBA, 0x51, 0x3C, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0B, 0x12, 0x00, 0x00,
+ 0x0B, 0x12, 0x01, 0xD2, 0xDD, 0x7E, 0xFC, 0x00, 0x00, 0x11, 0xB2, 0x49, 0x44, 0x41, 0x54, 0x58, 0x47, 0x6D, 0x98, 0x09,
+ 0x90, 0x5C, 0xD5, 0x75, 0x86, 0x9F, 0x90, 0x10, 0x48, 0x02, 0x84, 0x00, 0xED, 0xB3, 0xAF, 0xBD, 0x4F, 0x77, 0xCF, 0xF4,
+ 0xEC, 0x7B, 0xEF, 0x33, 0xBD, 0xCE, 0xDA, 0x3D, 0x3D, 0xDD, 0xB3, 0xF6, 0xEC, 0xDA, 0x46, 0x1A, 0xA1, 0x0D, 0xA1, 0x65,
+ 0x8C, 0x30, 0x94, 0x04, 0x8C, 0x25, 0x90, 0xC0, 0x06, 0x51, 0x91, 0x64, 0x04, 0xA2, 0x2C, 0x88, 0x21, 0x18, 0x12, 0x0C,
+ 0x49, 0x2C, 0x82, 0x4C, 0xC0, 0x31, 0x06, 0x93, 0x18, 0x2A, 0x94, 0x43, 0x62, 0xA8, 0x72, 0x01, 0x55, 0x10, 0x6C, 0x19,
+ 0xA4, 0xC9, 0x77, 0xDF, 0x1D, 0x35, 0x63, 0xC7, 0x5D, 0xA7, 0x5E, 0xBD, 0x7E, 0xCB, 0x3D, 0xFF, 0xFD, 0xCF, 0x39, 0xFF,
+ 0x39, 0xDD, 0x0B, 0xC6, 0xFA, 0xB7, 0x28, 0xEA, 0x67, 0xC1, 0x95, 0xD9, 0x2B, 0x0B, 0xC4, 0xC9, 0xEC, 0x15, 0xBE, 0xCC,
+ 0xF2, 0x91, 0xD7, 0x95, 0xD9, 0x05, 0xB3, 0x0A, 0x97, 0xAE, 0x88, 0x4B, 0x7C, 0x16, 0x28, 0x0B, 0xAF, 0x28, 0xB3, 0xD7,
+ 0x88, 0x27, 0xB8, 0xB9, 0x70, 0xE1, 0xC2, 0xEB, 0xAE, 0xBB, 0x6E, 0xE1, 0x82, 0xD9, 0x25, 0x37, 0x2C, 0xF9, 0xFA, 0x4F,
+ 0xB3, 0x57, 0xAE, 0x5C, 0xF9, 0xD3, 0x1F, 0xFE, 0xF8, 0xD5, 0xA5, 0x3F, 0x7E, 0xF3, 0xCD, 0x37, 0xCA, 0x65, 0xF1, 0x8A,
+ 0x82, 0x2D, 0x10, 0x9F, 0x85, 0x8B, 0x16, 0x70, 0xF7, 0xEB, 0xCB, 0xB3, 0x0B, 0x2E, 0x5F, 0x11, 0x37, 0x38, 0xB0, 0xB6,
+ 0x58, 0xE4, 0x9A, 0x05, 0xCA, 0x37, 0x72, 0xB5, 0xCB, 0xF8, 0x1E, 0xE9, 0xDD, 0x24, 0x2D, 0xD9, 0xB3, 0x61, 0xB8, 0x67,
+ 0x23, 0x36, 0x94, 0xD8, 0x30, 0x14, 0xDF, 0x38, 0x98, 0x98, 0x48, 0xC6, 0xC7, 0x92, 0x71, 0x8E, 0x13, 0x03, 0x5D, 0xE3,
+ 0x83, 0xDD, 0xA3, 0x03, 0xB1, 0x91, 0xFE, 0xAE, 0x61, 0x69, 0x7D, 0xD1, 0xA1, 0xDE, 0xAE, 0x21, 0x4E, 0x46, 0x7B, 0xC6,
+ 0x26, 0x7A, 0x27, 0x4E, 0x3D, 0x76, 0xFA, 0xE3, 0x8F, 0x3F, 0x7E, 0xFD, 0xB5, 0x8B, 0x7B, 0x77, 0xEE, 0x9B, 0x1C, 0xD9,
+ 0x92, 0x8C, 0x0D, 0xF5, 0xB4, 0xF5, 0xC7, 0x5B, 0x7A, 0x63, 0xA1, 0x44, 0x77, 0x28, 0xC1, 0x49, 0x5F, 0x67, 0x6F, 0xC4,
+ 0x17, 0xE9, 0x0A, 0x74, 0xF5, 0xB4, 0xF6, 0x44, 0x03, 0x89, 0x88, 0x3F, 0xD6, 0xE1, 0xEB, 0xC4, 0xB8, 0xD8, 0xDE, 0xDC,
+ 0xD1, 0xD1, 0xD4, 0xD1, 0xD6, 0xD4, 0xDE, 0xEA, 0x6D, 0xC3, 0x14, 0xDC, 0x4B, 0x10, 0xB8, 0xC7, 0x2B, 0xEE, 0x39, 0x0E,
+ 0x76, 0x8F, 0x0F, 0xC4, 0xC6, 0x40, 0xC0, 0x51, 0x20, 0x88, 0x8E, 0xF5, 0xC5, 0x86, 0xB1, 0x44, 0x6C, 0xA8, 0x37, 0x92,
+ 0xEC, 0xE9, 0x1C, 0xEC, 0xEB, 0x18, 0xEC, 0x6D, 0x1F, 0xE0, 0x38, 0x10, 0xED, 0x4F, 0xC6, 0x06, 0x7F, 0xF5, 0xCB, 0x77,
+ 0x66, 0x67, 0x2F, 0xB3, 0xCB, 0xBF, 0x7B, 0xEE, 0x85, 0xF1, 0xBE, 0xB1, 0x91, 0xEE, 0x91, 0x78, 0xB8, 0x27, 0x16, 0x8C,
+ 0x47, 0x03, 0xDD, 0x9D, 0xC1, 0xEE, 0x78, 0x38, 0x1E, 0x68, 0xF4, 0xFD, 0xF8, 0x47, 0xCF, 0x3D, 0x74, 0xFF, 0x43, 0xCD,
+ 0x75, 0xDE, 0x58, 0x30, 0x06, 0x88, 0xCE, 0xE6, 0xCE, 0x8E, 0xA6, 0x36, 0x15, 0x4A, 0x2B, 0x38, 0x5A, 0x3C, 0xAD, 0x61,
+ 0x67, 0xB8, 0xC5, 0xD5, 0xA2, 0x0C, 0x26, 0x04, 0x0E, 0xE9, 0x7B, 0x20, 0x2E, 0x69, 0x18, 0xC5, 0xB7, 0xA4, 0x41, 0x30,
+ 0x11, 0x49, 0xF6, 0x46, 0x86, 0x53, 0x20, 0xC0, 0xD1, 0xDB, 0xD6, 0x9F, 0x68, 0xED, 0x63, 0xDF, 0xDD, 0xE1, 0x9E, 0x88,
+ 0xAF, 0xA3, 0xBF, 0x2B, 0x79, 0x6C, 0xE6, 0x04, 0x31, 0x02, 0x10, 0xC8, 0x46, 0xE3, 0xC3, 0xFD, 0x1D, 0xBD, 0x5D, 0x81,
+ 0xEE, 0xA8, 0xBF, 0x33, 0xEA, 0x8F, 0xE2, 0x9B, 0xDD, 0xBB, 0x2A, 0x1D, 0x67, 0x7F, 0x78, 0x6E, 0xCF, 0xD4, 0x1D, 0x8E,
+ 0xF2, 0x46, 0x10, 0x08, 0xF7, 0xDE, 0xB6, 0x90, 0x47, 0x9C, 0x60, 0x9C, 0x04, 0x3C, 0x2D, 0x41, 0x77, 0x4B, 0xC0, 0x1D,
+ 0x54, 0x54, 0xF7, 0x02, 0x41, 0x5F, 0x2C, 0x29, 0xDD, 0xAB, 0xC7, 0xE1, 0x44, 0xC7, 0x80, 0x04, 0x21, 0x8E, 0x80, 0x50,
+ 0x71, 0x10, 0x88, 0x44, 0x4B, 0xAF, 0x84, 0xD2, 0x05, 0x01, 0xC1, 0x48, 0x53, 0xAD, 0x07, 0x40, 0x5B, 0x37, 0x6E, 0x3B,
+ 0x7F, 0xF6, 0x3C, 0x80, 0xFE, 0xF9, 0x1F, 0x5F, 0x4B, 0xB4, 0xC5, 0xC1, 0xD1, 0xE1, 0x6B, 0x57, 0xAD, 0x13, 0xC7, 0x4D,
+ 0xF6, 0x66, 0x67, 0x95, 0xA3, 0x58, 0x6B, 0xAD, 0xB3, 0xD5, 0x72, 0xE2, 0x77, 0x05, 0x70, 0x8C, 0xFB, 0xA0, 0x27, 0xC4,
+ 0xD1, 0xEF, 0x09, 0xF2, 0x35, 0xE0, 0x0A, 0x07, 0xDC, 0x01, 0x6E, 0x29, 0xF8, 0x56, 0xA3, 0x30, 0x24, 0xDD, 0xCB, 0x58,
+ 0xCC, 0x59, 0x5B, 0xBF, 0x00, 0xD1, 0xDA, 0x07, 0x1F, 0x82, 0x92, 0x70, 0x0F, 0x68, 0x80, 0x12, 0x0B, 0x77, 0xC7, 0x02,
+ 0x3D, 0x9D, 0xFE, 0x48, 0x4B, 0x73, 0xAB, 0xBB, 0xDE, 0xD3, 0x50, 0x56, 0x7F, 0xE7, 0xEE, 0xEF, 0x8E, 0xF5, 0x6F, 0x38,
+ 0x77, 0xF6, 0xFC, 0xF7, 0x0E, 0x3F, 0x14, 0xB4, 0xFB, 0x83, 0x8D, 0xBE, 0x60, 0x53, 0x58, 0xEE, 0x1E, 0x67, 0x1E, 0xBB,
+ 0xB7, 0xDA, 0x56, 0x1D, 0xF6, 0xB5, 0x36, 0xD6, 0xD8, 0xEB, 0xCA, 0xEB, 0x9A, 0x1C, 0x81, 0x66, 0x97, 0x5F, 0x60, 0xF2,
+ 0x84, 0x38, 0x02, 0x42, 0x9A, 0xCF, 0xE9, 0xC7, 0x94, 0x94, 0x7B, 0x1C, 0x43, 0x80, 0x34, 0x89, 0x00, 0xF7, 0x12, 0x87,
+ 0xA4, 0x24, 0x1A, 0x4E, 0x90, 0xA4, 0x18, 0x99, 0x41, 0x56, 0x46, 0x9A, 0x3A, 0x59, 0x8E, 0x25, 0x0A, 0xB3, 0xF3, 0x87,
+ 0x06, 0x36, 0x6E, 0x1A, 0xBD, 0x7D, 0xB0, 0x2B, 0x99, 0x68, 0x49, 0xD4, 0x57, 0x34, 0x34, 0x56, 0x35, 0xCE, 0xD1, 0xE0,
+ 0x09, 0x71, 0xE2, 0x75, 0x34, 0x01, 0x08, 0xAB, 0xB0, 0x56, 0x38, 0xEB, 0xDD, 0x5E, 0x47, 0x33, 0x6F, 0xCD, 0x07, 0x21,
+ 0xA1, 0x34, 0x3B, 0x7C, 0x98, 0x92, 0x68, 0x1D, 0x50, 0x4D, 0xE5, 0x40, 0x0D, 0x87, 0x04, 0x01, 0x02, 0x41, 0x46, 0x28,
+ 0x41, 0x68, 0x24, 0x08, 0x4E, 0x44, 0x98, 0xFC, 0x31, 0x91, 0xAA, 0xFE, 0x08, 0x99, 0x11, 0x72, 0x05, 0x59, 0xC2, 0x6A,
+ 0x30, 0x97, 0x17, 0x57, 0xEC, 0xD8, 0x76, 0xB0, 0xB6, 0xA4, 0xAE, 0xCC, 0x5C, 0xD6, 0x50, 0xD9, 0x50, 0x53, 0x5A, 0xE3,
+ 0x6D, 0x6C, 0xC2, 0x87, 0x8C, 0x02, 0x21, 0xF3, 0xD4, 0xBA, 0x6B, 0xCB, 0xEA, 0xEC, 0x55, 0x2E, 0x18, 0x05, 0x1F, 0x6F,
+ 0xA5, 0x10, 0x48, 0x1C, 0x3C, 0x23, 0x4D, 0x89, 0xB7, 0xF4, 0x4B, 0xDF, 0x29, 0x04, 0x12, 0xC4, 0x7C, 0x03, 0xC1, 0x55,
+ 0x4B, 0x00, 0x48, 0xD0, 0xE3, 0x13, 0x80, 0x60, 0xC8, 0xDB, 0xE8, 0x6D, 0xAC, 0xA8, 0xCD, 0x5A, 0x9F, 0x39, 0x3A, 0xB4,
+ 0xC5, 0x59, 0xEF, 0x32, 0x14, 0x68, 0xEA, 0x2A, 0x1B, 0xC0, 0xE7, 0x69, 0xF0, 0x48, 0xAF, 0x00, 0x6A, 0x76, 0xF9, 0x78,
+ 0xCC, 0xD3, 0xE0, 0x15, 0x68, 0x1A, 0x05, 0x9A, 0xF9, 0x26, 0x71, 0x70, 0x5D, 0x9A, 0xF2, 0x17, 0xBE, 0x65, 0xAD, 0x0A,
+ 0x83, 0x09, 0xE1, 0xB8, 0xAB, 0xD3, 0xD7, 0x85, 0x7B, 0x28, 0xE1, 0x84, 0x2B, 0xE8, 0x0A, 0xCF, 0x48, 0xFD, 0x08, 0xBB,
+ 0x5B, 0xF0, 0xE4, 0xAC, 0x75, 0xE5, 0x65, 0xE4, 0x34, 0x7B, 0xC2, 0x6D, 0x81, 0x48, 0x7E, 0x66, 0x6E, 0x55, 0x69, 0x75,
+ 0xB9, 0xA5, 0x9C, 0x8B, 0xB8, 0x91, 0x98, 0x30, 0xD5, 0x6B, 0x93, 0x6A, 0x73, 0x4C, 0xCC, 0x07, 0x21, 0xA1, 0x48, 0xC4,
+ 0x0A, 0xF5, 0x89, 0x54, 0xA8, 0x69, 0x11, 0x17, 0x5B, 0x57, 0x8F, 0x94, 0x09, 0x06, 0x82, 0x36, 0x21, 0x5F, 0xED, 0x68,
+ 0x86, 0x94, 0x2F, 0x4E, 0xC2, 0xCE, 0x56, 0x6E, 0xF5, 0x53, 0xEC, 0xBE, 0x68, 0xC8, 0x1B, 0x66, 0xF7, 0xA4, 0x85, 0x45,
+ 0x5F, 0x64, 0x35, 0x16, 0x47, 0x5B, 0xE3, 0xB9, 0xE9, 0x99, 0xD0, 0x53, 0x66, 0x2D, 0x77, 0xD4, 0x38, 0xBD, 0x76, 0xB7,
+ 0x60, 0xC2, 0x35, 0x97, 0x1C, 0x02, 0x81, 0xE3, 0xAF, 0xA0, 0x91, 0x38, 0xA4, 0xB9, 0xEA, 0xDC, 0xCA, 0xB7, 0x1C, 0xA8,
+ 0x64, 0x48, 0x93, 0x32, 0x2A, 0x4D, 0x6A, 0x28, 0xD5, 0xEB, 0xB7, 0xFB, 0x20, 0xE6, 0xFC, 0x53, 0xCF, 0x4C, 0x8D, 0x6F,
+ 0x6B, 0xF3, 0xB4, 0x20, 0x89, 0x5D, 0x81, 0x08, 0x11, 0x71, 0x35, 0xB8, 0xAB, 0x4A, 0xAA, 0x35, 0xB9, 0x85, 0xED, 0x2D,
+ 0x51, 0x6D, 0x6E, 0x61, 0xA9, 0xA5, 0xAC, 0xA2, 0xB8, 0x0C, 0x40, 0x44, 0x4D, 0x50, 0xE2, 0x14, 0x01, 0xF2, 0x39, 0x45,
+ 0x96, 0xA4, 0xE2, 0xE2, 0xB1, 0x0B, 0x3E, 0x52, 0x50, 0xC0, 0x01, 0xA3, 0x18, 0x6F, 0x01, 0x28, 0xC2, 0xBE, 0x29, 0x19,
+ 0x7C, 0x0B, 0xF5, 0x54, 0x8F, 0xF0, 0x21, 0x05, 0xAD, 0xD5, 0xD3, 0x41, 0xE9, 0xAA, 0xF5, 0x19, 0xE0, 0x85, 0x86, 0xCA,
+ 0xC6, 0x03, 0xBB, 0x0F, 0xBC, 0xF3, 0xF6, 0xBB, 0x33, 0xF7, 0xCE, 0xB4, 0x37, 0xB7, 0x25, 0x5A, 0x84, 0x0A, 0x07, 0x9D,
+ 0x7E, 0x47, 0xA5, 0x5D, 0x9B, 0xA7, 0xC1, 0x77, 0x9D, 0xAD, 0xA6, 0xBE, 0xA2, 0xBE, 0xA2, 0xA4, 0xD2, 0x5D, 0xA3, 0xE6,
+ 0x6F, 0xE3, 0x9F, 0xC5, 0xC8, 0xD7, 0x08, 0x49, 0xDF, 0x46, 0x07, 0x1C, 0x29, 0x28, 0x12, 0x8D, 0x00, 0xD4, 0xD2, 0xD4,
+ 0x8E, 0xE3, 0x79, 0x26, 0x84, 0x9C, 0xAF, 0x5C, 0x0F, 0x7B, 0x3B, 0x38, 0x07, 0x0D, 0xDA, 0x05, 0x3D, 0xEE, 0xBA, 0xA6,
+ 0x32, 0x63, 0x69, 0xA9, 0xC1, 0x36, 0x31, 0xB8, 0xE9, 0xAD, 0x8B, 0x6F, 0xBE, 0xF9, 0xE6, 0x1B, 0xD3, 0xBB, 0x0E, 0xC4,
+ 0xC3, 0x31, 0x60, 0xD1, 0x04, 0x50, 0x23, 0xA0, 0xEF, 0xDF, 0x75, 0x60, 0xFF, 0xCE, 0x69, 0x7B, 0x99, 0x9D, 0xDC, 0x12,
+ 0x85, 0x26, 0x4C, 0x84, 0x49, 0x66, 0x31, 0xE7, 0x92, 0x18, 0x69, 0xF3, 0x89, 0x91, 0x68, 0xEC, 0xD5, 0x0E, 0x85, 0x55,
+ 0x64, 0x2B, 0x91, 0x12, 0x2E, 0x8E, 0xDE, 0x30, 0x27, 0x32, 0x4C, 0xE1, 0xA6, 0x16, 0x7F, 0x53, 0x18, 0x40, 0x42, 0x6D,
+ 0x55, 0x86, 0xCC, 0x85, 0x86, 0xC2, 0xAC, 0xC2, 0x48, 0x28, 0xF6, 0xDC, 0xF9, 0xE7, 0x2F, 0x5F, 0xBE, 0xFC, 0xDA, 0x6B,
+ 0xAF, 0x6F, 0x9F, 0x98, 0x1A, 0x49, 0x0C, 0x0F, 0xC7, 0x93, 0xDB, 0x36, 0x4C, 0x7D, 0xF0, 0xC1, 0x7F, 0xFE, 0xE2, 0xCD,
+ 0xB7, 0x81, 0xD8, 0xE6, 0x0D, 0x8B, 0x30, 0x39, 0xBD, 0xEC, 0x24, 0xE8, 0x0C, 0xB4, 0xBA, 0x85, 0x10, 0xAB, 0x57, 0xA8,
+ 0x38, 0xE2, 0x25, 0xD2, 0x25, 0xC5, 0x4A, 0x63, 0x95, 0x1D, 0x28, 0x18, 0x27, 0x4A, 0xD8, 0x1D, 0x82, 0x03, 0x10, 0xC8,
+ 0x56, 0x22, 0xE4, 0xBC, 0x29, 0x0C, 0x8E, 0x4E, 0x7F, 0x47, 0x2C, 0xDC, 0x45, 0x7F, 0xA6, 0xF5, 0x70, 0x9D, 0xE4, 0x65,
+ 0x09, 0x00, 0x21, 0xB5, 0x60, 0xCA, 0x5C, 0x9F, 0xC6, 0x2B, 0x27, 0x66, 0x1E, 0xFE, 0xEA, 0xAB, 0x2F, 0x3F, 0xFF, 0xFC,
+ 0xF3, 0xA7, 0x4E, 0x3D, 0x75, 0xF2, 0x91, 0xC7, 0xFF, 0xE3, 0xBD, 0xDF, 0xD0, 0x3D, 0x2E, 0x5D, 0xBA, 0x74, 0xE4, 0xD0,
+ 0x91, 0xDE, 0xB6, 0x44, 0xBB, 0xA7, 0x25, 0xE0, 0xF0, 0x87, 0x9D, 0xC1, 0xCE, 0xE6, 0xF6, 0x56, 0x57, 0x88, 0x10, 0xB3,
+ 0xB2, 0xCF, 0x4D, 0xC5, 0x11, 0x35, 0x91, 0xC8, 0x12, 0x90, 0xC4, 0x81, 0xB1, 0x38, 0xA6, 0xA4, 0xC4, 0x5B, 0x6A, 0x06,
+ 0xFB, 0x08, 0x78, 0x83, 0xF4, 0x04, 0xF6, 0xC4, 0x5A, 0xDD, 0xA1, 0xAE, 0xBE, 0xF6, 0x1E, 0x56, 0x64, 0x69, 0x77, 0xA3,
+ 0x97, 0xF7, 0xD1, 0x37, 0x34, 0xB7, 0x48, 0xAB, 0x5F, 0x75, 0xCB, 0xAD, 0x91, 0xD6, 0xAE, 0xC3, 0x77, 0xDF, 0xF7, 0xC9,
+ 0x27, 0x9F, 0xA8, 0xE3, 0x0D, 0x9F, 0x6F, 0xBE, 0xFE, 0xFA, 0x6B, 0xCE, 0xDF, 0xFD, 0xD5, 0xAF, 0xB7, 0x0C, 0x6F, 0x1E,
+ 0x89, 0x25, 0x7B, 0x5A, 0xBA, 0x07, 0x3A, 0xFB, 0x06, 0x23, 0xFD, 0x87, 0xEF, 0x3A, 0xBC, 0x71, 0x70, 0xA2, 0xA7, 0x35,
+ 0xCE, 0xF6, 0x20, 0x2C, 0xE8, 0x22, 0x76, 0x1E, 0x7B, 0xED, 0x1C, 0x2B, 0x12, 0x0A, 0x86, 0xCA, 0x2B, 0x52, 0x27, 0xE6,
+ 0x8B, 0x37, 0xB0, 0xDC, 0x55, 0xCE, 0x1D, 0x1B, 0x6F, 0x7F, 0xE9, 0xF9, 0x17, 0x0F, 0xEE, 0x99, 0xA6, 0x94, 0x08, 0x01,
+ 0x98, 0x44, 0x4A, 0xD6, 0xB8, 0xD9, 0x0A, 0x42, 0x5C, 0x55, 0x52, 0x65, 0x28, 0xD0, 0xDD, 0x76, 0xEB, 0x8A, 0x8D, 0x23,
+ 0x93, 0x7B, 0x6F, 0xDF, 0xFB, 0xC6, 0xC5, 0xB7, 0x7E, 0xF7, 0xBB, 0x4F, 0xDE, 0xFF, 0xCD, 0x87, 0xFF, 0xFE, 0xDE, 0x07,
+ 0xBF, 0xFF, 0xFD, 0xA7, 0x8C, 0x22, 0xAF, 0xBC, 0xFC, 0xEA, 0xD6, 0x89, 0x6D, 0xDB, 0x27, 0xB6, 0x4D, 0x8E, 0x4F, 0x7E,
+ 0x7F, 0xE6, 0x61, 0x50, 0x3E, 0xFB, 0xF4, 0xDF, 0x4E, 0xF4, 0x33, 0x3C, 0x8D, 0xC5, 0x82, 0x51, 0x9A, 0xBF, 0xB3, 0xC2,
+ 0xCE, 0xF6, 0x40, 0x20, 0x71, 0xD4, 0x95, 0xD7, 0x53, 0x0D, 0x1C, 0x95, 0x94, 0x68, 0x5E, 0xD5, 0x89, 0x26, 0x7B, 0xB5,
+ 0xDD, 0x53, 0xDF, 0x3C, 0x39, 0xBE, 0xF5, 0xDD, 0x77, 0xDF, 0x63, 0xA1, 0x7F, 0xB9, 0xF0, 0x3A, 0x29, 0xE2, 0xAB, 0xF3,
+ 0x86, 0x9C, 0x7E, 0x77, 0xBD, 0xDB, 0x5E, 0xE3, 0x6E, 0xA8, 0x70, 0x50, 0x4D, 0x50, 0x95, 0xB1, 0x66, 0x9D, 0xC7, 0xE9,
+ 0xDB, 0x3C, 0x32, 0x15, 0x6F, 0xED, 0x26, 0x97, 0xEF, 0xBF, 0x77, 0xE6, 0xF1, 0x47, 0x4F, 0xBF, 0xFA, 0xCA, 0x85, 0x2F,
+ 0xBF, 0xFC, 0x52, 0x8E, 0x22, 0x0C, 0x6E, 0x3F, 0x7E, 0xF6, 0xB9, 0x2F, 0xBE, 0xF8, 0x82, 0xAF, 0xFF, 0xFB, 0x87, 0xAF,
+ 0x9E, 0x7E, 0xE2, 0x47, 0xFB, 0x76, 0xEE, 0xDF, 0x3A, 0xB1, 0xF5, 0xFB, 0x0F, 0x3E, 0x7C, 0xF4, 0xF0, 0x31, 0x51, 0x8F,
+ 0xD6, 0x8A, 0xBA, 0xCA, 0x7A, 0x96, 0x22, 0x13, 0xB0, 0xDA, 0xB2, 0x5A, 0x45, 0xEC, 0x5B, 0x55, 0x49, 0x21, 0x12, 0x75,
+ 0x22, 0xD7, 0xAA, 0x2B, 0xEB, 0x4C, 0x46, 0x7D, 0x77, 0x47, 0xEF, 0x68, 0xDF, 0xC4, 0xF7, 0x8E, 0x1C, 0xFB, 0xB7, 0xB7,
+ 0x7E, 0xF9, 0xFE, 0xFB, 0xEF, 0x43, 0x03, 0xC3, 0x83, 0xC8, 0xC4, 0x7A, 0xEA, 0xD9, 0x0D, 0x85, 0xEC, 0xD2, 0x92, 0x5F,
+ 0xE4, 0xAD, 0xF5, 0x35, 0x37, 0xF8, 0x98, 0x72, 0xBA, 0x42, 0xB1, 0x81, 0xE8, 0xE0, 0xA6, 0xE1, 0xC9, 0xC3, 0x87, 0x1E,
+ 0xF8, 0xC9, 0xF3, 0xFF, 0xA0, 0x82, 0x60, 0x64, 0x53, 0xC7, 0xD8, 0xAB, 0x1F, 0x82, 0xFA, 0xD9, 0x67, 0x9F, 0x71, 0x7C,
+ 0xE3, 0xE2, 0xBF, 0x92, 0xA3, 0x26, 0x8D, 0x81, 0xE8, 0xB3, 0x37, 0x28, 0x07, 0x8A, 0x38, 0x96, 0x57, 0x2B, 0x12, 0x8D,
+ 0xD4, 0x28, 0xA1, 0x4E, 0x55, 0x0E, 0x78, 0x43, 0xDF, 0x6E, 0xBE, 0x69, 0xB9, 0x26, 0x2F, 0xBF, 0xA6, 0xBC, 0xCE, 0xE7,
+ 0x0A, 0x4D, 0x8E, 0x4D, 0xDD, 0x7D, 0xF0, 0x1E, 0x31, 0x3C, 0xD8, 0x6A, 0xA1, 0xD7, 0xDF, 0xD0, 0xCC, 0x08, 0x36, 0x92,
+ 0x18, 0xDA, 0x33, 0xB5, 0x67, 0xFA, 0x8E, 0x69, 0xC8, 0x2F, 0xB3, 0x42, 0x9A, 0xCB, 0x6B, 0x0F, 0xB6, 0xF9, 0x98, 0x29,
+ 0x27, 0xB6, 0x6F, 0xDC, 0xF9, 0xD0, 0xCC, 0x89, 0xD7, 0x7E, 0x76, 0xF1, 0xB7, 0x1F, 0xFE, 0xF7, 0x47, 0x1F, 0xFD, 0xCF,
+ 0x87, 0x1F, 0xFE, 0xF6, 0xA3, 0xFF, 0xFA, 0xF8, 0xD3, 0x4F, 0x3F, 0xBF, 0x74, 0xE9, 0x0F, 0x60, 0x7B, 0xF5, 0xEF, 0x5F,
+ 0x41, 0x54, 0x4D, 0xF9, 0x3A, 0x5B, 0x51, 0x71, 0x65, 0x71, 0x25, 0xD1, 0x07, 0x16, 0x68, 0x30, 0x4E, 0x14, 0x21, 0x5F,
+ 0x2A, 0x31, 0xB2, 0x0E, 0x49, 0x11, 0x18, 0x82, 0x49, 0x7D, 0x7E, 0x21, 0x69, 0x7B, 0xE3, 0xB2, 0x1B, 0x56, 0xDC, 0x7C,
+ 0x53, 0xDA, 0xBA, 0x74, 0xB3, 0xB1, 0x04, 0xB9, 0x2B, 0x31, 0x59, 0x2B, 0x8B, 0xAB, 0x18, 0xFC, 0xC8, 0x98, 0xAB, 0x23,
+ 0xE2, 0xAF, 0x19, 0x93, 0x59, 0xB4, 0xBE, 0xAA, 0x91, 0xAC, 0xEF, 0xEA, 0x48, 0x32, 0xEE, 0x0D, 0xC4, 0xC7, 0x37, 0x0D,
+ 0x6F, 0xDB, 0xBE, 0x79, 0xD7, 0xBE, 0x5D, 0xD3, 0x0F, 0xDC, 0x7B, 0xEC, 0xFE, 0x7B, 0x8E, 0x1E, 0x7D, 0xE0, 0xF8, 0x63,
+ 0xC7, 0x4F, 0x9E, 0x3D, 0xF3, 0xF4, 0x83, 0x0F, 0x1C, 0x1F, 0xEA, 0x4E, 0x46, 0xDB, 0x62, 0x05, 0x59, 0x79, 0x78, 0xA1,
+ 0xEB, 0x49, 0x40, 0xD5, 0xA5, 0x95, 0x72, 0x44, 0x51, 0xE6, 0xCB, 0x25, 0x59, 0x06, 0x20, 0x18, 0xE2, 0xA1, 0x32, 0x73,
+ 0xB9, 0xCD, 0x64, 0x2B, 0x36, 0x14, 0x43, 0x2C, 0x2F, 0xE7, 0x64, 0x64, 0x92, 0xC5, 0x00, 0xA2, 0x67, 0xF5, 0x44, 0x93,
+ 0xBB, 0xA7, 0xEE, 0x3C, 0x76, 0xFF, 0x83, 0x3F, 0x38, 0xFE, 0xE8, 0xD6, 0xE1, 0xAD, 0x84, 0x8C, 0xC4, 0x6C, 0xAC, 0x71,
+ 0xD0, 0xD4, 0x90, 0x99, 0xA0, 0xB7, 0x3D, 0xDC, 0x1C, 0x8D, 0xB6, 0xF6, 0xF5, 0x77, 0x8F, 0x0D, 0xF7, 0x6D, 0x60, 0x5A,
+ 0x1F, 0xE9, 0xDF, 0x48, 0x9E, 0x8D, 0x0D, 0x6E, 0x1E, 0x4F, 0x6E, 0xE9, 0x8D, 0x0C, 0x78, 0xAA, 0x5D, 0x3C, 0x66, 0xD0,
+ 0xE9, 0x6B, 0xAC, 0x95, 0x60, 0x62, 0x87, 0xF4, 0x63, 0x9A, 0x4F, 0xA5, 0xAD, 0x0A, 0xBF, 0x4A, 0x4A, 0x9D, 0x52, 0xD2,
+ 0x94, 0xAA, 0x23, 0xE0, 0x97, 0x16, 0x95, 0x42, 0x2C, 0x53, 0x4E, 0xA9, 0xA5, 0x9C, 0xAF, 0x58, 0x7E, 0x76, 0xCE, 0xBA,
+ 0x35, 0x6B, 0xE3, 0x9D, 0x03, 0xBB, 0x77, 0xDE, 0xC5, 0xC4, 0x12, 0x76, 0xB5, 0x09, 0x21, 0xA9, 0x71, 0xD4, 0x94, 0xD7,
+ 0x36, 0x54, 0xDB, 0xC1, 0x04, 0x4F, 0x58, 0xB3, 0x3D, 0xD0, 0xCA, 0x40, 0x1D, 0xEE, 0x69, 0x0B, 0x77, 0x73, 0x12, 0xF2,
+ 0x47, 0x82, 0x8E, 0xB6, 0x90, 0xB3, 0x35, 0xE4, 0x0A, 0x33, 0x1B, 0x39, 0x6A, 0x1C, 0x6C, 0xCF, 0x58, 0x60, 0xAC, 0xB2,
+ 0x55, 0xC0, 0x4A, 0x55, 0x69, 0x25, 0x68, 0x08, 0x5F, 0x85, 0xB5, 0x52, 0x49, 0x69, 0xB6, 0x04, 0x24, 0x8B, 0x90, 0xFC,
+ 0x27, 0xCB, 0xC4, 0xA3, 0x25, 0xE2, 0x39, 0x69, 0xEC, 0x06, 0x64, 0x90, 0x94, 0x95, 0x96, 0xCE, 0x6F, 0xA8, 0xF1, 0x91,
+ 0x2D, 0x07, 0xF6, 0x1D, 0xF1, 0x39, 0xC2, 0x0C, 0x40, 0xB4, 0x77, 0x10, 0xDB, 0xCC, 0x65, 0xD5, 0x65, 0xB5, 0x55, 0xA5,
+ 0x35, 0xE5, 0xA4, 0x6A, 0x65, 0x03, 0x41, 0xAC, 0xAD, 0xA8, 0x27, 0xB7, 0x40, 0x09, 0x62, 0x3A, 0x8F, 0xE8, 0xFC, 0xCE,
+ 0x20, 0x7B, 0xD8, 0xB9, 0x69, 0xD7, 0x03, 0x47, 0x8E, 0xF9, 0x5D, 0x7E, 0x8B, 0xC1, 0x4A, 0x10, 0xAC, 0x7A, 0x2B, 0xD1,
+ 0x60, 0xE7, 0xB8, 0x50, 0x52, 0xC4, 0xD0, 0x20, 0xA5, 0x5C, 0xD6, 0x97, 0xDB, 0xA5, 0x30, 0xCC, 0x65, 0xBE, 0x9A, 0xFF,
+ 0xA9, 0x19, 0x94, 0x37, 0x4B, 0x8C, 0x25, 0xA4, 0x57, 0xB1, 0xA5, 0x74, 0xCF, 0xAE, 0x43, 0x38, 0x80, 0x1B, 0x92, 0x1A,
+ 0x34, 0x56, 0x63, 0x09, 0x66, 0x31, 0x14, 0x9B, 0xF5, 0x16, 0xE1, 0xC9, 0x68, 0x29, 0x36, 0x95, 0x70, 0x4B, 0x88, 0x4D,
+ 0xB5, 0x88, 0xA9, 0xB7, 0x21, 0xD0, 0x19, 0xEE, 0xE9, 0x08, 0xC4, 0xFD, 0xCE, 0xD0, 0xD4, 0x86, 0x1D, 0xF7, 0x4C, 0x1F,
+ 0x21, 0x82, 0x2D, 0x9E, 0x70, 0x5F, 0xF7, 0x00, 0xBC, 0xB0, 0x2C, 0xBB, 0x55, 0xA4, 0x6C, 0x33, 0x05, 0x8B, 0x3C, 0x90,
+ 0x80, 0x04, 0x43, 0xC2, 0x54, 0x4C, 0x42, 0x1B, 0xE4, 0x11, 0x58, 0xF0, 0x24, 0x83, 0x98, 0xBD, 0x3E, 0xBD, 0xD9, 0x13,
+ 0x1C, 0xEC, 0xDD, 0x44, 0x98, 0xC4, 0x5A, 0x45, 0x36, 0x89, 0xC3, 0x90, 0x6F, 0xD0, 0xE5, 0xEA, 0xB4, 0x39, 0x5A, 0x4D,
+ 0xB6, 0x46, 0x93, 0xAB, 0xD5, 0xE5, 0xEB, 0x4D, 0x5A, 0x23, 0x77, 0xA1, 0xD0, 0x5E, 0xEB, 0x6C, 0x76, 0x86, 0x49, 0xF9,
+ 0xDD, 0x3B, 0x0F, 0x1D, 0xBE, 0xEF, 0x91, 0xCE, 0xF6, 0xDE, 0xF4, 0xF5, 0x59, 0x85, 0xF9, 0x05, 0x56, 0xB3, 0xAD, 0xAE,
+ 0xD6, 0xC1, 0x3A, 0x66, 0x93, 0x85, 0x4A, 0x52, 0x50, 0xB9, 0x94, 0x6C, 0x4B, 0xDD, 0x14, 0x6C, 0x7F, 0x8B, 0xE9, 0x5B,
+ 0xC9, 0x92, 0x02, 0x0D, 0xAB, 0x0C, 0xD1, 0x56, 0x83, 0x09, 0xFE, 0x2B, 0x6D, 0xD5, 0xF8, 0x70, 0x3B, 0xFC, 0xE5, 0xC5,
+ 0x95, 0x24, 0x3B, 0x68, 0x18, 0xF8, 0x99, 0x1E, 0x73, 0xD2, 0xB2, 0x72, 0xD2, 0x32, 0x18, 0xD6, 0x72, 0x33, 0xF2, 0xE8,
+ 0xC4, 0x45, 0x9A, 0xA2, 0xB2, 0x92, 0xAA, 0x86, 0x2A, 0x27, 0x99, 0xBE, 0x61, 0x7C, 0xC7, 0xC3, 0xC7, 0xCF, 0xEC, 0xDE,
+ 0x71, 0xF0, 0xDA, 0x6B, 0xAF, 0xBD, 0x65, 0xC5, 0xF2, 0xF4, 0xB5, 0xEB, 0xD2, 0xD6, 0xAC, 0x5D, 0xBF, 0x7A, 0x4D, 0xE6,
+ 0xBA, 0x8C, 0xFC, 0xAC, 0x3C, 0x0A, 0x48, 0x51, 0x99, 0xA8, 0xAB, 0xAB, 0xA8, 0x61, 0x7E, 0x80, 0x12, 0x19, 0x29, 0xA9,
+ 0x9B, 0x52, 0x3A, 0xE5, 0x51, 0x46, 0x0D, 0x86, 0x08, 0xB9, 0x51, 0x63, 0x22, 0x25, 0x71, 0x56, 0x63, 0x6B, 0xEC, 0x89,
+ 0x8D, 0xF9, 0x9B, 0xDA, 0x49, 0x17, 0x38, 0xD0, 0x17, 0x50, 0x8F, 0x39, 0x39, 0xE9, 0xD9, 0xD9, 0xEB, 0x33, 0xB3, 0xD6,
+ 0xA5, 0xC1, 0x22, 0xC8, 0xB8, 0x62, 0xD2, 0x16, 0x21, 0x19, 0xA8, 0x14, 0x75, 0xB7, 0x7D, 0xF2, 0xE0, 0x23, 0x27, 0x7E,
+ 0xE8, 0x71, 0x06, 0x56, 0xDC, 0x78, 0x13, 0x0D, 0x51, 0xA4, 0x76, 0xA1, 0xDE, 0x50, 0xA8, 0x07, 0x8A, 0x59, 0x67, 0x2A,
+ 0xD2, 0x1A, 0x15, 0xE9, 0xEF, 0xAA, 0x63, 0x71, 0xAE, 0xCA, 0x94, 0x40, 0x30, 0x67, 0x65, 0xE8, 0x84, 0x40, 0x03, 0x3D,
+ 0x24, 0x10, 0x0F, 0xD4, 0x57, 0x35, 0x50, 0x47, 0x1B, 0xC6, 0xA6, 0xF6, 0xEF, 0x3B, 0xB2, 0x63, 0xFB, 0x34, 0x51, 0xF0,
+ 0x39, 0x5A, 0xC9, 0xA4, 0x22, 0x9D, 0x59, 0x97, 0xAF, 0x45, 0x23, 0xF2, 0x33, 0xB3, 0x31, 0xA8, 0xE2, 0x1C, 0x8D, 0x25,
+ 0x6A, 0xAC, 0x80, 0x66, 0x26, 0xFB, 0x36, 0x4D, 0x6D, 0xDD, 0x77, 0xCF, 0xDD, 0x0F, 0x76, 0x47, 0xFB, 0x69, 0x3B, 0x16,
+ 0x9D, 0x85, 0xC1, 0x01, 0x10, 0x20, 0x63, 0x08, 0x06, 0x10, 0xA6, 0xCC, 0xC9, 0x76, 0xF9, 0x9C, 0x56, 0x0A, 0x40, 0x65,
+ 0xB8, 0x17, 0x68, 0xE6, 0x6A, 0x52, 0x15, 0x2E, 0x59, 0x68, 0xEC, 0x83, 0x42, 0x23, 0x9D, 0xF5, 0x5A, 0x93, 0xA3, 0xC1,
+ 0xF3, 0xC8, 0x89, 0x33, 0x67, 0xCF, 0x3E, 0x47, 0xAD, 0x25, 0xFB, 0x26, 0x49, 0x58, 0xD2, 0x8B, 0x75, 0x09, 0x90, 0x49,
+ 0xA3, 0x23, 0x1B, 0xF8, 0x05, 0x42, 0x10, 0xF9, 0x4A, 0x11, 0x51, 0x62, 0xC9, 0xBE, 0xCD, 0x77, 0xEC, 0xFE, 0xEE, 0xA1,
+ 0x83, 0x33, 0xB7, 0x4F, 0x1D, 0xE8, 0x8B, 0x8F, 0xC3, 0x0A, 0xEE, 0xB9, 0xA5, 0x26, 0x80, 0x59, 0x9C, 0xE8, 0xAD, 0x94,
+ 0x82, 0x22, 0x65, 0x9B, 0x63, 0x6D, 0x89, 0x50, 0x27, 0x59, 0xE7, 0xE8, 0x0D, 0x8E, 0x49, 0x17, 0xBE, 0x4A, 0x93, 0x17,
+ 0x29, 0x9C, 0x8C, 0x75, 0xEB, 0x6F, 0xBA, 0x71, 0xD9, 0x75, 0xD7, 0x2E, 0xA6, 0xF2, 0x35, 0xF9, 0x86, 0xB3, 0x4F, 0x3C,
+ 0x7F, 0xE2, 0xC4, 0xE9, 0x5D, 0x3B, 0xBE, 0xD3, 0x1B, 0x1D, 0x0D, 0x3A, 0x43, 0x24, 0x80, 0x14, 0x88, 0x8A, 0xA2, 0x72,
+ 0x55, 0xF4, 0x44, 0x67, 0xA0, 0x26, 0xC2, 0x4D, 0x5D, 0x07, 0xEF, 0x3C, 0x72, 0xF2, 0xB1, 0xA7, 0x9F, 0x7C, 0xF2, 0xF9,
+ 0x13, 0x0F, 0x9D, 0x82, 0x2A, 0x39, 0x2F, 0x14, 0x9B, 0x6C, 0x24, 0x9F, 0xA8, 0x47, 0xA3, 0xC5, 0x66, 0xB0, 0x94, 0x1A,
+ 0x05, 0xA0, 0xB9, 0x70, 0x08, 0x97, 0xD6, 0x52, 0x6E, 0x40, 0x03, 0xDB, 0x92, 0x05, 0x05, 0x08, 0xC4, 0x4A, 0x35, 0x55,
+ 0x84, 0x8C, 0x25, 0xC5, 0xBA, 0x22, 0xA2, 0xCE, 0x48, 0x8F, 0x76, 0x2F, 0xBF, 0xF1, 0xE6, 0xFB, 0x0E, 0x3F, 0x72, 0xFA,
+ 0xF4, 0x33, 0x33, 0xF7, 0xFF, 0x00, 0x4C, 0x23, 0xFD, 0x9B, 0x3B, 0x9A, 0xA3, 0x08, 0xF7, 0xD5, 0xCA, 0xB5, 0xBB, 0x6B,
+ 0x3C, 0x0C, 0x0E, 0x41, 0x77, 0x47, 0xBC, 0x33, 0x09, 0xEE, 0xC7, 0x1F, 0x7F, 0x1A, 0x85, 0x84, 0x5D, 0xAF, 0x27, 0x10,
+ 0x69, 0x4F, 0x58, 0x8D, 0x16, 0x96, 0xA2, 0x66, 0xD5, 0x06, 0x20, 0x30, 0x91, 0xA0, 0x8A, 0x24, 0x40, 0xB6, 0x15, 0x8B,
+ 0xDE, 0xC8, 0x0F, 0x6F, 0xE6, 0x26, 0x46, 0x02, 0x7C, 0x43, 0xA9, 0x0A, 0xA8, 0x42, 0x1A, 0x80, 0x78, 0x19, 0x7A, 0x81,
+ 0x4B, 0xE0, 0xF3, 0x32, 0xB2, 0x48, 0xD5, 0x93, 0x27, 0xCF, 0xBD, 0xFC, 0xCA, 0x5B, 0x2F, 0xBE, 0x78, 0xE1, 0xD1, 0x47,
+ 0x9F, 0xDC, 0xB5, 0xEB, 0xAE, 0xB1, 0xA1, 0x6D, 0xC0, 0x4A, 0x44, 0x86, 0x22, 0xA1, 0x78, 0xA7, 0xAF, 0xBB, 0xAB, 0xAD,
+ 0x7F, 0xA8, 0x77, 0xE3, 0x50, 0xFF, 0xE6, 0x1D, 0x3B, 0xA6, 0x9F, 0x38, 0xF7, 0x02, 0xBF, 0xDD, 0xF8, 0x7B, 0x6A, 0xD1,
+ 0x42, 0xF1, 0xBF, 0x18, 0xD1, 0xE9, 0x6E, 0xEB, 0x11, 0xA9, 0xA3, 0x35, 0x4B, 0x86, 0x30, 0xA2, 0x26, 0x00, 0x49, 0x34,
+ 0x34, 0xAF, 0xA2, 0x02, 0xBD, 0xD9, 0x54, 0x8C, 0x9A, 0x15, 0x64, 0xE7, 0x6B, 0x72, 0x0A, 0xC0, 0x5B, 0x66, 0xB1, 0x71,
+ 0x1D, 0x13, 0x0F, 0x88, 0xF3, 0x32, 0xF2, 0x9A, 0x6D, 0x91, 0xAA, 0xDA, 0xAC, 0xFC, 0xBE, 0xC4, 0xE8, 0xE8, 0xD0, 0xA6,
+ 0x1D, 0x53, 0xFB, 0x5E, 0x7C, 0xE1, 0x67, 0xAF, 0xBF, 0xF1, 0x0E, 0xE1, 0x80, 0xB0, 0x83, 0xFB, 0x8F, 0x1C, 0xFA, 0xCE,
+ 0xCC, 0xF4, 0x81, 0xFB, 0xEE, 0xBE, 0xFB, 0xE8, 0xD1, 0x99, 0xC7, 0x4E, 0x9D, 0x3A, 0xFF, 0xEC, 0xB3, 0x2F, 0x9F, 0x3B,
+ 0xF7, 0xC2, 0xC3, 0xC7, 0x4F, 0xE7, 0xE5, 0x14, 0xAE, 0x5A, 0xB1, 0x92, 0xBA, 0xCB, 0x5A, 0xB7, 0x8E, 0xB8, 0x1B, 0xF5,
+ 0x26, 0x40, 0x10, 0x38, 0xB2, 0x5B, 0xCD, 0x21, 0x21, 0xD9, 0x8A, 0x8A, 0x46, 0xEC, 0x9E, 0x00, 0x71, 0x9B, 0xA7, 0x73,
+ 0x33, 0x33, 0xC4, 0x43, 0xFA, 0x22, 0x98, 0xE4, 0x22, 0xB7, 0x30, 0xA2, 0x59, 0x66, 0xB1, 0x70, 0x51, 0xA7, 0xD1, 0x57,
+ 0xDA, 0x2A, 0x28, 0xB4, 0xBA, 0x9A, 0x46, 0x9D, 0xC6, 0x28, 0xFF, 0xF5, 0xD3, 0x16, 0x18, 0xCF, 0x9C, 0x7A, 0xE6, 0xED,
+ 0xB7, 0x3F, 0xB8, 0x78, 0xF1, 0xDD, 0x7F, 0xBA, 0xF0, 0xD6, 0xAB, 0xAF, 0xFE, 0xFC, 0x27, 0x2F, 0x31, 0xFE, 0xBF, 0xF3,
+ 0xEC, 0xF9, 0x97, 0xC0, 0x77, 0xD7, 0xF4, 0x7D, 0xC7, 0x1F, 0xFC, 0x9B, 0xA3, 0x33, 0x27, 0xAB, 0x2A, 0x6A, 0x33, 0x57,
+ 0xAD, 0xD5, 0xE5, 0x69, 0x0A, 0xB3, 0x73, 0x75, 0x79, 0x05, 0xD9, 0xE9, 0x19, 0x85, 0x39, 0x05, 0xF0, 0x6D, 0xD1, 0x59,
+ 0xC1, 0x84, 0x15, 0x6B, 0x2D, 0x0A, 0x9E, 0x48, 0xC0, 0x52, 0x53, 0x05, 0xBE, 0x41, 0x00, 0x2B, 0x25, 0xEA, 0x6D, 0xC0,
+ 0x95, 0x98, 0xCC, 0x12, 0x90, 0x3C, 0x12, 0x2C, 0xD0, 0xF3, 0x87, 0x41, 0xC0, 0x1B, 0x02, 0xCD, 0xFA, 0xB5, 0x69, 0x37,
+ 0x2C, 0x5D, 0xB6, 0x6E, 0xD5, 0xEA, 0xB5, 0x2B, 0x57, 0x81, 0xA9, 0xCC, 0x56, 0xB9, 0x7F, 0xEF, 0xA1, 0xBD, 0x7B, 0x0E,
+ 0x9D, 0x39, 0x73, 0xFE, 0xC2, 0x85, 0x5F, 0xFC, 0xF4, 0xA7, 0x3F, 0x9F, 0x9A, 0xBC, 0x63, 0xED, 0xEA, 0x34, 0x89, 0x78,
+ 0xE9, 0xD2, 0x1B, 0xBA, 0xA3, 0x83, 0xF1, 0xAE, 0x24, 0x35, 0x01, 0xC1, 0x18, 0xA2, 0x65, 0x2A, 0x34, 0x59, 0x34, 0x46,
+ 0x00, 0x89, 0x82, 0xD7, 0x5A, 0xA4, 0x29, 0x32, 0x58, 0x15, 0x45, 0xF4, 0x73, 0xD1, 0xDE, 0x00, 0x21, 0xC3, 0xC9, 0x09,
+ 0x5F, 0x4B, 0xCD, 0x25, 0xA0, 0x11, 0x47, 0x73, 0x09, 0xC9, 0xAE, 0xCF, 0xD7, 0xA2, 0xCE, 0x19, 0x69, 0x99, 0x8C, 0x6F,
+ 0x69, 0xAB, 0xD6, 0xA0, 0xCB, 0xE8, 0x0D, 0x8A, 0xBC, 0x62, 0xF9, 0xCD, 0xCB, 0x97, 0xDD, 0x20, 0x7D, 0x2F, 0x5E, 0x7C,
+ 0x3D, 0x71, 0xAF, 0x2C, 0xAF, 0x59, 0xB4, 0x68, 0x11, 0x7F, 0x89, 0xAE, 0x5C, 0x71, 0xCB, 0xAA, 0x95, 0xB7, 0x5E, 0x73,
+ 0x8D, 0xB2, 0x76, 0xF5, 0xBA, 0x64, 0xFF, 0x06, 0x7D, 0x01, 0x8A, 0xA0, 0x55, 0xB5, 0x47, 0xC8, 0x8F, 0x48, 0x47, 0x8D,
+ 0x99, 0x34, 0x82, 0x02, 0x64, 0x8C, 0x13, 0x45, 0x10, 0xA0, 0xFA, 0x2B, 0xB5, 0xAA, 0xEE, 0xCD, 0x56, 0x70, 0xCC, 0x41,
+ 0x31, 0x97, 0x90, 0x37, 0xEA, 0x15, 0x01, 0x91, 0x77, 0x48, 0x64, 0xDA, 0x2A, 0x4A, 0xAF, 0x72, 0xAE, 0x21, 0x93, 0x38,
+ 0xA2, 0xC8, 0x94, 0x24, 0xFE, 0x16, 0x2F, 0x5E, 0xB4, 0xEA, 0xB6, 0x95, 0xCB, 0x96, 0x2C, 0x95, 0xC8, 0xF8, 0x77, 0x36,
+ 0x7D, 0x4D, 0x5A, 0x56, 0xDA, 0x7A, 0x1E, 0xE0, 0x67, 0x13, 0x74, 0xD2, 0x89, 0xD9, 0xBF, 0x36, 0x37, 0x5F, 0xCA, 0xE0,
+ 0x55, 0x6E, 0x04, 0x0E, 0x91, 0xDA, 0x5A, 0x8B, 0xA5, 0xB0, 0x48, 0x49, 0x71, 0x30, 0x0F, 0x87, 0x15, 0x10, 0x5C, 0x97,
+ 0x65, 0x25, 0x4C, 0x9D, 0xD4, 0x84, 0xE8, 0xA9, 0x3B, 0x13, 0x62, 0x5F, 0xA0, 0x83, 0x30, 0x0C, 0x4C, 0xA4, 0xBF, 0xAB,
+ 0xDA, 0xB9, 0x7A, 0xE5, 0x2A, 0x1A, 0x53, 0x76, 0x5A, 0x16, 0xC7, 0xA5, 0x4B, 0x97, 0xC2, 0x13, 0xD1, 0xCC, 0x4D, 0x47,
+ 0xB2, 0x73, 0x31, 0xB8, 0x24, 0xB2, 0x06, 0x9D, 0x11, 0xCD, 0xA3, 0x1A, 0x8C, 0x1A, 0x1A, 0x90, 0xD8, 0xA1, 0x54, 0x67,
+ 0x0C, 0x28, 0x98, 0x50, 0x6A, 0xE1, 0x58, 0x0D, 0xD6, 0xFF, 0xB7, 0x12, 0x22, 0xA8, 0x5E, 0x17, 0xB9, 0xC5, 0xFB, 0x6A,
+ 0x89, 0xCE, 0xB1, 0x4D, 0x26, 0xEA, 0x8B, 0xF4, 0x79, 0xA2, 0x07, 0x91, 0x58, 0xB0, 0x9D, 0xBE, 0x7A, 0x6D, 0x61, 0xAE,
+ 0x68, 0x1A, 0xE8, 0x53, 0xE6, 0xDA, 0xF5, 0x74, 0x06, 0xE8, 0xA4, 0x75, 0x40, 0xA1, 0x21, 0x57, 0x70, 0x49, 0xB9, 0x00,
+ 0x97, 0x9E, 0x3F, 0x36, 0x30, 0x6E, 0x56, 0x19, 0x62, 0x4D, 0x21, 0xD6, 0x1A, 0x33, 0x50, 0xE4, 0xB2, 0x48, 0xBC, 0xF2,
+ 0x57, 0x70, 0x98, 0xAC, 0x20, 0x90, 0x38, 0xA4, 0x15, 0x1B, 0x8B, 0x64, 0x62, 0xC9, 0x5A, 0x10, 0xB0, 0x74, 0x66, 0x53,
+ 0x9E, 0x68, 0x87, 0x9D, 0xA1, 0x4E, 0x06, 0x1D, 0x1A, 0x2A, 0x1C, 0x68, 0x0B, 0x75, 0xB8, 0xC7, 0x90, 0x4D, 0x68, 0x03,
+ 0x04, 0x88, 0xE7, 0xDA, 0x67, 0x81, 0x8E, 0x36, 0x42, 0xE0, 0xD0, 0x94, 0x2D, 0xA3, 0xDB, 0x66, 0xEE, 0x39, 0x06, 0x6D,
+ 0x42, 0x78, 0xB4, 0xA2, 0xA1, 0xD2, 0xEC, 0x30, 0x15, 0x90, 0x41, 0x00, 0x4A, 0x39, 0x9E, 0x77, 0x42, 0x0E, 0xAB, 0x13,
+ 0xD6, 0x3C, 0x13, 0x7F, 0x02, 0x19, 0x08, 0xB6, 0x0A, 0x48, 0x53, 0x44, 0x6E, 0x32, 0x89, 0xF2, 0x1B, 0xC1, 0x66, 0x2E,
+ 0x81, 0x12, 0x19, 0x47, 0x59, 0x41, 0xF2, 0x3C, 0x15, 0x56, 0xF6, 0x6D, 0x2C, 0xD4, 0xF2, 0x3C, 0x84, 0xE5, 0x66, 0xE7,
+ 0x30, 0x43, 0xEE, 0xDD, 0xBE, 0x7F, 0xF3, 0xF8, 0x24, 0xDD, 0x97, 0x35, 0x65, 0xE8, 0xD5, 0xB7, 0xB4, 0x84, 0x52, 0xA1,
+ 0x9A, 0xE6, 0x70, 0xD0, 0x16, 0xE6, 0xB9, 0x4F, 0x69, 0xB9, 0xC5, 0x70, 0x15, 0x9C, 0xA1, 0x44, 0xA5, 0x47, 0x18, 0x12,
+ 0x0A, 0x38, 0x7C, 0xF0, 0x23, 0x89, 0x89, 0x16, 0x3E, 0x24, 0x9A, 0xD4, 0x46, 0xD9, 0xAE, 0x1C, 0x27, 0x52, 0x69, 0xC7,
+ 0xC3, 0x3C, 0xB0, 0xFA, 0xD6, 0xDB, 0x6A, 0xAA, 0xEA, 0xF9, 0xE7, 0x2A, 0xDA, 0xD2, 0x45, 0x03, 0xE5, 0x4F, 0x1C, 0x40,
+ 0x00, 0x85, 0xD7, 0x59, 0x93, 0xA3, 0x22, 0xA7, 0xAD, 0x39, 0x3E, 0x0C, 0xA2, 0xCF, 0xCD, 0xC5, 0x88, 0x51, 0x57, 0xF6,
+ 0xE1, 0xB9, 0x6E, 0x2C, 0x64, 0x54, 0x96, 0x03, 0xAF, 0xC9, 0x94, 0x0F, 0x37, 0xB7, 0xF3, 0x9B, 0x49, 0x64, 0xEB, 0x55,
+ 0x3E, 0xA4, 0x7B, 0x91, 0xA4, 0x1A, 0x71, 0x14, 0x6D, 0x51, 0x0D, 0x84, 0x10, 0x9E, 0x7C, 0x2D, 0xD1, 0x24, 0xC9, 0x96,
+ 0xDF, 0x78, 0x53, 0x7B, 0x30, 0xD6, 0x58, 0xE7, 0xA2, 0xE1, 0xCB, 0x28, 0xAB, 0xB2, 0x04, 0xA3, 0xFC, 0xBE, 0xD1, 0x29,
+ 0x73, 0x4D, 0xC4, 0x60, 0x16, 0xC3, 0xF6, 0x9F, 0x21, 0x50, 0xE7, 0x01, 0x3D, 0xC9, 0xAB, 0xFA, 0x10, 0x61, 0x12, 0x91,
+ 0xC2, 0x0D, 0xA3, 0x1D, 0xB4, 0x6F, 0x48, 0x4E, 0xC6, 0x3B, 0xFB, 0x56, 0xAE, 0xBC, 0x15, 0x1F, 0x0C, 0x1B, 0x2C, 0x9A,
+ 0x2A, 0x19, 0x89, 0x49, 0xB2, 0xF5, 0x17, 0x80, 0x74, 0xD9, 0x05, 0x6B, 0xF8, 0x4B, 0x60, 0xF9, 0xCD, 0xFC, 0xFF, 0xD7,
+ 0xD5, 0xD6, 0xEB, 0x73, 0x04, 0x0B, 0x33, 0x72, 0x99, 0xA2, 0x74, 0x05, 0x28, 0x48, 0x01, 0xA0, 0x95, 0xB9, 0x41, 0x64,
+ 0xAE, 0x9B, 0xCC, 0x49, 0xB8, 0x4C, 0xDE, 0x94, 0x89, 0x18, 0xA9, 0x68, 0x64, 0xBC, 0x11, 0x46, 0x4D, 0x81, 0xD6, 0xDD,
+ 0xE8, 0x41, 0x66, 0x56, 0xDF, 0xB2, 0x4A, 0x26, 0xB2, 0x88, 0x97, 0xC6, 0x20, 0x94, 0xF7, 0x2A, 0x0E, 0x09, 0x25, 0x65,
+ 0xEC, 0x5E, 0xD6, 0x5A, 0x6E, 0x66, 0x16, 0x9A, 0xB4, 0x78, 0xF1, 0x62, 0x66, 0x6D, 0x9B, 0xB9, 0x94, 0x11, 0x56, 0x74,
+ 0x46, 0x55, 0xD2, 0xA8, 0x47, 0x65, 0x9E, 0x57, 0x21, 0x97, 0xB2, 0x88, 0x30, 0xF2, 0x9F, 0x82, 0x44, 0xAC, 0x38, 0x49,
+ 0x65, 0x03, 0xF1, 0x66, 0x13, 0x50, 0xB2, 0x6C, 0xD9, 0x32, 0x54, 0xF8, 0xFA, 0xEB, 0xAF, 0x47, 0xA6, 0x19, 0xE6, 0x65,
+ 0x7E, 0x08, 0x62, 0x0A, 0x45, 0x74, 0xF8, 0x99, 0x2C, 0xC2, 0x34, 0x0F, 0x8D, 0x48, 0xEA, 0x02, 0x11, 0x1D, 0x4D, 0x4E,
+ 0x1E, 0x72, 0x40, 0x03, 0x59, 0xB2, 0x64, 0x89, 0x90, 0xF5, 0x45, 0xD7, 0x32, 0x4D, 0x23, 0xB3, 0x5C, 0x97, 0x0C, 0xFD,
+ 0x1F, 0x2E, 0xB6, 0xCD, 0xAB, 0xF2, 0x82, 0x27, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60,
+ 0x82
+};
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltLeaks.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltLeaks.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,98 @@
+/*****************************************************************
+|
+| Platinum - Leaks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltLeaks.h"
+
+#if defined(WIN32)
+#include
+#include
+#include "string.h"
+
+/*----------------------------------------------------------------------
+| PLT_Leak_AllocHook
++---------------------------------------------------------------------*/
+int PLT_Leak_AllocHook(int alloc_type,
+ void* user_data,
+ size_t size,
+ int block_type,
+ long request_number,
+ const unsigned char* filename,
+ int line_number)
+{
+ (void)alloc_type;
+ (void)user_data;
+ (void)size;
+ (void)block_type;
+ (void)request_number;
+ (void)line_number;
+ (void)filename;
+ /*
+ * if (request_number == 34556)
+ * return 2;
+ *
+ */
+ return 1;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Leak_Enable
++---------------------------------------------------------------------*/
+void
+PLT_Leak_Enable(void)
+{
+#if defined(_DEBUG)
+ /*
+ * If you want VC to dump file name and line number of leaking resource
+ * use #define _CRTDBG_MAP_ALLOC in suspected file (project)
+ * and #include "crtdbg.h" in suspected file
+ */
+_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |
+ _CRTDBG_CHECK_ALWAYS_DF |
+ _CRTDBG_LEAK_CHECK_DF);
+
+_CrtSetAllocHook(PLT_Leak_AllocHook );
+
+#endif
+}
+#else
+/*----------------------------------------------------------------------
+| PLT_Leak_Enable
++---------------------------------------------------------------------*/
+void
+PLT_Leak_Enable(void)
+{
+}
+#endif
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltLeaks.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltLeaks.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,50 @@
+/*****************************************************************
+|
+| Platinum - Leaks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_LEAKS_H_
+#define _PLT_LEAKS_H_
+
+/*----------------------------------------------------------------------
+| functions
++---------------------------------------------------------------------*/
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+void PLT_Leak_Enable(void);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* _PLT_LEAKS_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltMetadataHandler.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltMetadataHandler.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,89 @@
+/*****************************************************************
+|
+| Platinum - Metadata Handler
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMetadataHandler.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.metadata.handler")
+
+/*----------------------------------------------------------------------
+| PLT_MetadataHandler::Load
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MetadataHandler::LoadFile(const char* filename)
+{
+ NPT_File file(filename);
+ NPT_Result res = file.Open(NPT_FILE_OPEN_MODE_READ);
+ if (res != NPT_SUCCESS) {
+ NPT_LOG_SEVERE_2("error %d opening : %s\n", res, filename);
+ } else {
+ NPT_InputStreamReference stream;
+ res = file.GetInputStream(stream);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_SEVERE_2("error %d getting input stream: %s\n", res, filename);
+ }
+ res = Load(*stream);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_SEVERE_2("error %d reading header: %s\n", res, filename);
+ }
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MetadataHandler::Save
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MetadataHandler::SaveFile(const char* filename)
+{
+ NPT_File file(filename);
+ NPT_Result res = file.Open(NPT_FILE_OPEN_MODE_WRITE);
+ if (res != NPT_SUCCESS) {
+ NPT_LOG_SEVERE_2("error %d opening : %s\n", res, filename);
+ } else {
+ NPT_OutputStreamReference stream;
+ res = file.GetOutputStream(stream);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_SEVERE_2("error %d getting output stream: %s\n", res, filename);
+ }
+ res = Save(*stream);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_SEVERE_2("error %d writing header: %s\n", res, filename);
+ }
+ }
+
+ return res;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltMetadataHandler.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltMetadataHandler.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,90 @@
+/*****************************************************************
+|
+| Platinum - Metadata Handler
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_METADATA_HANDLER_H_
+#define _PLT_METADATA_HANDLER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_MetadataHandler class
++---------------------------------------------------------------------*/
+class PLT_MetadataHandler
+{
+public:
+ virtual ~PLT_MetadataHandler() {}
+
+ // metadata overridables
+ virtual bool HandleExtension(const char* extension) = 0;
+ virtual NPT_Result Load(NPT_InputStream& stream,
+ NPT_TimeInterval sleeptime = NPT_TimeInterval(0, 10000),
+ NPT_TimeInterval timeout = NPT_TimeInterval(30, 0)) = 0;
+ virtual NPT_Result Save(NPT_OutputStream& stream,
+ NPT_TimeInterval sleeptime = NPT_TimeInterval(0, 10000),
+ NPT_TimeInterval timeout = NPT_TimeInterval(30, 0)) = 0;
+
+ virtual const char* GetLicenseData(NPT_String& licenseData) = 0;
+ virtual NPT_Result GetCoverArtData(char*& caData, int& len) = 0;
+ virtual const char* GetContentID(NPT_String& value) = 0;
+ virtual const char* GetTitle(NPT_String& value) = 0;
+ virtual const char* GetDescription(NPT_String& value) = 0;
+ virtual NPT_Result GetDuration(NPT_UInt32& seconds) = 0;
+ virtual const char* GetProtection(NPT_String& protection) = 0;
+ virtual NPT_Result GetYear(NPT_Size& year) = 0;
+
+ // helper functions
+ virtual NPT_Result LoadFile(const char* filename);
+ virtual NPT_Result SaveFile(const char* filename);
+};
+
+/*----------------------------------------------------------------------
+| PLT_MetadataHandlerFinder
++---------------------------------------------------------------------*/
+class PLT_MetadataHandlerFinder
+{
+public:
+ // methods
+ PLT_MetadataHandlerFinder(const char* extension) : m_Extension(extension) {}
+ bool operator()(PLT_MetadataHandler* const & handler) const {
+ return handler->HandleExtension(m_Extension) ? true : false;
+ }
+
+private:
+ // members
+ NPT_String m_Extension;
+};
+
+#endif /* _PLT_METADATA_HANDLER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltRingBufferStream.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltRingBufferStream.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,213 @@
+/*****************************************************************
+|
+| Platinum - Ring Buffer Stream
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltRingBufferStream.h"
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| defines
++---------------------------------------------------------------------*/
+#ifdef max
+#undef max
+#endif
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+
+#ifdef min
+#undef min
+#endif
+#define min(a,b) (((a) < (b)) ? (a) : (b))
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::PLT_RingBufferStream
++---------------------------------------------------------------------*/
+PLT_RingBufferStream::PLT_RingBufferStream(NPT_Size buffer_size,
+ bool blocking /* = true */) :
+ m_TotalBytesRead(0),
+ m_TotalBytesWritten(0),
+ m_Eos(false),
+ m_Blocking(blocking)
+{
+ m_RingBuffer = new NPT_RingBuffer(buffer_size);
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::PLT_RingBufferStream
++---------------------------------------------------------------------*/
+PLT_RingBufferStream::PLT_RingBufferStream(NPT_RingBufferReference& buffer,
+ bool blocking /* = true */) :
+ m_RingBuffer(buffer),
+ m_TotalBytesRead(0),
+ m_TotalBytesWritten(0),
+ m_Eos(false),
+ m_Blocking(blocking)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::~PLT_RingBufferStream
++---------------------------------------------------------------------*/
+PLT_RingBufferStream::~PLT_RingBufferStream()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_RingBufferStream::Read(void* buffer,
+ NPT_Size max_bytes_to_read,
+ NPT_Size* bytes_read /*= NULL*/)
+{
+ NPT_Size bytes_avail, to_read;
+ NPT_Size last_read = 0;
+
+ // reset output param first
+ if (bytes_read) *bytes_read = 0;
+
+ // wait for data
+ do {
+ {
+ NPT_AutoLock autoLock(m_Lock);
+ if (m_RingBuffer->GetContiguousAvailable()) break;
+ }
+
+ if (m_Eos || m_RingBuffer->IsClosed()) {
+ return NPT_ERROR_EOS;
+ } else if (!m_Blocking) {
+ return NPT_ERROR_WOULD_BLOCK;
+ }
+
+ // sleep and try again
+ NPT_System::Sleep(NPT_TimeInterval(0, 10000));
+ } while (1);
+
+ {
+ NPT_AutoLock autoLock(m_Lock);
+
+ // try twice in case we looped
+ for (int i=0; i<2; i++) {
+ bytes_avail = m_RingBuffer->GetContiguousAvailable();
+ to_read = min(max_bytes_to_read - last_read, bytes_avail);
+
+ // break if nothing to read
+ if (to_read == 0) break;
+
+ // read into buffer and advance
+ NPT_CHECK(m_RingBuffer->Read((unsigned char*)buffer+last_read, to_read));
+
+ // keep track of the total bytes we have read so far
+ m_TotalBytesRead += to_read;
+ last_read += to_read;
+
+ if (bytes_read) *bytes_read += to_read;
+ }
+ }
+
+ // we have read some chars, so return success
+ // even if we have read less than asked
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::Write
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_RingBufferStream::Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written /*= NULL*/)
+{
+ NPT_Size space_avail, to_write;
+ NPT_Size last_written = 0;
+
+ // reset output param first
+ if (bytes_written) *bytes_written = 0;
+
+ // wait for space
+ do {
+ {
+ NPT_AutoLock autoLock(m_Lock);
+ if (m_RingBuffer->GetContiguousSpace()) break;
+ }
+
+ if (m_Eos || m_RingBuffer->IsClosed()) {
+ return NPT_ERROR_EOS;
+ } else if (!m_Blocking) {
+ return NPT_ERROR_WOULD_BLOCK;
+ }
+
+ // sleep and try again
+ NPT_System::Sleep(NPT_TimeInterval(0, 10000));
+ } while (1);
+
+ {
+ NPT_AutoLock autoLock(m_Lock);
+
+ // try twice in case we looped
+ for (int i=0; i<2; i++) {
+ space_avail = m_RingBuffer->GetContiguousSpace();
+ to_write = min(bytes_to_write - last_written, space_avail);
+
+ // break if no space to write
+ if (to_write == 0) break;
+
+ // write into buffer
+ NPT_CHECK(m_RingBuffer->Write((unsigned char*)buffer+last_written, to_write));
+
+ m_TotalBytesWritten += to_write;
+ last_written += to_write;
+
+ if (bytes_written) *bytes_written += to_write;
+ }
+ }
+
+ // we have written some chars, so return success
+ // even if we have written less than provided
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream::Flush
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_RingBufferStream::Flush()
+{
+ NPT_AutoLock autoLock(m_Lock);
+
+ m_RingBuffer->Flush();
+ m_TotalBytesRead = 0;
+ m_TotalBytesWritten = 0;
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltRingBufferStream.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltRingBufferStream.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,113 @@
+/*****************************************************************
+|
+| Platinum - Ring buffer stream
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_RING_BUFFER_STREAM_H_
+#define _PLT_RING_BUFFER_STREAM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptStreams.h"
+#include "NptRingBuffer.h"
+#include "NptThreads.h"
+
+/*----------------------------------------------------------------------
+| PLT_RingBufferStream class
++---------------------------------------------------------------------*/
+class PLT_RingBufferStream : public NPT_DelegatingInputStream,
+ public NPT_DelegatingOutputStream
+{
+public:
+ PLT_RingBufferStream(NPT_Size buffer_size = 4096, bool blocking = true);
+ PLT_RingBufferStream(NPT_RingBufferReference& buffer, bool blocking = true);
+ virtual ~PLT_RingBufferStream();
+
+ void SetEos() {m_Eos = true;}
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = NULL);
+ NPT_Result GetSize(NPT_LargeSize& size) {
+ NPT_AutoLock autoLock(m_Lock);
+ size = m_TotalBytesWritten;
+ return NPT_SUCCESS;
+ }
+ NPT_Result GetAvailable(NPT_LargeSize& available) {
+ NPT_AutoLock autoLock(m_Lock);
+ available = m_RingBuffer->GetAvailable();
+ return NPT_SUCCESS;
+ }
+
+ // NPT_OutputStream methods
+ NPT_Result Write(const void* buffer,
+ NPT_Size bytes_to_write,
+ NPT_Size* bytes_written = NULL);
+ NPT_Result Flush();
+ NPT_Result Close() { m_RingBuffer->Close(); return NPT_SUCCESS; }
+
+protected:
+ // NPT_DelegatingInputStream methods
+ NPT_Result InputSeek(NPT_Position offset) {
+ NPT_COMPILER_UNUSED(offset);
+ return NPT_FAILURE;
+ }
+ NPT_Result InputTell(NPT_Position& offset) {
+ NPT_AutoLock autoLock(m_Lock);
+ offset = m_TotalBytesRead;
+ return NPT_SUCCESS;
+ }
+
+ // NPT_DelegatingOutputStream methods
+ NPT_Result OutputSeek(NPT_Position offset) {
+ NPT_COMPILER_UNUSED(offset);
+ return NPT_FAILURE;
+ }
+ NPT_Result OutputTell(NPT_Position& offset) {
+ NPT_AutoLock autoLock(m_Lock);
+ offset = m_TotalBytesWritten;
+ return NPT_SUCCESS;
+ }
+
+private:
+ NPT_RingBufferReference m_RingBuffer;
+ NPT_Offset m_TotalBytesRead;
+ NPT_Offset m_TotalBytesWritten;
+ NPT_Mutex m_Lock;
+ bool m_Eos;
+ bool m_Blocking;
+};
+
+typedef NPT_Reference PLT_RingBufferStreamReference;
+
+#endif // _PLT_RING_BUFFER_STREAM_H_
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltService.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltService.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,795 @@
+/*****************************************************************
+|
+| Platinum - Service
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltService.h"
+#include "PltSsdp.h"
+#include "PltUPnP.h"
+#include "PltDeviceData.h"
+#include "PltXmlHelper.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.service")
+
+/*----------------------------------------------------------------------
+| PLT_Service::PLT_Service
++---------------------------------------------------------------------*/
+PLT_Service::PLT_Service(PLT_DeviceData* device,
+ const char* type,
+ const char* id,
+ const char* last_change_namespace /* = NULL */) :
+ m_Device(device),
+ m_ServiceType(type),
+ m_ServiceID(id),
+ m_EventTask(NULL),
+ m_EventingPaused(false),
+ m_LastChangeNamespace(last_change_namespace)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::~PLT_Service
++---------------------------------------------------------------------*/
+PLT_Service::~PLT_Service()
+{
+ Cleanup();
+}
+
+/*----------------------------------------------------------------------
+ | PLT_Service::~PLT_Service
+ +---------------------------------------------------------------------*/
+ void
+ PLT_Service::Cleanup()
+ {
+ m_ActionDescs.Apply(NPT_ObjectDeleter());
+ m_StateVars.Apply(NPT_ObjectDeleter());
+ m_Subscribers.Apply(NPT_ObjectDeleter());
+
+ m_ActionDescs.Clear();
+ m_StateVars.Clear();
+ m_Subscribers.Clear();
+ }
+
+/*----------------------------------------------------------------------
+| PLT_Service::GetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::GetSCPDXML(NPT_String& scpd)
+{
+ NPT_Result res;
+
+ // it is required to have at least 1 state variable
+ if (m_StateVars.GetItemCount() == 0) return NPT_FAILURE;
+
+ NPT_XmlElementNode* spec = NULL;
+ NPT_XmlElementNode* actionList = NULL;
+ NPT_XmlElementNode* top = new NPT_XmlElementNode("scpd");
+ NPT_XmlElementNode* serviceStateTable = NULL;
+ NPT_CHECK_LABEL_SEVERE(res = top->SetNamespaceUri("", "urn:schemas-upnp-org:service-1-0"), cleanup);
+
+ // add spec version
+ spec = new NPT_XmlElementNode("specVersion");
+ NPT_CHECK_LABEL_SEVERE(res = top->AddChild(spec), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(spec, "major", "1"), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::AddChildText(spec, "minor", "0"), cleanup);
+
+ // add actions
+ actionList = new NPT_XmlElementNode("actionList");
+ NPT_CHECK_LABEL_SEVERE(res = top->AddChild(actionList), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = m_ActionDescs.ApplyUntil(PLT_GetSCPDXMLIterator(actionList),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)), cleanup);
+
+ // add service state table
+ serviceStateTable = new NPT_XmlElementNode("serviceStateTable");
+ NPT_CHECK_LABEL_SEVERE(res = top->AddChild(serviceStateTable), cleanup);
+ NPT_CHECK_LABEL_SEVERE(res = m_StateVars.ApplyUntil(PLT_GetSCPDXMLIterator(serviceStateTable),
+ NPT_UntilResultNotEquals(NPT_SUCCESS)), cleanup);
+
+ // serialize node
+ NPT_CHECK_LABEL_SEVERE(res = PLT_XmlHelper::Serialize(*top, scpd), cleanup);
+
+cleanup:
+ delete top;
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::ToXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::GetDescription(NPT_XmlElementNode* parent, NPT_XmlElementNode** service_out /* = NULL */)
+{
+ NPT_XmlElementNode* service = new NPT_XmlElementNode("service");
+ if (service_out) {
+ *service_out = service;
+ }
+ NPT_CHECK_SEVERE(parent->AddChild(service));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "serviceType", m_ServiceType));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "serviceId", m_ServiceID));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "SCPDURL", GetSCPDURL()));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "controlURL", GetControlURL()));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(service, "eventSubURL", GetEventSubURL()));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::InitURLs
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::InitURLs(const char* service_name,
+ const char* device_uuid)
+{
+ m_SCPDURL = service_name;
+ m_SCPDURL += "/" + NPT_String(device_uuid) + NPT_String("/scpd.xml");
+ m_ControlURL = service_name;
+ m_ControlURL += "/" + NPT_String(device_uuid) + NPT_String("/control.xml");
+ m_EventSubURL = service_name;
+ m_EventSubURL += "/" + NPT_String(device_uuid) + NPT_String("/event.xml");
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::SetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::SetSCPDXML(const char* scpd)
+{
+ if (scpd == NULL) return NPT_FAILURE;
+
+ Cleanup();
+
+ NPT_XmlParser parser;
+ NPT_XmlNode* tree = NULL;
+ NPT_Result res;
+ NPT_Array stateVariables;
+ NPT_Array actions;
+ NPT_XmlElementNode* root;
+ NPT_XmlElementNode* actionList;
+ NPT_XmlElementNode* stateTable;
+
+ res = parser.Parse(scpd, tree);
+ NPT_CHECK_LABEL_FATAL(res, failure);
+
+ // make sure root tag is right
+ root = tree->AsElementNode();
+ if (!root || NPT_String::Compare(root->GetTag(), "scpd")) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // make sure we have required children presents
+ stateTable = PLT_XmlHelper::GetChild(root, "serviceStateTable");
+ if (!stateTable || stateTable->GetChildren().GetItemCount() == 0) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // stateVariable table
+ if (NPT_FAILED(PLT_XmlHelper::GetChildren(stateTable,
+ stateVariables,
+ "stateVariable"))) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ for (int k = 0 ; k < (int)stateVariables.GetItemCount(); k++) {
+
+ NPT_String name, type, send;
+ PLT_XmlHelper::GetChildText(stateVariables[k], "name", name);
+ PLT_XmlHelper::GetChildText(stateVariables[k], "dataType", type);
+ PLT_XmlHelper::GetAttribute(stateVariables[k], "sendEvents", send);
+
+ if (name.GetLength() == 0 || type.GetLength() == 0) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ PLT_StateVariable* variable = new PLT_StateVariable(this);
+ m_StateVars.Add(variable);
+
+ variable->m_Name = name;
+ variable->m_DataType = type;
+ variable->m_IsSendingEvents = IsTrue(send); // could it be true/false ?
+ PLT_XmlHelper::GetChildText(stateVariables[k], "defaultValue", variable->m_DefaultValue);
+
+ NPT_XmlElementNode* allowedValueList = PLT_XmlHelper::GetChild(stateVariables[k], "allowedValueList");
+ if (allowedValueList) {
+ NPT_Array allowedValues;
+ PLT_XmlHelper::GetChildren(allowedValueList, allowedValues, "allowedValue");
+ for (int l = 0 ; l < (int)allowedValues.GetItemCount(); l++) {
+ const NPT_String* text = allowedValues[l]->GetText();
+ if (text) {
+ variable->m_AllowedValues.Add(new NPT_String(*text));
+ }
+ }
+ } else {
+ NPT_XmlElementNode* allowedValueRange = PLT_XmlHelper::GetChild(stateVariables[k], "allowedValueRange");
+ if (allowedValueRange) {
+ NPT_String min, max, step;
+ PLT_XmlHelper::GetChildText(allowedValueRange, "minimum", min);
+ PLT_XmlHelper::GetChildText(allowedValueRange, "maximum", max);
+ PLT_XmlHelper::GetChildText(allowedValueRange, "step", step);
+
+ if (min.GetLength() == 0 || max.GetLength() == 0) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ variable->m_AllowedValueRange = new NPT_AllowedValueRange;
+ NPT_ParseInteger32(min, variable->m_AllowedValueRange->min_value);
+ NPT_ParseInteger32(max, variable->m_AllowedValueRange->max_value);
+ variable->m_AllowedValueRange->step = -1;
+
+ if (step.GetLength() != 0) {
+ NPT_ParseInteger(step, variable->m_AllowedValueRange->step);
+ }
+ }
+ }
+ }
+
+ // actions
+ actionList = PLT_XmlHelper::GetChild(root, "actionList");
+ if (actionList) {
+ if (NPT_FAILED(PLT_XmlHelper::GetChildren(actionList, actions, "action"))) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ for (int i = 0 ; i < (int)actions.GetItemCount(); i++) {
+ NPT_String action_name;
+ PLT_XmlHelper::GetChildText(actions[i], "name", action_name);
+ if (action_name.GetLength() == 0) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ PLT_ActionDesc* action_desc = new PLT_ActionDesc(action_name, this);
+ m_ActionDescs.Add(action_desc);
+
+ // action arguments
+ NPT_XmlElementNode* argumentList = PLT_XmlHelper::GetChild(actions[i], "argumentList");
+ if (argumentList == NULL || !argumentList->GetChildren().GetItemCount())
+ continue; // no arguments is ok I guess
+
+ NPT_Array arguments;
+ NPT_CHECK_LABEL_SEVERE(PLT_XmlHelper::GetChildren(argumentList, arguments, "argument"), failure);
+
+ bool foundRetValue = false;
+ for (int j = 0 ; j < (int)arguments.GetItemCount(); j++) {
+ NPT_String name, direction, relatedStateVar;
+ PLT_XmlHelper::GetChildText(arguments[j], "name", name);
+ PLT_XmlHelper::GetChildText(arguments[j], "direction", direction);
+ PLT_XmlHelper::GetChildText(arguments[j], "relatedStateVariable", relatedStateVar);
+
+ if (name.GetLength() == 0 || direction.GetLength() == 0 || relatedStateVar.GetLength() == 0) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ // make sure the related state variable exists
+ PLT_StateVariable* variable = FindStateVariable(relatedStateVar);
+ if (variable == NULL) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ }
+
+ bool bReturnValue = false;
+ NPT_XmlElementNode* retval_node = PLT_XmlHelper::GetChild(arguments[j], "retVal");
+ if (retval_node) {
+ // verify this is the only retVal we've had
+ if (foundRetValue) {
+ NPT_CHECK_LABEL_SEVERE(NPT_ERROR_INVALID_SYNTAX, failure);
+ } else {
+ bReturnValue = true;
+ foundRetValue = true;
+ }
+ }
+ action_desc->GetArgumentDescs().Add(new PLT_ArgumentDesc(name, direction, variable, bReturnValue));
+ }
+ }
+ }
+
+ // delete the tree
+ delete tree;
+ return NPT_SUCCESS;
+
+failure:
+ NPT_LOG_FATAL_1("Failed to parse scpd: %s", scpd);
+ delete tree;
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::FindActionDesc
++---------------------------------------------------------------------*/
+PLT_ActionDesc*
+PLT_Service::FindActionDesc(const char* name)
+{
+ PLT_ActionDesc* action = NULL;
+ NPT_ContainerFind(m_ActionDescs, PLT_ActionDescNameFinder(this, name), action);
+ return action;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::FindStateVariable
++---------------------------------------------------------------------*/
+PLT_StateVariable*
+PLT_Service::FindStateVariable(const char* name)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ return stateVariable;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::GetStateVariableValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::GetStateVariableValue(const char* name, NPT_String& value)
+{
+ PLT_StateVariable* stateVariable = FindStateVariable(name);
+ NPT_CHECK_POINTER_FATAL(stateVariable);
+ value = stateVariable->GetValue();
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::IsSubscribable
++---------------------------------------------------------------------*/
+bool
+PLT_Service::IsSubscribable()
+{
+ NPT_List::Iterator var = m_StateVars.GetFirstItem();
+ while (var) {
+ if ((*var)->IsSendingEvents()) return true;
+ ++var;
+ }
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::SetStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::SetStateVariable(const char* name, const char* value)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ if (stateVariable == NULL)
+ return NPT_FAILURE;
+
+ return stateVariable->SetValue(value);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::SetStateVariableRate
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::SetStateVariableRate(const char* name, NPT_TimeInterval rate)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ if (stateVariable == NULL)
+ return NPT_FAILURE;
+
+ return stateVariable->SetRate(rate);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::IncStateVariable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::IncStateVariable(const char* name)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(m_StateVars, PLT_StateVariableNameFinder(name), stateVariable);
+ if (stateVariable == NULL)
+ return NPT_FAILURE;
+
+ NPT_String value = stateVariable->GetValue();
+ NPT_Int32 num;
+ if (value.GetLength() == 0 || NPT_FAILED(value.ToInteger(num))) {
+ return NPT_FAILURE;
+ }
+
+ // convert value to int
+ return stateVariable->SetValue(NPT_String::FromInteger(num+1));
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::ProcessNewSubscription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::ProcessNewSubscription(PLT_TaskManager* task_manager,
+ const NPT_SocketAddress& addr,
+ const NPT_String& callback_urls,
+ int timeout,
+ NPT_HttpResponse& response)
+{
+ NPT_LOG_FINE_1("New subscription for %s", m_EventSubURL.GetChars());
+
+// // first look if we don't have a subscriber with same callbackURL
+// PLT_EventSubscriber* subscriber = NULL;
+// if (NPT_SUCCEEDED(NPT_ContainerFind(m_Subscribers, PLT_EventSubscriberFinderByCallbackURL(strCallbackURL),
+// subscriber))) {
+// // update local interface and timeout
+// subscriber->m_local_if.SetIpAddress((unsigned long) addr.GetIpAddress());
+// subscriber->m_ExpirationTime = NPT_Time(NULL) + timeout;
+//
+// PLT_UPnPMessageHelper::SetSID("uuid:" + subscriber->m_sid);
+// PLT_UPnPMessageHelper::SetTimeOut(timeout);
+// return NPT_SUCCESS;
+// }
+//
+ // reject if we have too many subscribers already
+ if (m_Subscribers.GetItemCount() > 30) {
+ response.SetStatus(500, "Internal Server Error");
+ return NPT_FAILURE;
+ }
+
+ //TODO: prevent hacking by making sure callbackurl is not ourselves?
+
+ // generate a unique subscriber ID
+ NPT_String sid;
+ PLT_UPnPMessageHelper::GenerateUUID(19, sid);
+
+ PLT_EventSubscriber* subscriber = new PLT_EventSubscriber(task_manager, this, sid, timeout);
+ // parse the callback URLs
+ bool reachable = false;
+ if (callback_urls[0] == '<') {
+ char* szURLs = (char*)(const char*)callback_urls;
+ char* brackL = szURLs;
+ char* brackR = szURLs;
+ while (++brackR < szURLs + callback_urls.GetLength()) {
+ if (*brackR == '>') {
+ NPT_String strCallbackURL = NPT_String(brackL+1, (NPT_Size)(brackR-brackL-1));
+ NPT_HttpUrl url(strCallbackURL);
+
+ if (url.IsValid()) {
+ subscriber->AddCallbackURL(strCallbackURL);
+ reachable = true;
+ }
+ brackL = ++brackR;
+ }
+ }
+ }
+
+ if (reachable == false) {
+ NPT_CHECK_LABEL_FATAL(NPT_FAILURE, cleanup);
+ }
+
+ // keep track of which interface we receive the request, we will use this one
+ // when notifying
+ subscriber->SetLocalIf(addr);
+
+ PLT_UPnPMessageHelper::SetSID(response, subscriber->GetSID());
+ PLT_UPnPMessageHelper::SetTimeOut(response, timeout);
+
+ {
+ NPT_AutoLock lock(m_Lock);
+
+ // new subscriber should get all vars in the LastChange var
+ UpdateLastChange(m_StateVars);
+
+ // send all state vars to sub
+ NPT_Result res = subscriber->Notify(m_StateVars);
+
+ // reset LastChange var to what was really just changed
+ UpdateLastChange(m_StateVarsChanged);
+
+ NPT_CHECK_LABEL_FATAL(res, cleanup);
+
+ if (!m_EventTask) {
+ m_EventTask = new PLT_ServiceEventTask(this);
+ task_manager->StartTask(m_EventTask);
+ }
+
+ m_Subscribers.Add(subscriber);
+ }
+
+ return NPT_SUCCESS;
+
+cleanup:
+ response.SetStatus(412, "Precondition Failed");
+ delete subscriber;
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::ProcessRenewSubscription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::ProcessRenewSubscription(const NPT_SocketAddress& addr,
+ const NPT_String& sid,
+ int timeout,
+ NPT_HttpResponse& response)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ NPT_LOG_FINE_2("Renewing subscription for %s (sub=%s)",
+ m_EventSubURL.GetChars(),
+ sid.GetChars());
+
+ // first look if we don't have a subscriber with same callbackURL
+ PLT_EventSubscriber* subscriber = NULL;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderBySID(sid),
+ subscriber))) {
+ // update local interface and timeout
+ subscriber->SetLocalIf(addr);
+ subscriber->SetTimeout(timeout);
+
+ PLT_UPnPMessageHelper::SetSID(response, subscriber->GetSID());
+ PLT_UPnPMessageHelper::SetTimeOut(response, timeout);
+ return NPT_SUCCESS;
+ }
+
+ NPT_LOG_WARNING_1("Renewing subscription for unknown %s!", sid.GetChars());
+
+ // didn't find a valid Subscriber in our list
+ response.SetStatus(412, "Precondition Failed");
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::ProcessCancelSubscription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::ProcessCancelSubscription(const NPT_SocketAddress& /* addr */,
+ const NPT_String& sid,
+ NPT_HttpResponse& response)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ NPT_LOG_FINE_2("Cancelling subscription for %s (sub=%s)",
+ m_EventSubURL.GetChars(),
+ sid.GetChars());
+
+ // first look if we don't have a subscriber with same callbackURL
+ PLT_EventSubscriber* sub = NULL;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_Subscribers,
+ PLT_EventSubscriberFinderBySID(sid),
+ sub))) {
+
+ // remove sub
+ m_Subscribers.Remove(sub);
+ delete sub;
+ return NPT_SUCCESS;
+ }
+
+ NPT_LOG_WARNING_1("Cancelling subscription for unknown %s!", sid.GetChars());
+
+ // didn't find a valid Subscriber in our list
+ response.SetStatus(412, "Precondition Failed");
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::AddChanged
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::AddChanged(PLT_StateVariable* var)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ // no event task means no subscribers yet, so don't bother
+ // Note: this will take care also when setting default state
+ // variables values during init and avoid being published
+ if (!m_EventTask) return NPT_SUCCESS;
+
+ if (var->IsSendingEvents()) {
+ if (!m_StateVarsToPublish.Contains(var))
+ m_StateVarsToPublish.Add(var);
+ } else if (var->IsSendingEvents(true)) {
+ if (!m_StateVarsChanged.Contains(var))
+ m_StateVarsChanged.Add(var);
+ UpdateLastChange(m_StateVarsChanged);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::UpdateLastChange
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::UpdateLastChange(NPT_List& vars)
+{
+ PLT_StateVariable* var = FindStateVariable("LastChange");
+ if (var == NULL) return NPT_FAILURE;
+
+ NPT_ASSERT(m_LastChangeNamespace.GetLength() > 0);
+
+ if (vars.GetItemCount() == 0) {
+ // no vars to update, remove LastChange from vars to publish
+ m_StateVarsToPublish.Remove(var);
+ return NPT_SUCCESS;
+ }
+
+ NPT_XmlElementNode* top = new NPT_XmlElementNode("Event");
+ NPT_CHECK_SEVERE(top->SetNamespaceUri("", m_LastChangeNamespace));
+
+ NPT_XmlElementNode* instance = new NPT_XmlElementNode("InstanceID");
+ NPT_CHECK_SEVERE(top->AddChild(instance));
+ NPT_CHECK_SEVERE(instance->SetAttribute("val", "0"));
+
+ // build list of changes
+ NPT_CHECK_SEVERE(vars.Apply(PLT_LastChangeXMLIterator(instance)));
+
+ // serialize node
+ NPT_String value;
+ NPT_CHECK_SEVERE(PLT_XmlHelper::Serialize(*top, value));
+ delete top;
+
+ // set the state change direcly instead of calling SetValue
+ // to avoid recursive lock, instead add var to publish here directly
+ var->m_Value = value;
+ if (!m_StateVarsToPublish.Contains(var)) m_StateVarsToPublish.Add(var);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::PauseEventing
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::PauseEventing(bool paused)
+{
+ NPT_AutoLock lock(m_Lock);
+ m_EventingPaused = paused;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Service::NotifyChanged
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Service::NotifyChanged()
+{
+ NPT_AutoLock lock(m_Lock);
+
+ // no eventing for now
+ if (m_EventingPaused) return NPT_SUCCESS;
+
+ // pick the vars that are ready to be published
+ // based on their moderation rate and last publication
+ NPT_List vars_ready;
+ NPT_List::Iterator iter = m_StateVarsToPublish.GetFirstItem();
+ while (iter) {
+ PLT_StateVariable* var = *iter;
+ if (var->IsReadyToPublish()) {
+ vars_ready.Add(var);
+ m_StateVarsToPublish.Erase(iter++);
+
+ // clear last changed list if we're about to send LastChange var
+ if (!var->GetName().Compare("LastChange")) m_StateVarsChanged.Clear();
+
+ continue;
+ }
+
+ iter++;
+ }
+
+ // if nothing to publish then bail out now
+ // we'll clean up expired subscribers when we have something to publish
+ if (vars_ready.GetItemCount() == 0) return NPT_SUCCESS;
+
+ // send vars that are ready to go and remove old subscribers
+ NPT_List::Iterator sub_iter = m_Subscribers.GetFirstItem();
+ while (sub_iter) {
+ PLT_EventSubscriber* sub = *sub_iter;
+
+ NPT_TimeStamp now, expiration;
+ NPT_System::GetCurrentTimeStamp(now);
+ expiration = sub->GetExpirationTime();
+
+ // forget sub if it didn't renew in time or if notification failed
+ if (expiration == NPT_TimeStamp() || expiration > now ) {
+ NPT_Result res = vars_ready.GetItemCount()?sub->Notify(vars_ready):NPT_SUCCESS;
+ if (NPT_SUCCEEDED(res)) {
+ sub_iter++;
+ continue;
+ }
+ }
+
+ m_Subscribers.Erase(sub_iter++);
+ delete sub;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceSCPDURLFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceSCPDURLFinder::operator()(PLT_Service* const & service) const
+{
+ NPT_String url = service->GetSCPDURL();
+ if (!url.StartsWith("/")) {
+ url = service->GetDevice()->GetURLBase().GetPath() + url;
+ }
+ return m_URL.Compare(url, true) ? false : true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceControlURLFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceControlURLFinder::operator()(PLT_Service* const & service) const
+{
+ NPT_String url = service->GetControlURL();
+ if (!url.StartsWith("/")) {
+ url = service->GetDevice()->GetURLBase().GetPath() + url;
+ }
+ return m_URL.Compare(url, true) ? false : true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceEventSubURLFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceEventSubURLFinder::operator()(PLT_Service* const & service) const
+{
+ NPT_String url = service->GetEventSubURL();
+ if (!url.StartsWith("/")) {
+ url = service->GetDevice()->GetURLBase().GetPath() + url;
+ }
+ return m_URL.Compare(url, true) ? false : true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceIDFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceIDFinder::operator()(PLT_Service* const & service) const
+{
+ return m_Id.Compare(service->GetServiceID(), true) ? false : true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ServiceTypeFinder::operator()
++---------------------------------------------------------------------*/
+bool
+PLT_ServiceTypeFinder::operator()(PLT_Service* const & service) const
+{
+ return m_Type.Compare(service->GetServiceType(), true) ? false : true;
+}
+
+/*----------------------------------------------------------------------
+| PLT_GetLastChangeXMLIterator::operator()
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_LastChangeXMLIterator::operator()(PLT_StateVariable* const &var) const
+{
+ // only add vars that are indirectly evented
+ if (!var->IsSendingEvents(true)) return NPT_SUCCESS;
+
+ NPT_XmlElementNode* variable = new NPT_XmlElementNode((const char*)var->GetName());
+ NPT_CHECK_SEVERE(m_Node->AddChild(variable));
+ NPT_CHECK_SEVERE(variable->SetAttribute("val", var->GetValue()));
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltService.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltService.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,268 @@
+/*****************************************************************
+|
+| Platinum - Service
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_SERVICE_H_
+#define _PLT_SERVICE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltEvent.h"
+#include "PltArgument.h"
+#include "PltStateVariable.h"
+#include "PltAction.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_DeviceData;
+
+/*----------------------------------------------------------------------
+| PLT_Service class
++---------------------------------------------------------------------*/
+class PLT_Service
+{
+public:
+ // methods
+ PLT_Service(PLT_DeviceData* device,
+ const char* type = NULL,
+ const char* id = NULL,
+ const char* last_change_namespace = NULL);
+ ~PLT_Service();
+
+ // class methods
+ NPT_Result InitURLs(const char* service_name, const char* device_uuid);
+ bool IsInitted() {
+ return (m_ActionDescs.GetItemCount() > 0);
+ }
+ NPT_Result PauseEventing(bool paused = true);
+
+ // static methods
+ static bool IsTrue(NPT_String& value) {
+ if (value.Compare("1", true) &&
+ value.Compare("true", true) &&
+ value.Compare("yes", true)) {
+ return false;
+ }
+ return true;
+ }
+
+ // accessor methods
+ const NPT_String& GetSCPDURL() const { return m_SCPDURL; }
+ const NPT_String& GetControlURL() const { return m_ControlURL; }
+ const NPT_String& GetEventSubURL() const { return m_EventSubURL; }
+ const NPT_String& GetServiceID() const { return m_ServiceID; }
+ const NPT_String& GetServiceType() const { return m_ServiceType; }
+ PLT_DeviceData* GetDevice() { return m_Device; }
+
+ // XML
+ NPT_Result GetSCPDXML(NPT_String& xml);
+ NPT_Result SetSCPDXML(const char* xml);
+ NPT_Result GetDescription(NPT_XmlElementNode* parent, NPT_XmlElementNode** service = NULL);
+
+ // State Variables
+ NPT_Result SetStateVariable(const char* name, const char* value);
+ NPT_Result SetStateVariableRate(const char* name, NPT_TimeInterval rate);
+ NPT_Result IncStateVariable(const char* name);
+ PLT_StateVariable* FindStateVariable(const char* name);
+ NPT_Result GetStateVariableValue(const char* name, NPT_String& value);
+ bool IsSubscribable();
+
+ // Actions
+ PLT_ActionDesc* FindActionDesc(const char* name);
+
+private:
+ void Cleanup();
+ NPT_Result AddChanged(PLT_StateVariable* var);
+ NPT_Result UpdateLastChange(NPT_List& vars);
+ NPT_Result NotifyChanged();
+
+
+ /*----------------------------------------------------------------------
+ | PLT_ServiceEventTask
+ +---------------------------------------------------------------------*/
+ class PLT_ServiceEventTask : public PLT_ThreadTask
+ {
+ public:
+ PLT_ServiceEventTask(PLT_Service* service) : m_Service(service) {}
+
+ void DoRun() {
+ while (!IsAborting(100)) m_Service->NotifyChanged();
+ }
+
+ private:
+ PLT_Service* m_Service;
+ };
+
+ // Events
+ NPT_Result ProcessNewSubscription(
+ PLT_TaskManager* task_manager,
+ const NPT_SocketAddress& addr,
+ const NPT_String& callback_urls,
+ int timeout,
+ NPT_HttpResponse& response);
+
+ NPT_Result ProcessRenewSubscription(
+ const NPT_SocketAddress& addr,
+ const NPT_String& sid,
+ int timeout,
+ NPT_HttpResponse& response);
+
+ NPT_Result ProcessCancelSubscription(
+ const NPT_SocketAddress& addr,
+ const NPT_String& sid,
+ NPT_HttpResponse& response);
+
+
+protected:
+ friend class PLT_StateVariable; // so that we can call AddChanged from StateVariable
+ friend class PLT_DeviceHost;
+ friend class PLT_DeviceData;
+
+ //members
+ PLT_DeviceData* m_Device;
+ NPT_String m_ServiceType;
+ NPT_String m_ServiceID;
+ NPT_String m_SCPDURL;
+ NPT_String m_ControlURL;
+ NPT_String m_EventSubURL;
+
+ PLT_ServiceEventTask* m_EventTask;
+ NPT_Array m_ActionDescs;
+ NPT_List m_StateVars;
+ NPT_Mutex m_Lock;
+ NPT_List m_StateVarsChanged;
+ NPT_List m_StateVarsToPublish;
+ NPT_List m_Subscribers;
+ bool m_EventingPaused;
+ NPT_String m_LastChangeNamespace;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceDescriptionURLFinder
++---------------------------------------------------------------------*/
+class PLT_ServiceSCPDURLFinder
+{
+public:
+ // methods
+ PLT_ServiceSCPDURLFinder(const char* url) : m_URL(url) {}
+ virtual ~PLT_ServiceSCPDURLFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_URL;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceControlURLFinder
++---------------------------------------------------------------------*/
+class PLT_ServiceControlURLFinder
+{
+public:
+ // methods
+ PLT_ServiceControlURLFinder(const char* url) : m_URL(url) {}
+ virtual ~PLT_ServiceControlURLFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_URL;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceEventSubURLFinder
++---------------------------------------------------------------------*/
+class PLT_ServiceEventSubURLFinder
+{
+public:
+ // methods
+ PLT_ServiceEventSubURLFinder(const char* url) : m_URL(url) {}
+ virtual ~PLT_ServiceEventSubURLFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_URL;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceIDFinder
++---------------------------------------------------------------------*/
+class PLT_ServiceIDFinder
+{
+public:
+ // methods
+ PLT_ServiceIDFinder(const char* id) : m_Id(id) {}
+ virtual ~PLT_ServiceIDFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_Id;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ServiceTypeFinder
++---------------------------------------------------------------------*/
+class PLT_ServiceTypeFinder
+{
+public:
+ // methods
+ PLT_ServiceTypeFinder(const char* type) : m_Type(type) {}
+ virtual ~PLT_ServiceTypeFinder() {}
+ bool operator()(PLT_Service* const & service) const;
+
+private:
+ // members
+ NPT_String m_Type;
+};
+
+/*----------------------------------------------------------------------
+| PLT_LastChangeXMLIterator
++---------------------------------------------------------------------*/
+class PLT_LastChangeXMLIterator
+{
+public:
+ // methods
+ PLT_LastChangeXMLIterator(NPT_XmlElementNode* node) : m_Node(node) {}
+ virtual ~PLT_LastChangeXMLIterator() {}
+
+ NPT_Result operator()(PLT_StateVariable* const & var) const;
+
+private:
+ NPT_XmlElementNode* m_Node;
+};
+
+#endif /* _PLT_SERVICE_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltSsdp.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltSsdp.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,512 @@
+/*****************************************************************
+|
+| Platinum - SSDP
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltSsdp.h"
+#include "PltDatagramStream.h"
+#include "PltDeviceHost.h"
+#include "PltUPnP.h"
+#include "PltHttp.h"
+#include "PltVersion.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.ssdp")
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_SSDP_MAX_LINE_SIZE = 2048;
+const int NPT_SSDP_MAX_DGRAM_SIZE = 4096;
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSender::SendSsdp
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpSender::SendSsdp(NPT_HttpRequest& request,
+ const char* usn,
+ const char* target,
+ NPT_UdpSocket& socket,
+ bool notify,
+ const NPT_SocketAddress* addr /* = NULL */)
+{
+ NPT_CHECK_SEVERE(FormatPacket(request, usn, target, socket, notify));
+
+ // logging
+ NPT_LOG_FINE_2("Sending SSDP %s for %s",
+ (const char*)request.GetMethod(),
+ usn);
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, &request);
+
+ // use a memory stream to write all the data
+ NPT_MemoryStream stream;
+ NPT_Result res = request.Emit(stream);
+ if (NPT_FAILED(res)) return res;
+
+ // copy stream into a data packet and send it
+ NPT_LargeSize size;
+ stream.GetSize(size);
+ if (size != (NPT_Size)size) return NPT_ERROR_OUT_OF_RANGE;
+
+ NPT_DataBuffer packet(stream.GetData(), (NPT_Size)size);
+ return socket.Send(packet, addr);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSender::SendSsdp
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpSender::SendSsdp(NPT_HttpResponse& response,
+ const char* usn,
+ const char* target,
+ NPT_UdpSocket& socket,
+ bool notify,
+ const NPT_SocketAddress* addr /* = NULL */)
+{
+ NPT_CHECK_SEVERE(FormatPacket(response, usn, target, socket, notify));
+
+ // logging
+ NPT_LOG_FINE("Sending SSDP:");
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, &response);
+
+ // use a memory stream to write all the data
+ NPT_MemoryStream stream;
+ NPT_Result res = response.Emit(stream);
+ if (NPT_FAILED(res)) return res;
+
+ // copy stream into a data packet and send it
+ NPT_LargeSize size;
+ stream.GetSize(size);
+ if (size != (NPT_Size)size) return NPT_ERROR_OUT_OF_RANGE;
+
+ NPT_DataBuffer packet(stream.GetData(), (NPT_Size)size);
+ return socket.Send(packet, addr);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSender::FormatPacket
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpSender::FormatPacket(NPT_HttpMessage& message,
+ const char* usn,
+ const char* target,
+ NPT_UdpSocket& socket,
+ bool notify)
+{
+ NPT_COMPILER_UNUSED(socket);
+
+ PLT_UPnPMessageHelper::SetUSN(message, usn);
+ if (notify) {
+ PLT_UPnPMessageHelper::SetNT(message, target);
+ } else {
+ PLT_UPnPMessageHelper::SetST(message, target);
+ }
+ PLT_HttpHelper::SetContentLength(message, 0);
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceSearchResponseInterfaceIterator class
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpDeviceSearchResponseInterfaceIterator::operator()(NPT_NetworkInterface*& net_if) const
+{
+ NPT_Result res;
+ const NPT_SocketAddress* remote_addr = &m_RemoteAddr;
+
+ NPT_List::Iterator netaddr = net_if->GetAddresses().GetFirstItem();
+ if (!netaddr) {
+ return NPT_SUCCESS;
+ }
+
+ // don't respond on loopback
+ // windows media player on vista sends it's M-SEARCH to loopback interface if it's a local clients sometimes
+ //if (net_if->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_LOOPBACK) {
+ // return NPT_SUCCESS;
+ //}
+
+ NPT_SocketAddress local_addr((*netaddr).GetPrimaryAddress(), 0); // 1900?
+ NPT_UdpSocket socket;
+ //if (NPT_FAILED(res = socket.Bind(local_addr))) {
+ // return res;
+ //}
+
+ // get the output socket stream
+ NPT_OutputStreamReference stream;
+ if (NPT_FAILED(res = socket.GetOutputStream(stream))) {
+ return res;
+ }
+
+ NPT_HttpResponse response(200, "OK", NPT_HTTP_PROTOCOL_1_1);
+
+ // get location URL based on ip address of interface
+ // by connecting, the kernel chooses which interface to use to route to the remote
+ // this is the IP we should use in our Location
+ if (NPT_FAILED(res = socket.Connect(m_RemoteAddr, 5000))) {
+ return res;
+ }
+ NPT_SocketInfo info;
+ socket.GetInfo(info);
+
+ // did we successfully connect and found out which interface is used?
+ if (info.local_address.GetIpAddress().AsLong()) {
+ // check that the interface the kernel chose matches the interface
+ // we wanted to send on
+ // FIXME: Should we fail instead and stop sending a response once we get NPT_SUCCESS?
+ if (local_addr.GetIpAddress().AsLong() != info.local_address.GetIpAddress().AsLong()) {
+ return NPT_SUCCESS;
+ }
+
+ // already connected, so we don't need to specify where to go
+ remote_addr = NULL;
+ }
+
+ PLT_UPnPMessageHelper::SetLocation(response, m_Device->GetDescriptionUrl(local_addr.GetIpAddress().ToString()));
+ PLT_UPnPMessageHelper::SetLeaseTime(response, (NPT_Timeout)((float)m_Device->GetLeaseTime()));
+ PLT_UPnPMessageHelper::SetServer(response, NPT_HttpServer::m_ServerHeader, false);
+ response.GetHeaders().SetHeader("EXT", "");
+
+ // process search response twice to be NMPR compliant
+ NPT_CHECK_SEVERE(m_Device->SendSsdpSearchResponse(response, socket, m_ST, remote_addr));
+ NPT_CHECK_SEVERE(m_Device->SendSsdpSearchResponse(response, socket, m_ST, remote_addr));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceSearchResponseTask::DoRun()
++---------------------------------------------------------------------*/
+void
+PLT_SsdpDeviceSearchResponseTask::DoRun()
+{
+ NPT_List if_list;
+ NPT_CHECK_LABEL_WARNING(PLT_UPnPMessageHelper::GetNetworkInterfaces(if_list),
+ done);
+
+ if_list.Apply(PLT_SsdpDeviceSearchResponseInterfaceIterator(
+ m_Device,
+ m_RemoteAddr,
+ m_ST));
+ if_list.Apply(NPT_ObjectDeleter());
+
+done:
+ return;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpAnnounceInterfaceIterator class
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpAnnounceInterfaceIterator::operator()(NPT_NetworkInterface*& net_if) const
+{
+ // don't use this interface address if it's not broadcast capable
+ if (m_Broadcast && !(net_if->GetFlags() & NPT_NETWORK_INTERFACE_FLAG_BROADCAST)) {
+ return NPT_FAILURE;
+ }
+
+ NPT_List::Iterator niaddr =
+ net_if->GetAddresses().GetFirstItem();
+ if (!niaddr) return NPT_FAILURE;
+
+ // Remove disconnected interfaces
+ NPT_IpAddress addr = (*niaddr).GetPrimaryAddress();
+ if (!addr.ToString().Compare("0.0.0.0")) return NPT_FAILURE;
+
+ NPT_HttpUrl url;
+ NPT_UdpMulticastSocket multicast_socket;
+ NPT_UdpSocket broadcast_socket;
+ NPT_UdpSocket* socket;
+
+ if (m_Broadcast) {
+ //url = NPT_HttpUrl("255.255.255.255", 1900, "*");
+ url = NPT_HttpUrl((*niaddr).GetBroadcastAddress().ToString(), 1900, "*");
+ socket = &broadcast_socket;
+ } else {
+ url = NPT_HttpUrl("239.255.255.250", 1900, "*");
+ socket = &multicast_socket;
+ NPT_CHECK_SEVERE(((NPT_UdpMulticastSocket*)socket)->SetInterface(addr));
+ }
+
+ NPT_HttpRequest req(url, "NOTIFY", NPT_HTTP_PROTOCOL_1_1);
+ PLT_HttpHelper::SetHost(req, "239.255.255.250:1900");
+
+ // put a location only if alive message
+ if (m_IsByeBye == false) {
+ PLT_UPnPMessageHelper::SetLocation(req, m_Device->GetDescriptionUrl(addr.ToString()));
+ }
+
+ NPT_CHECK_SEVERE(m_Device->Announce(req, *socket, m_IsByeBye));
+ NPT_CHECK_SEVERE(m_Device->Announce(req, *socket, m_IsByeBye));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceAnnounceUnicastTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_SsdpDeviceAnnounceTask::DoRun()
+{
+ NPT_Result res = NPT_SUCCESS;
+ NPT_List if_list;
+
+ while (1) {
+ NPT_CHECK_LABEL_FATAL(PLT_UPnPMessageHelper::GetNetworkInterfaces(if_list),
+ cleanup);
+
+ // if we're announcing our arrival, sends a byebye first (NMPR compliance)
+ if (m_IsByeByeFirst == true) {
+ m_IsByeByeFirst = false;
+ res = if_list.Apply(PLT_SsdpAnnounceInterfaceIterator(m_Device, true, m_IsBroadcast));
+ if (NPT_FAILED(res)) goto cleanup;
+
+ // schedule to announce alive in 300 ms
+ if (NPT_FAILED(res) || IsAborting((NPT_Timeout)300)) break;
+ }
+
+ res = if_list.Apply(PLT_SsdpAnnounceInterfaceIterator(m_Device, false, m_IsBroadcast));
+
+cleanup:
+ if_list.Apply(NPT_ObjectDeleter());
+ if_list.Clear();
+
+ if (NPT_FAILED(res) || IsAborting(m_Repeat.m_Seconds*1000)) break;
+ };
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask::DoInit
++---------------------------------------------------------------------*/
+void
+PLT_SsdpListenTask::DoInit()
+{
+ if (m_IsMulticast) {
+ NPT_List if_list;
+ NPT_CHECK_LABEL_FATAL(PLT_UPnPMessageHelper::GetNetworkInterfaces(if_list),
+ done);
+
+ /* Join multicast group for every interface we found */
+ if_list.ApplyUntil(
+ PLT_SsdpInitMulticastIterator((NPT_UdpMulticastSocket*)m_Socket),
+ NPT_UntilResultNotEquals(NPT_SUCCESS));
+
+ if_list.Apply(NPT_ObjectDeleter());
+ }
+
+done:
+ return;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask::GetInputStream
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpListenTask::GetInputStream(NPT_InputStreamReference& stream)
+{
+ if (!m_Datagram.IsNull()) {
+ stream = m_Datagram;
+ return NPT_SUCCESS;
+ } else {
+ NPT_InputStreamReference input_stream;
+ NPT_Result res = m_Socket->GetInputStream(input_stream);
+ if (NPT_FAILED(res)) {
+ return res;
+ }
+ // for datagrams, we can't simply write to the socket directly
+ // we need to write into a datagramstream (buffer) that redirects to the real stream when flushed
+ m_Datagram = new PLT_InputDatagramStream((NPT_UdpSocket*)m_Socket);
+ stream = m_Datagram;
+ return NPT_SUCCESS;
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask::GetInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpListenTask::GetInfo(NPT_SocketInfo& info)
+{
+ if (m_Datagram.IsNull()) return NPT_FAILURE;
+ return m_Datagram->GetInfo(info);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask::ProcessRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpListenTask::ProcessRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response,
+ bool& headers_only)
+{
+ NPT_COMPILER_UNUSED(headers_only);
+
+ NPT_AutoLock lock(m_Mutex);
+ m_Listeners.Apply(PLT_SsdpPacketListenerIterator(request, context));
+
+ // set response to NULL since we don't have anything to respond
+ // as we use a separate task to respond with ssdp
+ response = NULL;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchTask::PLT_SsdpSearchTask
++---------------------------------------------------------------------*/
+PLT_SsdpSearchTask::PLT_SsdpSearchTask(NPT_UdpSocket* socket,
+ PLT_SsdpSearchResponseListener* listener,
+ NPT_HttpRequest* request,
+ NPT_Timeout timeout,
+ bool repeat /* = true */) :
+ m_Listener(listener),
+ m_Request(request),
+ m_Timeout(timeout),
+ m_Repeat(repeat),
+ m_Socket(socket)
+{
+ m_Socket->SetReadTimeout(timeout);
+ m_Socket->SetWriteTimeout(10000);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchTask::~PLT_SsdpSearchTask
++---------------------------------------------------------------------*/
+PLT_SsdpSearchTask::~PLT_SsdpSearchTask()
+{
+ delete m_Socket;
+ delete m_Request;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::DoAbort
++---------------------------------------------------------------------*/
+void
+PLT_SsdpSearchTask::DoAbort()
+{
+ m_Socket->Disconnect();
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpServerSocketTask::DoRun
++---------------------------------------------------------------------*/
+void
+PLT_SsdpSearchTask::DoRun()
+{
+ NPT_HttpResponse* response = NULL;
+ PLT_HttpClient client;
+ NPT_Timeout timeout = 30;
+ NPT_HttpRequestContext context;
+
+ do {
+ // get the address of the server
+ NPT_IpAddress server_address;
+ NPT_CHECK_LABEL_SEVERE(server_address.ResolveName(
+ m_Request->GetUrl().GetHost(),
+ timeout),
+ done);
+ NPT_SocketAddress address(server_address,
+ m_Request->GetUrl().GetPort());
+
+ // send 2 requests in a row
+ NPT_OutputStreamReference output_stream(
+ new PLT_OutputDatagramStream(m_Socket,
+ 4096,
+ &address));
+ NPT_CHECK_LABEL_SEVERE(client.SendRequest(
+ output_stream,
+ *m_Request),
+ done);
+ NPT_CHECK_LABEL_SEVERE(client.SendRequest(
+ output_stream,
+ *m_Request),
+ done);
+ output_stream = NULL;
+
+ // keep track of when we sent the request
+ NPT_TimeStamp last_send;
+ NPT_System::GetCurrentTimeStamp(last_send);
+
+ while (!IsAborting(0)) {
+ // read response
+ PLT_InputDatagramStreamReference input_stream(
+ new PLT_InputDatagramStream(m_Socket));
+
+ NPT_InputStreamReference stream = input_stream;
+ NPT_Result res = client.WaitForResponse(stream,
+ *m_Request,
+ context,
+ response);
+ // callback to process response
+ if (NPT_SUCCEEDED(res)) {
+ // get source info
+ NPT_SocketInfo info;
+ input_stream->GetInfo(info);
+
+ context.SetLocalAddress(info.local_address);
+ context.SetRemoteAddress(info.remote_address);
+
+ // process response
+ ProcessResponse(NPT_SUCCESS, m_Request, context, response);
+ delete response;
+ response = NULL;
+ } else if (res != NPT_ERROR_TIMEOUT) {
+ NPT_LOG_WARNING_1("PLT_SsdpSearchTask got an error (%d) waiting for response", res);
+ }
+
+ input_stream = NULL;
+
+ // check if it's time to resend request
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+ if (now >= last_send + (long)m_Timeout/1000)
+ break;
+ }
+ } while (!IsAborting(0) && m_Repeat);
+
+done:
+ return;
+}
+
+/*----------------------------------------------------------------------
+| PLT_CtrlPointGetDescriptionTask::ProcessResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SsdpSearchTask::ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response)
+{
+ NPT_COMPILER_UNUSED(request);
+ return m_Listener->ProcessSsdpSearchResponse(res, context, response);
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltSsdp.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltSsdp.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,310 @@
+/*****************************************************************
+|
+| Platinum - SSDP
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_SSDP_H_
+#define _PLT_SSDP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltSsdpListener.h"
+#include "PltThreadTask.h"
+#include "PltHttpServerTask.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_DeviceHost;
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSender class
++---------------------------------------------------------------------*/
+class PLT_SsdpSender
+{
+public:
+ static NPT_Result SendSsdp(NPT_HttpRequest& request,
+ const char* usn,
+ const char* nt,
+ NPT_UdpSocket& socket,
+ bool notify,
+ const NPT_SocketAddress* addr = NULL);
+
+ static NPT_Result SendSsdp(NPT_HttpResponse& response,
+ const char* usn,
+ const char* nt,
+ NPT_UdpSocket& socket,
+ bool notify,
+ const NPT_SocketAddress* addr = NULL);
+
+private:
+ static NPT_Result FormatPacket(NPT_HttpMessage& message,
+ const char* usn,
+ const char* nt,
+ NPT_UdpSocket& socket,
+ bool notify);
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceSearchResponseInterfaceIterator class
++---------------------------------------------------------------------*/
+class PLT_SsdpDeviceSearchResponseInterfaceIterator
+{
+public:
+ PLT_SsdpDeviceSearchResponseInterfaceIterator(PLT_DeviceHost* device,
+ NPT_SocketAddress remote_addr,
+ const char* st) :
+ m_Device(device), m_RemoteAddr(remote_addr), m_ST(st) {}
+ virtual ~PLT_SsdpDeviceSearchResponseInterfaceIterator() {}
+
+ NPT_Result operator()(NPT_NetworkInterface*& if_addr) const;
+
+private:
+ PLT_DeviceHost* m_Device;
+ NPT_SocketAddress m_RemoteAddr;
+ NPT_String m_ST;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceSearchResponseTask class
++---------------------------------------------------------------------*/
+class PLT_SsdpDeviceSearchResponseTask : public PLT_ThreadTask
+{
+public:
+ PLT_SsdpDeviceSearchResponseTask(PLT_DeviceHost* device,
+ NPT_SocketAddress remote_addr,
+ const char* st) :
+ m_Device(device), m_RemoteAddr(remote_addr), m_ST(st) {}
+
+protected:
+ virtual ~PLT_SsdpDeviceSearchResponseTask() {}
+
+ // PLT_ThreadTask methods
+ virtual void DoRun();
+
+protected:
+ PLT_DeviceHost* m_Device;
+ NPT_SocketAddress m_RemoteAddr;
+ NPT_String m_ST;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpAnnounceInterfaceIterator class
++---------------------------------------------------------------------*/
+class PLT_SsdpAnnounceInterfaceIterator
+{
+public:
+ PLT_SsdpAnnounceInterfaceIterator(PLT_DeviceHost* device, bool is_byebye = false, bool broadcast = false) :
+ m_Device(device), m_IsByeBye(is_byebye), m_Broadcast(broadcast) {}
+
+ NPT_Result operator()(NPT_NetworkInterface*& if_addr) const;
+
+private:
+ PLT_DeviceHost* m_Device;
+ bool m_IsByeBye;
+ bool m_Broadcast;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpInitMulticastIterator class
++---------------------------------------------------------------------*/
+class PLT_SsdpInitMulticastIterator
+{
+public:
+ PLT_SsdpInitMulticastIterator(NPT_UdpMulticastSocket* socket) :
+ m_Socket(socket) {}
+
+ NPT_Result operator()(NPT_NetworkInterface*& if_addr) const {
+ NPT_COMPILER_UNUSED(if_addr);
+
+ NPT_IpAddress addr;
+ addr.ResolveName("239.255.255.250");
+
+#if 0
+ NPT_List::Iterator niaddr = if_addr->GetAddresses().GetFirstItem();
+ if (!niaddr) return NPT_FAILURE;
+
+ //FIXME: Should we iterate through all addresses or at least check for disconnected ones ("0.0.0.0")?
+
+ return m_Socket->JoinGroup(addr, (*niaddr).GetPrimaryAddress());
+#else
+ return m_Socket->JoinGroup(addr, NPT_IpAddress::Any);
+#endif
+ }
+
+private:
+ NPT_UdpMulticastSocket* m_Socket;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpDeviceAnnounceTask class
++---------------------------------------------------------------------*/
+class PLT_SsdpDeviceAnnounceTask : public PLT_ThreadTask
+{
+public:
+ PLT_SsdpDeviceAnnounceTask(PLT_DeviceHost* device,
+ NPT_TimeInterval repeat,
+ bool is_byebye_first = false,
+ bool broadcast = false) :
+ m_Device(device),
+ m_Repeat(repeat), m_IsByeByeFirst(is_byebye_first),
+ m_IsBroadcast(broadcast) {}
+
+protected:
+ virtual ~PLT_SsdpDeviceAnnounceTask() {}
+
+ // PLT_ThreadTask methods
+ virtual void DoRun();
+
+protected:
+ PLT_DeviceHost* m_Device;
+ NPT_TimeInterval m_Repeat;
+ bool m_IsByeByeFirst;
+ bool m_IsBroadcast;
+};
+
+/*----------------------------------------------------------------------
+| PLT_NetworkInterfaceAddressSearchIterator class
++---------------------------------------------------------------------*/
+class PLT_NetworkInterfaceAddressSearchIterator
+{
+public:
+ PLT_NetworkInterfaceAddressSearchIterator(NPT_String ip) : m_Ip(ip) {}
+ virtual ~PLT_NetworkInterfaceAddressSearchIterator() {}
+
+ NPT_Result operator()(NPT_NetworkInterface*& addr) const {
+ NPT_List::Iterator niaddr = addr->GetAddresses().GetFirstItem();
+ if (!niaddr) return NPT_FAILURE;
+
+ return (m_Ip.Compare((*niaddr).GetPrimaryAddress().ToString(), true) == 0) ? NPT_SUCCESS : NPT_FAILURE;
+ }
+
+private:
+ NPT_String m_Ip;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpPacketListenerIterator class
++---------------------------------------------------------------------*/
+class PLT_SsdpPacketListenerIterator
+{
+public:
+ PLT_SsdpPacketListenerIterator(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context) :
+ m_Request(request), m_Context(context) {}
+
+ NPT_Result operator()(PLT_SsdpPacketListener*& listener) const {
+ return listener->OnSsdpPacket(m_Request, m_Context);
+ }
+
+private:
+ NPT_HttpRequest& m_Request;
+ const NPT_HttpRequestContext& m_Context;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpListenTask class
++---------------------------------------------------------------------*/
+class PLT_SsdpListenTask : public PLT_HttpServerSocketTask
+{
+public:
+ PLT_SsdpListenTask(NPT_Socket* socket, bool multicast = true) :
+ PLT_HttpServerSocketTask(socket, true),
+ m_IsMulticast(multicast) {}
+
+ NPT_Result AddListener(PLT_SsdpPacketListener* listener) {
+ NPT_AutoLock lock(m_Mutex);
+ m_Listeners.Add(listener);
+ return NPT_SUCCESS;
+ }
+
+ NPT_Result RemoveListener(PLT_SsdpPacketListener* listener) {
+ NPT_AutoLock lock(m_Mutex);
+ m_Listeners.Remove(listener);
+ return NPT_SUCCESS;
+ }
+
+protected:
+ virtual ~PLT_SsdpListenTask() {}
+
+ // PLT_ThreadTask methods
+ virtual void DoInit();
+
+ // PLT_HttpServerSocketTask methods
+ NPT_Result GetInputStream(NPT_InputStreamReference& stream);
+ NPT_Result GetInfo(NPT_SocketInfo& info);
+ NPT_Result ProcessRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse*& response,
+ bool& headers_only);
+
+protected:
+ PLT_InputDatagramStreamReference m_Datagram;
+ bool m_IsMulticast;
+ NPT_List m_Listeners;
+ NPT_Mutex m_Mutex;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchTask class
++---------------------------------------------------------------------*/
+class PLT_SsdpSearchTask : public PLT_ThreadTask
+{
+public:
+ PLT_SsdpSearchTask(NPT_UdpSocket* socket,
+ PLT_SsdpSearchResponseListener* listener,
+ NPT_HttpRequest* request,
+ NPT_Timeout timeout,
+ bool repeat = true);
+
+protected:
+ virtual ~PLT_SsdpSearchTask();
+
+ // PLT_ThreadTask methods
+ virtual void DoAbort();
+ virtual void DoRun();
+
+ virtual NPT_Result ProcessResponse(NPT_Result res,
+ NPT_HttpRequest* request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response);
+
+private:
+ PLT_SsdpSearchResponseListener* m_Listener;
+ NPT_HttpRequest* m_Request;
+ NPT_Timeout m_Timeout;
+ bool m_Repeat;
+ NPT_UdpSocket* m_Socket;
+};
+
+#endif /* _PLT_SSDP_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltSsdpListener.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltSsdpListener.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,65 @@
+/*****************************************************************
+|
+| Platinum - SSDP Listener
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_SSDP_LISTENER_H_
+#define _PLT_SSDP_LISTENER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_SsdpPacketListener class
++---------------------------------------------------------------------*/
+class PLT_SsdpPacketListener
+{
+public:
+ virtual ~PLT_SsdpPacketListener() {}
+ virtual NPT_Result OnSsdpPacket(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context) = 0;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SsdpSearchResponseListener class
++---------------------------------------------------------------------*/
+class PLT_SsdpSearchResponseListener
+{
+public:
+ virtual ~PLT_SsdpSearchResponseListener() {}
+ virtual NPT_Result ProcessSsdpSearchResponse(NPT_Result res,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse* response) = 0;
+};
+
+#endif /* _PLT_SSDP_LISTENER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltStateVariable.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltStateVariable.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,211 @@
+/*****************************************************************
+|
+| Platinum - Service State Variable
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltStateVariable.h"
+#include "PltService.h"
+#include "PltXmlHelper.h"
+#include "PltUPnP.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.statevariable")
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::PLT_StateVariable
++---------------------------------------------------------------------*/
+PLT_StateVariable::PLT_StateVariable(PLT_Service* service) :
+ m_Service(service),
+ m_AllowedValueRange(NULL),
+ m_IsSendingEventsIndirectly(true)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::~PLT_StateVariable
++---------------------------------------------------------------------*/
+PLT_StateVariable::~PLT_StateVariable()
+{
+ m_AllowedValues.Apply(NPT_ObjectDeleter());
+ if (m_AllowedValueRange) delete m_AllowedValueRange;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::GetSCPDXML
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::GetSCPDXML(NPT_XmlElementNode* node)
+{
+ NPT_XmlElementNode* variable = new NPT_XmlElementNode("stateVariable");
+ NPT_CHECK_SEVERE(node->AddChild(variable));
+
+ NPT_CHECK_SEVERE(variable->SetAttribute("sendEvents", m_IsSendingEvents?"yes":"no"));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(variable, "name", m_Name));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(variable, "dataType", m_DataType));
+ if (m_DefaultValue.GetLength()) {
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(variable, "defaultValue", m_DefaultValue));
+ }
+
+ if (m_AllowedValues.GetItemCount()) {
+ NPT_XmlElementNode* allowedValueList = new NPT_XmlElementNode("allowedValueList");
+ NPT_CHECK_SEVERE(variable->AddChild(allowedValueList));
+ for( int l = 0 ; l < (int)m_AllowedValues.GetItemCount(); l++) {
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(allowedValueList, "allowedValue", (*m_AllowedValues[l])));
+ }
+ } else if (m_AllowedValueRange) {
+ NPT_XmlElementNode* range = new NPT_XmlElementNode("allowedValueRange");
+ NPT_CHECK_SEVERE(variable->AddChild(range));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(range, "minimum", NPT_String::FromInteger(m_AllowedValueRange->min_value)));
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(range, "maximum", NPT_String::FromInteger(m_AllowedValueRange->max_value)));
+ if (m_AllowedValueRange->step != -1) {
+ NPT_CHECK_SEVERE(PLT_XmlHelper::AddChildText(range, "step", NPT_String::FromInteger(m_AllowedValueRange->step)));
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::GetService
++---------------------------------------------------------------------*/
+PLT_Service*
+PLT_StateVariable::GetService()
+{
+ return m_Service;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::IsSendingEvents
++---------------------------------------------------------------------*/
+bool
+PLT_StateVariable::IsSendingEvents(bool indirectly /* = false */)
+{
+ if (indirectly) {
+ return (!m_IsSendingEvents &&
+ !m_Name.StartsWith("A_ARG_TYPE_") &&
+ m_IsSendingEventsIndirectly);
+ }
+
+ return m_IsSendingEvents;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::DisableIndirectEventing
++---------------------------------------------------------------------*/
+void
+PLT_StateVariable::DisableIndirectEventing()
+{
+ m_IsSendingEventsIndirectly = false;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::SetRate
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::SetRate(NPT_TimeInterval rate)
+{
+ if (!IsSendingEvents()) return NPT_FAILURE;
+
+ m_Rate = rate;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::SetValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::SetValue(const char* value)
+{
+ if (value == NULL) {
+ return NPT_FAILURE;
+ }
+
+ // update only if it's different
+ if (m_Value != value) {
+ NPT_Result res = ValidateValue(value);
+ if (NPT_FAILED(res)) {
+ return res;
+ }
+
+ m_Value = value;
+ m_Service->AddChanged(this);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::IsReadyToPublish
++---------------------------------------------------------------------*/
+bool
+PLT_StateVariable::IsReadyToPublish()
+{
+ NPT_TimeStamp now;
+ NPT_System::GetCurrentTimeStamp(now);
+
+ if (m_Rate == NPT_TimeStamp() || m_LastEvent + m_Rate <= now ) {
+ m_LastEvent = now;
+ return true;
+ }
+
+ return false;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::ValidateValue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_StateVariable::ValidateValue(const char* value)
+{
+ if (m_DataType.Compare("string", true) == 0) {
+ // if we have a value allowed restriction, make sure the value is in our list
+ if (m_AllowedValues.GetItemCount()) {
+ return m_AllowedValues.Find(NPT_StringFinder(value))?NPT_SUCCESS:NPT_FAILURE;
+ }
+ }
+
+ // TODO: there are more to it than allowed values, we need to test for range, etc..
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable::Find
++---------------------------------------------------------------------*/
+PLT_StateVariable*
+PLT_StateVariable::Find(NPT_List& vars, const char* name)
+{
+ PLT_StateVariable* stateVariable = NULL;
+ NPT_ContainerFind(vars, PLT_StateVariableNameFinder(name), stateVariable);
+ return stateVariable;
+}
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltStateVariable.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltStateVariable.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,139 @@
+/*****************************************************************
+|
+| Platinum - Service State Variable
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_STATE_VARIABLE_H_
+#define _PLT_STATE_VARIABLE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_Argument;
+class PLT_Service;
+
+/*----------------------------------------------------------------------
+| NPT_AllowedValueRange class
++---------------------------------------------------------------------*/
+typedef struct {
+ NPT_Int32 min_value;
+ NPT_Int32 max_value;
+ NPT_Int32 step;
+} NPT_AllowedValueRange;
+
+/*----------------------------------------------------------------------
+| PLT_StateVariable class
++---------------------------------------------------------------------*/
+class PLT_StateVariable
+{
+public:
+ PLT_StateVariable(PLT_Service* service);
+ ~PLT_StateVariable();
+
+ NPT_Result GetSCPDXML(NPT_XmlElementNode* node);
+ PLT_Service* GetService();
+ bool IsSendingEvents(bool indirectly = false);
+ void DisableIndirectEventing();
+ NPT_Result SetRate(NPT_TimeInterval rate);
+ NPT_Result SetValue(const char* value);
+ NPT_Result ValidateValue(const char* value);
+
+ const NPT_String& GetName() const { return m_Name; }
+ const NPT_String& GetValue() const { return m_Value; }
+ const NPT_String& GetDataType() const { return m_DataType; }
+
+ static PLT_StateVariable* Find(NPT_List& vars,
+ const char* name);
+
+protected:
+ bool IsReadyToPublish();
+
+protected:
+ friend class PLT_Service;
+
+ //members
+ PLT_Service* m_Service;
+ NPT_AllowedValueRange* m_AllowedValueRange;
+ NPT_String m_Name;
+ NPT_String m_DataType;
+ NPT_String m_DefaultValue;
+ bool m_IsSendingEvents;
+ bool m_IsSendingEventsIndirectly;
+ NPT_TimeInterval m_Rate;
+ NPT_TimeStamp m_LastEvent;
+ NPT_Array m_AllowedValues;
+ NPT_String m_Value;
+};
+
+/*----------------------------------------------------------------------
+| PLT_StateVariableNameFinder
++---------------------------------------------------------------------*/
+class PLT_StateVariableNameFinder
+{
+public:
+ // methods
+ PLT_StateVariableNameFinder(const char* name) : m_Name(name) {}
+ virtual ~PLT_StateVariableNameFinder() {}
+
+ bool operator()(const PLT_StateVariable* const & state_variable) const {
+ return state_variable->GetName().Compare(m_Name, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Name;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ListStateVariableNameFinder
++---------------------------------------------------------------------*/
+class PLT_ListStateVariableNameFinder
+{
+public:
+ // methods
+ PLT_ListStateVariableNameFinder(const char* name) : m_Name(name) {}
+ virtual ~PLT_ListStateVariableNameFinder() {}
+
+ bool operator()(const PLT_StateVariable* const & state_variable) const {
+ return state_variable->GetName().Compare(m_Name, true) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Name;
+};
+
+#endif /* _PLT_STATE_VARIABLE_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltStreamPump.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltStreamPump.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,226 @@
+/*****************************************************************
+|
+| Platinum - Stream Pump
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+ ****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltStreamPump.h"
+#include "NptUtils.h"
+
+/*----------------------------------------------------------------------
+| PLT_StreamPump::PLT_StreamPump
++---------------------------------------------------------------------*/
+PLT_StreamPump::PLT_StreamPump(NPT_Size size) :
+ m_TotalBytesRead(0),
+ m_TotalBytesWritten(0)
+{
+ m_RingBuffer = new NPT_RingBuffer(size);
+}
+
+/*----------------------------------------------------------------------
+| PLT_StreamPump::~PLT_StreamPump
++---------------------------------------------------------------------*/
+PLT_StreamPump::~PLT_StreamPump()
+{
+ delete m_RingBuffer;
+}
+/*----------------------------------------------------------------------+
+| PLT_StreamPump::PushData
++----------------------------------------------------------------------*/
+NPT_Result
+PLT_StreamPump::PushData(NPT_OutputStream& output,
+ NPT_Size& bytes_written)
+{
+ NPT_Result res = NPT_ERROR_WOULD_BLOCK;
+ NPT_Size count = 0;
+ NPT_Size bytes_available = m_RingBuffer->GetContiguousAvailable();
+
+ bytes_written = 0;
+
+ if (bytes_available) {
+ res = output.Write(m_RingBuffer->GetReadPointer(), bytes_available, &count);
+ m_RingBuffer->MoveOut(count);
+ bytes_written += count;
+
+ // check if we wrapped around
+ bytes_available = m_RingBuffer->GetContiguousAvailable();
+ if (NPT_SUCCEEDED(res) && bytes_available) {
+ res = output.Write(m_RingBuffer->GetReadPointer(), bytes_available, &count);
+ m_RingBuffer->MoveOut(count);
+ bytes_written += count;
+ }
+ }
+
+ m_TotalBytesWritten += bytes_written;
+
+ return res;
+}
+
+/*----------------------------------------------------------------------+
+| PLT_StreamPump::PullData
++----------------------------------------------------------------------*/
+NPT_Result
+PLT_StreamPump::PullData(NPT_InputStream& input,
+ NPT_Size max_bytes_to_read)
+{
+ NPT_Result res = NPT_ERROR_WOULD_BLOCK;
+ NPT_Size byte_space = m_RingBuffer->GetContiguousSpace();
+
+ // check that there is space left
+ // make sure we don't read more than our contiguous space
+ NPT_Size nb_to_read = (max_bytes_to_read 0) {
+ NPT_Size count;
+ res = input.Read(m_RingBuffer->GetWritePointer(), nb_to_read, &count);
+ m_RingBuffer->MoveIn(count);
+ max_bytes_to_read -= count;
+ m_TotalBytesRead += count;
+
+ byte_space = m_RingBuffer->GetContiguousSpace();
+ nb_to_read = (max_bytes_to_read 0)) {
+ res = input.Read(m_RingBuffer->GetWritePointer(), nb_to_read, &count);
+ m_RingBuffer->MoveIn(count);
+ m_TotalBytesRead += count;
+ }
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump::PLT_PipeInputStreamPump
++---------------------------------------------------------------------*/
+PLT_PipeInputStreamPump::PLT_PipeInputStreamPump(NPT_OutputStreamReference& output,
+ NPT_Size size) :
+ PLT_StreamPump(size),
+ m_Output(output),
+ m_LastRes(NPT_SUCCESS)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump::~PLT_PipeInputStreamPump
++---------------------------------------------------------------------*/
+PLT_PipeInputStreamPump::~PLT_PipeInputStreamPump()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump::Receive
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PipeInputStreamPump::Receive(NPT_InputStream& input,
+ NPT_Size max_bytes_to_read,
+ NPT_Size* bytes_read)
+{
+ NPT_Size count;
+ NPT_Result res;
+
+ if ((m_LastRes == NPT_SUCCESS) || (m_LastRes == NPT_ERROR_WOULD_BLOCK)) {
+ // look at what we have buffered already from out input
+ // and if have less than what was asked, read more
+ NPT_Size available = m_RingBuffer->GetAvailable();
+ if (available < max_bytes_to_read) {
+ m_LastRes = PullData(input, max_bytes_to_read-available);
+ }
+ } else if (!m_RingBuffer->GetAvailable()) {
+ // if the buffer is now empty, return the input last error
+ return m_LastRes;
+ }
+
+ // write as much as we can on the output stream
+ res = PushData(*m_Output, count);
+
+ if (bytes_read) *bytes_read = count;
+ return res;
+}
+
+
+/*----------------------------------------------------------------------
+| PLT_PipeOutputStreamPump::PLT_PipeOutputStreamPump
++---------------------------------------------------------------------*/
+PLT_PipeOutputStreamPump::PLT_PipeOutputStreamPump(NPT_InputStreamReference& input,
+ NPT_Size size /* 65535 */,
+ NPT_Size max_bytes_to_read /* = 0 */) :
+ PLT_StreamPump(size),
+ m_Input(input),
+ m_MaxBytesToRead(max_bytes_to_read),
+ m_LastRes(NPT_SUCCESS)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeOutputStreamPump::~PLT_PipeOutputStreamPump
++---------------------------------------------------------------------*/
+PLT_PipeOutputStreamPump::~PLT_PipeOutputStreamPump()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_PipeOutputStreamPump::Transmit
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PipeOutputStreamPump::Transmit(NPT_OutputStream& output)
+{
+ NPT_Size count;
+ NPT_Result res;
+
+ if ((m_LastRes == NPT_SUCCESS) || (m_LastRes == NPT_ERROR_WOULD_BLOCK)) {
+ // fill the entire space by default
+ NPT_Size max_space = m_RingBuffer->GetSpace();
+ if (max_space) {
+ NPT_Size max_to_read = max_space;
+ if (m_MaxBytesToRead != 0) {
+ // if a total maximum amount was set, make sure we don't read more
+ max_to_read = ((m_MaxBytesToRead - m_TotalBytesRead) < max_space) ? (m_MaxBytesToRead - m_TotalBytesRead) : max_space;
+ }
+
+ // any data to read
+ if (max_to_read) {
+ m_LastRes = PullData(*m_Input, max_to_read);
+ } else {
+ m_LastRes = NPT_ERROR_EOS;
+ }
+ }
+ } else if (!m_RingBuffer->GetAvailable()) {
+ // if the buffer is now empty, return the input last error
+ return m_LastRes;
+ }
+
+ // write as much as we can on the output stream
+ res = PushData(output, count);
+ return res;
+}
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltStreamPump.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltStreamPump.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,131 @@
+/*****************************************************************
+|
+| Platinum - Stream Pump
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_STREAM_PUMP_H_
+#define _PLT_STREAM_PUMP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptStreams.h"
+#include "NptRingBuffer.h"
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStream
++---------------------------------------------------------------------*/
+class PLT_PipeInputStream
+{
+public:
+ // constructor and destructor
+ virtual ~PLT_PipeInputStream() {};
+
+ // methods
+ virtual NPT_Result Receive(NPT_InputStream& stream, NPT_Size max_bytes_to_read, NPT_Size* bytes_read = 0) = 0;
+};
+
+typedef NPT_Reference PLT_PipeInputStreamReference;
+
+/*----------------------------------------------------------------------
+| PLT_PipeOutputStream
++---------------------------------------------------------------------*/
+class PLT_PipeOutputStream
+{
+public:
+ // constructor and destructor
+ virtual ~PLT_PipeOutputStream() {};
+
+ // methods
+ virtual NPT_Result Transmit(NPT_OutputStream& stream) = 0;
+};
+
+typedef NPT_Reference PLT_PipeOutputStreamReference;
+
+/*----------------------------------------------------------------------
+| PLT_StreamPump class
++---------------------------------------------------------------------*/
+class PLT_StreamPump
+{
+public:
+ virtual ~PLT_StreamPump();
+
+protected:
+ // methods
+ PLT_StreamPump(NPT_Size size = 65535);
+ NPT_Result PullData(NPT_InputStream& input, NPT_Size max_bytes_to_read);
+ NPT_Result PushData(NPT_OutputStream& output, NPT_Size& bytes_written);
+
+ // members
+ NPT_RingBuffer* m_RingBuffer;
+ NPT_Offset m_TotalBytesRead;
+ NPT_Offset m_TotalBytesWritten;
+};
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump class
++---------------------------------------------------------------------*/
+class PLT_PipeInputStreamPump : public PLT_StreamPump,
+ public PLT_PipeInputStream
+{
+public:
+ PLT_PipeInputStreamPump(NPT_OutputStreamReference& output, NPT_Size size = 65535);
+ virtual ~PLT_PipeInputStreamPump();
+
+ NPT_Result Receive(NPT_InputStream& input, NPT_Size max_bytes_to_read, NPT_Size* bytes_read);
+
+protected:
+ NPT_OutputStreamReference m_Output;
+ NPT_Result m_LastRes;
+};
+
+/*----------------------------------------------------------------------
+| PLT_PipeInputStreamPump class
++---------------------------------------------------------------------*/
+class PLT_PipeOutputStreamPump : public PLT_StreamPump,
+ public PLT_PipeOutputStream
+{
+public:
+ PLT_PipeOutputStreamPump(NPT_InputStreamReference& input,
+ NPT_Size size = 65535,
+ NPT_Size max_bytes_to_read = 0);
+ virtual ~PLT_PipeOutputStreamPump();
+
+ NPT_Result Transmit(NPT_OutputStream& output);
+
+protected:
+ NPT_InputStreamReference m_Input;
+ NPT_Size m_MaxBytesToRead;
+ NPT_Result m_LastRes;
+};
+
+
+#endif // _PLT_STREAM_PUMP_H_
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltTaskManager.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltTaskManager.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,147 @@
+/*****************************************************************
+|
+| Platinum - Task Manager
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltTaskManager.h"
+#include "PltThreadTask.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.taskmanager")
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::PLT_TaskManager
++---------------------------------------------------------------------*/
+PLT_TaskManager::PLT_TaskManager(NPT_Cardinal max_items /* = 0 */) :
+ m_Queue(max_items?new NPT_Queue(max_items):NULL)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::~PLT_TaskManager
++---------------------------------------------------------------------*/
+PLT_TaskManager::~PLT_TaskManager()
+{
+ StopAllTasks();
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::StartTask
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_TaskManager::StartTask(PLT_ThreadTask* task,
+ NPT_TimeInterval* delay /* = NULL*/,
+ bool auto_destroy /* = true */)
+{
+ return task->Start(this, delay, auto_destroy);
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::StopAllTasks
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_TaskManager::StopAllTasks()
+{
+ // unblock the queue if any
+ if (m_Queue) {
+ NPT_Queue* queue = m_Queue;
+ m_Queue = NULL;
+ delete queue;
+ }
+
+ // stop all tasks first but don't block
+ // otherwise when RemoveTask is called by PLT_ThreadTask::Run
+ // it will deadlock with m_TasksLock
+ {
+ NPT_AutoLock lock(m_TasksLock);
+ NPT_List::Iterator task = m_Tasks.GetFirstItem();
+ while (task) {
+ (*task)->Stop(false);
+ ++task;
+ }
+ }
+
+ // then wait for list to become empty
+ // as tasks remove themselves from the list
+ while (1) {
+ {
+ NPT_AutoLock lock(m_TasksLock);
+ if (m_Tasks.GetItemCount() == 0)
+ return NPT_SUCCESS;
+ }
+
+ NPT_System::Sleep(NPT_TimeInterval(0, 10000));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::AddTask
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_TaskManager::AddTask(PLT_ThreadTask* task)
+{
+ if (m_Queue) {
+ NPT_CHECK_SEVERE(m_Queue->Push(new int));
+ }
+
+ {
+ NPT_AutoLock lock(m_TasksLock);
+ return m_Tasks.Add(task);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager::RemoveTask
++---------------------------------------------------------------------*/
+// called by a PLT_ThreadTask::Run when done
+NPT_Result
+PLT_TaskManager::RemoveTask(PLT_ThreadTask* task)
+{
+ if (m_Queue) {
+ int* val = NULL;
+ if (NPT_SUCCEEDED(m_Queue->Pop(val)))
+ delete val;
+ }
+
+ {
+ NPT_AutoLock lock(m_TasksLock);
+ m_Tasks.Remove(task);
+ }
+
+ // cleanup task only if auto-destroy flag was set
+ if (task->m_AutoDestroy) delete task;
+
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltTaskManager.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltTaskManager.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,82 @@
+/*****************************************************************
+|
+| Platinum - Task Manager
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_TASKMANAGER_H_
+#define _PLT_TASKMANAGER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_ThreadTask;
+
+/*----------------------------------------------------------------------
+| PLT_TaskManager class
++---------------------------------------------------------------------*/
+class PLT_TaskManager
+{
+ friend class PLT_ThreadTask;
+ friend class PLT_ThreadTaskCallback;
+
+public:
+ PLT_TaskManager(NPT_Cardinal max_items = 0);
+ virtual ~PLT_TaskManager();
+
+ // tasks related methods
+ virtual NPT_Result StartTask(PLT_ThreadTask* task,
+ NPT_TimeInterval* delay = NULL,
+ bool auto_destroy = true);
+
+ // methods
+ NPT_Result StopAllTasks();
+
+private:
+ // called by PLT_ThreadTaskCallback
+ NPT_Mutex& GetCallbackLock() { return m_CallbackLock; }
+
+ // called by PLT_ThreadTask
+ NPT_Result AddTask(PLT_ThreadTask* task);
+ NPT_Result RemoveTask(PLT_ThreadTask* task);
+
+private:
+ NPT_List m_Tasks;
+ NPT_Mutex m_TasksLock;
+ NPT_Mutex m_CallbackLock;
+ NPT_Queue* m_Queue;
+};
+
+#endif /* _PLT_TASKMANAGER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltThreadTask.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltThreadTask.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,157 @@
+/*****************************************************************
+|
+| Platinum - Tasks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltThreadTask.h"
+#include "PltTaskManager.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.threadtask")
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::PLT_ThreadTask
++---------------------------------------------------------------------*/
+PLT_ThreadTask::PLT_ThreadTask() :
+ m_TaskManager(NULL),
+ m_Thread(NULL),
+ m_AutoDestroy(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::~PLT_ThreadTask
++---------------------------------------------------------------------*/
+PLT_ThreadTask::~PLT_ThreadTask()
+{
+ if (!m_AutoDestroy) delete m_Thread;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::Start
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ThreadTask::Start(PLT_TaskManager* task_manager /* = NULL */,
+ NPT_TimeInterval* delay /* = NULL */,
+ bool auto_destroy /* = true */)
+{
+ m_Abort.SetValue(0);
+ m_AutoDestroy = auto_destroy;
+
+ if (delay) m_Delay = *delay;
+
+ if (task_manager) {
+ m_TaskManager = task_manager;
+ NPT_CHECK_SEVERE(m_TaskManager->AddTask(this));
+ }
+
+ m_Thread = new NPT_Thread((NPT_Runnable&)*this, m_AutoDestroy);
+ return m_Thread->Start();
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ThreadTask::Stop(bool blocking /* = true */)
+{
+ m_Abort.SetValue(1);
+
+ // tell thread we want to die
+ DoAbort();
+
+ // if auto-destroy, the thread may be dead, so we can't wait
+ // regardless on the m_Thread...only TaskManager knows
+ if (m_AutoDestroy == true && blocking) return NPT_FAILURE;
+
+ // wait for thread to be dead
+ return (blocking && m_Thread)?m_Thread->Wait():NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::Kill
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ThreadTask::Kill()
+{
+ // A task can only be destroyed manually
+ // when the m_AutoDestroy is false
+ // otherwise the task manager takes
+ // care of deleting it
+
+ NPT_ASSERT(m_AutoDestroy == false);
+
+ Stop();
+
+ // cleanup
+ delete this;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask::Run
++---------------------------------------------------------------------*/
+void
+PLT_ThreadTask::Run()
+{
+ if (m_Delay) {
+ NPT_TimeStamp start, now;
+ NPT_System::GetCurrentTimeStamp(start);
+ do {
+ NPT_System::GetCurrentTimeStamp(now);
+ if (now >= start + m_Delay) break;
+ } while(!IsAborting(100));
+ }
+
+ if (!IsAborting(0)) {
+ DoInit();
+ DoRun();
+ }
+
+ if (m_TaskManager) {
+ m_TaskManager->RemoveTask(this);
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTaskCallback::Callback
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_ThreadTaskCallback::Callback()
+{
+ // acquire global lock
+ NPT_AutoLock lock(m_Lock);
+
+ // invoke callback
+ return DoCallback();
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltThreadTask.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltThreadTask.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,108 @@
+/*****************************************************************
+|
+| Platinum - Thread Tasks
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_THREADTASK_H_
+#define _PLT_THREADTASK_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltTaskManager.h"
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTask class
++---------------------------------------------------------------------*/
+class PLT_ThreadTask : public NPT_Runnable
+{
+public:
+ friend class PLT_TaskManager;
+
+ PLT_ThreadTask();
+
+ NPT_Result Kill();
+
+ virtual bool IsAborting(NPT_Timeout timeout = NPT_TIMEOUT_INFINITE) {
+ return NPT_SUCCEEDED(m_Abort.WaitUntilEquals(1, timeout));
+ }
+
+protected:
+ NPT_Result Start(PLT_TaskManager* task_manager = NULL,
+ NPT_TimeInterval* delay = NULL,
+ bool auto_destroy = true);
+ NPT_Result Stop(bool blocking = true);
+
+ // overridable
+ virtual void DoAbort() {}
+ virtual void DoRun() {}
+ virtual void DoInit() {}
+
+ // the task manager will destroy the task when finished
+ // if m_AutoDestroy is set otherwise use Kill
+ virtual ~PLT_ThreadTask();
+
+private:
+ // NPT_Thread methods
+ void Run();
+
+protected:
+ // members
+ PLT_TaskManager* m_TaskManager;
+
+private:
+ // members
+ NPT_SharedVariable m_Abort;
+ NPT_Thread* m_Thread;
+ bool m_AutoDestroy;
+ NPT_TimeInterval m_Delay;
+};
+
+/*----------------------------------------------------------------------
+| PLT_ThreadTaskCallback class
++---------------------------------------------------------------------*/
+class PLT_ThreadTaskCallback
+{
+public:
+ PLT_ThreadTaskCallback(NPT_Mutex& lock) : m_Lock(lock) {}
+ virtual ~PLT_ThreadTaskCallback() {};
+
+ NPT_Result Callback();
+
+protected:
+ virtual NPT_Result DoCallback() = 0;
+
+protected:
+ NPT_Mutex& m_Lock;
+};
+
+#endif /* _PLT_THREADTASK_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltUPnP.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltUPnP.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,259 @@
+/*****************************************************************
+|
+| Platinum - UPnP Engine
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltVersion.h"
+#include "PltUPnP.h"
+#include "PltDeviceHost.h"
+#include "PltCtrlPoint.h"
+#include "PltSsdp.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.upnp")
+
+/*----------------------------------------------------------------------
+| PLT_UPnP_CtrlPointStartIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_CtrlPointStartIterator
+{
+public:
+ PLT_UPnP_CtrlPointStartIterator(PLT_SsdpListenTask* listen_task) :
+ m_ListenTask(listen_task) {}
+ virtual ~PLT_UPnP_CtrlPointStartIterator() {}
+
+ NPT_Result operator()(PLT_CtrlPointReference& ctrl_point) const {
+ NPT_CHECK_SEVERE(ctrl_point->Start(m_ListenTask));
+ return NPT_SUCCESS;
+ }
+
+private:
+ PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+| PLT_UPnP_CtrlPointStopIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_CtrlPointStopIterator
+{
+public:
+ PLT_UPnP_CtrlPointStopIterator(PLT_SsdpListenTask* listen_task) :
+ m_ListenTask(listen_task) {}
+ virtual ~PLT_UPnP_CtrlPointStopIterator() {}
+
+ NPT_Result operator()(PLT_CtrlPointReference& ctrl_point) const {
+ return ctrl_point->Stop(m_ListenTask);
+ }
+
+
+private:
+ PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+| PLT_UPnP_DeviceStartIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_DeviceStartIterator
+{
+public:
+ PLT_UPnP_DeviceStartIterator(PLT_SsdpListenTask* listen_task) :
+ m_ListenTask(listen_task) {}
+ virtual ~PLT_UPnP_DeviceStartIterator() {}
+
+ NPT_Result operator()(PLT_DeviceHostReference& device_host) const {
+ NPT_CHECK_SEVERE(device_host->Start(m_ListenTask));
+ return NPT_SUCCESS;
+ }
+
+private:
+ PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+| PLT_UPnP_DeviceStopIterator class
++---------------------------------------------------------------------*/
+class PLT_UPnP_DeviceStopIterator
+{
+public:
+ PLT_UPnP_DeviceStopIterator(PLT_SsdpListenTask* listen_task) :
+ m_ListenTask(listen_task) {}
+ virtual ~PLT_UPnP_DeviceStopIterator() {}
+
+ NPT_Result operator()(PLT_DeviceHostReference& device_host) const {
+ return device_host->Stop(m_ListenTask);
+ }
+
+
+private:
+ PLT_SsdpListenTask* m_ListenTask;
+};
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::PLT_UPnP
++---------------------------------------------------------------------*/
+PLT_UPnP::PLT_UPnP(NPT_UInt32 port, bool multicast /* = true */) :
+ m_Started(false),
+ m_Port(port),
+ m_Multicast(multicast),
+ m_SsdpListenTask(NULL)
+{
+ NPT_HttpClient::m_UserAgentHeader = "Platinum/" PLT_PLATINUM_VERSION_STRING;
+ NPT_HttpServer::m_ServerHeader = "UPnP/1.0, Platinum/" PLT_PLATINUM_VERSION_STRING;
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::~PLT_UPnP
++---------------------------------------------------------------------*/
+PLT_UPnP::~PLT_UPnP()
+{
+ Stop();
+
+ m_CtrlPoints.Clear();
+ m_Devices.Clear();
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::Start()
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::Start()
+{
+ NPT_LOG_INFO("Starting UPnP...");
+
+ NPT_AutoLock lock(m_Lock);
+
+ if (m_Started == true) return NPT_FAILURE;
+
+ NPT_Socket* socket = m_Multicast?new NPT_UdpMulticastSocket(): new NPT_UdpSocket();
+ NPT_CHECK_SEVERE(socket->Bind(NPT_SocketAddress(NPT_IpAddress::Any, m_Port)));
+
+ /* create the ssdp listener */
+ m_SsdpListenTask = new PLT_SsdpListenTask(socket, m_Multicast);
+ NPT_CHECK_SEVERE(m_TaskManager.StartTask(m_SsdpListenTask));
+
+ /* start devices & ctrlpoints */
+ m_CtrlPoints.Apply(PLT_UPnP_CtrlPointStartIterator(m_SsdpListenTask));
+ m_Devices.Apply(PLT_UPnP_DeviceStartIterator(m_SsdpListenTask));
+
+ m_Started = true;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::Stop()
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (m_Started == false) return NPT_FAILURE;
+
+ NPT_LOG_INFO("Stopping UPnP...");
+
+ // Stop ctrlpoints and devices first
+ m_CtrlPoints.Apply(PLT_UPnP_CtrlPointStopIterator(m_SsdpListenTask));
+ m_Devices.Apply(PLT_UPnP_DeviceStopIterator(m_SsdpListenTask));
+
+ m_TaskManager.StopAllTasks();
+ m_SsdpListenTask = NULL;
+
+ m_Started = false;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::AddDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::AddDevice(PLT_DeviceHostReference& device)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (m_Started) {
+ NPT_LOG_INFO("Starting Device...");
+ NPT_CHECK_SEVERE(device->Start(m_SsdpListenTask));
+ }
+
+ m_Devices.Add(device);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::RemoveDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::RemoveDevice(PLT_DeviceHostReference& device)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (m_Started) {
+ device->Stop(m_SsdpListenTask);
+ }
+
+ return m_Devices.Remove(device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::AddCtrlPoint
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::AddCtrlPoint(PLT_CtrlPointReference& ctrl_point)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (m_Started) {
+ NPT_LOG_INFO("Starting Ctrlpoint...");
+ NPT_CHECK_SEVERE(ctrl_point->Start(m_SsdpListenTask));
+ }
+
+ m_CtrlPoints.Add(ctrl_point);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_UPnP::RemoveCtrlPoint
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_UPnP::RemoveCtrlPoint(PLT_CtrlPointReference& ctrl_point)
+{
+ NPT_AutoLock lock(m_Lock);
+
+ if (m_Started) {
+ ctrl_point->Stop(m_SsdpListenTask);
+ }
+
+ return m_CtrlPoints.Remove(ctrl_point);
+}
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltUPnP.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltUPnP.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,84 @@
+/*****************************************************************
+|
+| Platinum - UPnP Engine
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_UPNP_H_
+#define _PLT_UPNP_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltTaskManager.h"
+#include "PltCtrlPoint.h"
+#include "PltDeviceHost.h"
+#include "PltUPnPHelper.h"
+
+/*----------------------------------------------------------------------
+| forward definitions
++---------------------------------------------------------------------*/
+class PLT_SsdpListenTask;
+
+/*----------------------------------------------------------------------
+| PLT_UPnP class
++---------------------------------------------------------------------*/
+class PLT_UPnP
+{
+public:
+ PLT_UPnP(NPT_UInt32 ssdp_port = 1900, bool multicast = true);
+ ~PLT_UPnP();
+
+ NPT_Result AddDevice(PLT_DeviceHostReference& device);
+ NPT_Result AddCtrlPoint(PLT_CtrlPointReference& ctrlpoint);
+
+ NPT_Result RemoveDevice(PLT_DeviceHostReference& device);
+ NPT_Result RemoveCtrlPoint(PLT_CtrlPointReference& ctrlpoint);
+
+ NPT_Result Start();
+ NPT_Result Stop();
+
+private:
+ // members
+ NPT_Mutex m_Lock;
+ NPT_List m_Devices;
+ NPT_List m_CtrlPoints;
+ PLT_TaskManager m_TaskManager;
+
+ // since we can only have one socket listening on port 1900,
+ // we create it in here and we will attach every control points
+ // and devices to it when they're added
+ bool m_Started;
+ NPT_UInt32 m_Port;
+ bool m_Multicast;
+ PLT_SsdpListenTask* m_SsdpListenTask;
+};
+
+#endif /* _PLT_UPNP_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltUPnPHelper.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltUPnPHelper.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,306 @@
+/*****************************************************************
+|
+| Platinum - UPnP Helper
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_UPNP_HELPER_H_
+#define _PLT_UPNP_HELPER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| NPT_StringFinder
++---------------------------------------------------------------------*/
+class NPT_StringFinder
+{
+public:
+ // methods
+ NPT_StringFinder(const char* value) : m_Value(value) {}
+ virtual ~NPT_StringFinder() {}
+ bool operator()(const NPT_String* const & value) const {
+ return value->Compare(m_Value) ? false : true;
+ }
+ bool operator()(const NPT_String& value) const {
+ return value.Compare(m_Value) ? false : true;
+ }
+
+private:
+ // members
+ NPT_String m_Value;
+};
+
+/*----------------------------------------------------------------------
+| PLT_UPnPMessageHelper class
++---------------------------------------------------------------------*/
+class PLT_UPnPMessageHelper
+{
+public:
+ // methods
+ static const NPT_String* GetST(NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("ST");
+ }
+ static NPT_Result SetST(NPT_HttpMessage& message,
+ const char* st) {
+ return message.GetHeaders().SetHeader("ST", st);
+ }
+ static const NPT_String* GetNT(NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("NT");
+ }
+ static NPT_Result SetNT(NPT_HttpMessage& message,
+ const char* nt) {
+ return message.GetHeaders().SetHeader("NT", nt);
+ }
+ static const NPT_String* GetNTS(NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("NTS");
+ }
+ static NPT_Result SetNTS(NPT_HttpMessage& message,
+ const char* nts) {
+ return message.GetHeaders().SetHeader("NTS", nts);
+ }
+ static const NPT_String* GetMAN(NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("MAN");
+ }
+ static NPT_Result SetMAN(NPT_HttpMessage& message,
+ const char* man) {
+ return message.GetHeaders().SetHeader("MAN", man);
+ }
+ static const NPT_String* GetLocation(NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("LOCATION");
+ }
+ static NPT_Result SetLocation(NPT_HttpMessage& message,
+ const char* location) {
+ return message.GetHeaders().SetHeader("LOCATION", location);
+ }
+ static const NPT_String* GetServer(NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue(NPT_HTTP_HEADER_SERVER);
+ }
+ static NPT_Result SetServer(NPT_HttpMessage& message,
+ const char* server,
+ bool replace = true) {
+ return message.GetHeaders().SetHeader(
+ NPT_HTTP_HEADER_SERVER,
+ server,
+ replace);
+ }
+ static const NPT_String* GetUSN(NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("USN");
+ }
+ static NPT_Result SetUSN(NPT_HttpMessage& message,
+ const char* usn) {
+ return message.GetHeaders().SetHeader("USN", usn);
+ }
+ static const NPT_String* GetCallbacks(NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("CALLBACK");
+ }
+ static NPT_Result SetCallbacks(NPT_HttpMessage& message,
+ const char* callbacks) {
+ return message.GetHeaders().SetHeader("CALLBACK", callbacks);
+ }
+ static const NPT_String* GetSID(NPT_HttpMessage& message) {
+ return message.GetHeaders().GetHeaderValue("SID");
+ }
+ static NPT_Result SetSID(NPT_HttpMessage& message,
+ const char* sid) {
+ return message.GetHeaders().SetHeader("SID", sid);
+ }
+ static NPT_Result GetLeaseTime(NPT_HttpMessage& message,
+ NPT_Timeout& value) {
+ value = 0;
+ const NPT_String* cc =
+ message.GetHeaders().GetHeaderValue("CACHE-CONTROL");
+ NPT_CHECK_POINTER(cc);
+ return ExtractLeaseTime(*cc, value);
+ }
+ static NPT_Result SetLeaseTime(NPT_HttpMessage& message,
+ const NPT_Timeout lease) {
+ return message.GetHeaders().SetHeader(
+ "CACHE-CONTROL",
+ "max-age="+NPT_String::FromInteger(lease));
+ }
+ static NPT_Result GetTimeOut(NPT_HttpMessage& message,
+ NPT_Int32& value) {
+ value = 0;
+ const NPT_String* timeout =
+ message.GetHeaders().GetHeaderValue("TIMEOUT");
+ NPT_CHECK_POINTER(timeout);
+ return ExtractTimeOut(*timeout, value);
+ }
+ static NPT_Result SetTimeOut(NPT_HttpMessage& message,
+ const NPT_Int32 timeout) {
+ if (timeout >= 0) {
+ return message.GetHeaders().SetHeader(
+ "TIMEOUT",
+ "Second-"+NPT_String::FromInteger(timeout));
+ } else {
+ return message.GetHeaders().SetHeader(
+ "TIMEOUT", "Second-infinite");
+ }
+ }
+ static NPT_Result GetMX(NPT_HttpMessage& message,
+ NPT_UInt32& value) {
+ value = 0;
+ const NPT_String* mx =
+ message.GetHeaders().GetHeaderValue("MX");
+ NPT_CHECK_POINTER(mx);
+ return NPT_ParseInteger32U(*mx, value);
+ }
+ static NPT_Result SetMX(NPT_HttpMessage& message,
+ const NPT_UInt32 mx) {
+ return message.GetHeaders().SetHeader(
+ "MX",
+ NPT_String::FromInteger(mx));
+ }
+ static NPT_Result GetSeq(NPT_HttpMessage& message,
+ NPT_UInt32& value) {
+ value = 0;
+ const NPT_String* seq =
+ message.GetHeaders().GetHeaderValue("SEQ");
+ NPT_CHECK_POINTER(seq);
+ return NPT_ParseInteger32U(*seq, value);
+ }
+ static NPT_Result SetSeq(NPT_HttpMessage& message,
+ const NPT_UInt32 seq) {
+ return message.GetHeaders().SetHeader(
+ "SEQ",
+ NPT_String::FromInteger(seq));
+ }
+ static const char* GenerateUUID(int count,
+ NPT_String& uuid) {
+ uuid = "";
+ for (int i=0;i<(count<100?count:100);i++) {
+ int random = NPT_System::GetRandomInteger();
+ uuid += (char)((random % 25) + 66);
+ }
+ return uuid;
+ }
+ static const char* GenerateGUID(NPT_String& guid) {
+ guid = "";
+ for (int i=0;i<32;i++) {
+ char nibble = (char)(NPT_System::GetRandomInteger() % 16);
+ guid += (nibble < 10) ? ('0' + nibble) : ('a' + (nibble-10));
+ if (i == 7 || i == 11 || i == 15 || i == 19) {
+ guid += '-';
+ }
+ }
+ return guid;
+ }
+ static NPT_Result ExtractLeaseTime(const char* cache_control,
+ NPT_Timeout& lease) {
+ int value;
+ if (cache_control &&
+ sscanf(cache_control, "max-age=%d", &value) == 1) {
+ lease = value;
+ return NPT_SUCCESS;
+ }
+ return NPT_FAILURE;
+ }
+ static NPT_Result ExtractTimeOut(const char* timeout,
+ NPT_Int32& len) {
+ NPT_String temp = timeout;
+ if (temp.CompareN("Second-", 7, true)) {
+ return NPT_ERROR_INVALID_FORMAT;
+ }
+
+ if (temp.Compare("Second-infinite", true) == 0) {
+ len = NPT_TIMEOUT_INFINITE;
+ return NPT_SUCCESS;
+ }
+ return temp.SubString(7).ToInteger(len);
+ }
+ static NPT_Result GetIPAddresses(NPT_List& ips) {
+ NPT_List if_list;
+ NPT_CHECK(NPT_NetworkInterface::GetNetworkInterfaces(if_list));
+
+ NPT_List::Iterator iface =
+ if_list.GetFirstItem();
+ while (iface) {
+ NPT_String ip =
+ (*(*iface)->GetAddresses().GetFirstItem()).GetPrimaryAddress().ToString();
+ if (ip.Compare("0.0.0.0") && ip.Compare("127.0.0.1")) {
+ ips.Add(ip);
+ }
+ ++iface;
+ }
+
+ if (ips.GetItemCount() == 0) {
+ ips.Add("127.0.0.1");
+ }
+
+ if_list.Apply(NPT_ObjectDeleter());
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result GetNetworkInterfaces(NPT_List& if_list,
+ bool with_localhost = false) {
+ NPT_CHECK(_GetNetworkInterfaces(if_list, false));
+
+ // if no valid interfaces or if requested, add localhost capable interface
+ if (if_list.GetItemCount() == 0 || with_localhost) {
+ NPT_CHECK(_GetNetworkInterfaces(if_list, true));
+ }
+ return NPT_SUCCESS;
+ }
+
+private:
+
+ static NPT_Result _GetNetworkInterfaces(NPT_List& if_list,
+ bool only_localhost = false) {
+ NPT_List _if_list;
+ NPT_CHECK(NPT_NetworkInterface::GetNetworkInterfaces(_if_list));
+
+ NPT_NetworkInterface* iface;
+ while (NPT_SUCCEEDED(_if_list.PopHead(iface))) {
+ NPT_String ip =
+ iface->GetAddresses().GetFirstItem()->GetPrimaryAddress().ToString();
+ if (ip.Compare("0.0.0.0") &&
+ ((!only_localhost && ip.Compare("127.0.0.1")) ||
+ (only_localhost && !ip.Compare("127.0.0.1")))) {
+ if_list.Add(iface);
+
+ // add localhost only once
+ if (only_localhost) break;
+ } else {
+ delete iface;
+ }
+ }
+
+ // cleanup any remaining items in list if we breaked early
+ _if_list.Apply(NPT_ObjectDeleter());
+ return NPT_SUCCESS;
+ }
+
+ NPT_String HttpServerHeader;
+};
+
+#endif /* _PLT_UPNP_HELPER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltVersion.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltVersion.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,42 @@
+/*****************************************************************
+|
+| Platinum - Version Info
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_VERSION_H_
+#define _PLT_VERSION_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#define PLT_PLATINUM_VERSION_STRING "0.4.9"
+
+#endif // _PLT_VERSION_H_
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Core/PltXmlHelper.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Core/PltXmlHelper.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,267 @@
+/*****************************************************************
+|
+| Platinum - Xml Helper
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_XML_HELPER_H_
+#define _PLT_XML_HELPER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+/*----------------------------------------------------------------------
+| PLT_XmlAttributeFinder
++---------------------------------------------------------------------*/
+class PLT_XmlAttributeFinder
+{
+public:
+ // if 'namespc' is NULL, we're looking for ANY namespace
+ // if 'namespc' is '\0', we're looking for NO namespace
+ // if 'namespc' is non-empty, look for that SPECIFIC namespace
+ PLT_XmlAttributeFinder(const NPT_XmlElementNode& element,
+ const char* name,
+ const char* namespc) :
+ m_Element(element), m_Name(name), m_Namespace(namespc) {}
+
+ bool operator()(const NPT_XmlAttribute* const & attribute) const {
+ if (attribute->GetName() == m_Name) {
+ if (m_Namespace) {
+ const NPT_String& prefix = attribute->GetPrefix();
+ if (m_Namespace[0] == '\0') {
+ // match if the attribute has NO namespace
+ return prefix.IsEmpty();
+ } else {
+ // match if the attribute has the SPECIFIC namespace
+ // we're looking for
+ const NPT_String* namespc = m_Element.GetNamespaceUri(prefix);
+ return namespc && *namespc == m_Namespace;
+ }
+ } else {
+ // ANY namespace will match
+ return true;
+ }
+ } else {
+ return false;
+ }
+ }
+
+private:
+ const NPT_XmlElementNode& m_Element;
+ const char* m_Name;
+ const char* m_Namespace;
+};
+
+/*----------------------------------------------------------------------
+| PLT_XmlHelper
++---------------------------------------------------------------------*/
+class PLT_XmlHelper
+{
+public:
+
+ // static methods
+ static NPT_Result GetChildText(NPT_XmlElementNode* node,
+ const char* tag,
+ NPT_String& value,
+ const char* namespc = "") {
+ value = "";
+
+ if (!node) return NPT_FAILURE;
+
+ // special case "" means we look for the same namespace as the parent
+ if (namespc && namespc[0] == '\0') namespc = node->GetNamespace()?node->GetNamespace()->GetChars():NPT_XML_NO_NAMESPACE;
+
+ NPT_XmlElementNode* child = node->GetChild(tag, namespc);
+ if (!child) return NPT_FAILURE;
+
+ const NPT_String* text = child->GetText();
+ value = text?*text:"";
+ return NPT_SUCCESS;
+ }
+
+
+ static NPT_Result GetAttribute(NPT_XmlElementNode* node,
+ const char* name,
+ NPT_XmlAttribute*& attr,
+ const char* namespc = "") {
+ attr = NULL;
+
+ if (!node) return NPT_FAILURE;
+
+ // special case "" means we look for the same namespace as the parent
+ if (namespc && namespc[0] == '\0') namespc = node->GetNamespace()?node->GetNamespace()->GetChars():NPT_XML_NO_NAMESPACE;
+
+ NPT_List::Iterator attribute;
+ attribute = node->GetAttributes().Find(PLT_XmlAttributeFinder(*node, name, namespc));
+ if (!attribute) return NPT_FAILURE;
+
+ attr = (*attribute);
+ return NPT_SUCCESS;
+ }
+
+
+ static NPT_Result GetAttribute(NPT_XmlElementNode* node,
+ const char* name,
+ NPT_String& value,
+ const char* namespc = "") {
+ value = "";
+
+ NPT_XmlAttribute* attribute = NULL;
+ NPT_CHECK(GetAttribute(node, name, attribute, namespc));
+ if (!attribute) return NPT_FAILURE;
+
+ value = attribute->GetValue();
+ return NPT_SUCCESS;
+ }
+
+ static NPT_Result AddChildText(NPT_XmlElementNode* node,
+ const char* tag,
+ const char* text,
+ const char* prefix = NULL) {
+ if (!node) return NPT_FAILURE;
+ NPT_XmlElementNode* child = new NPT_XmlElementNode(prefix, tag);
+ child->AddText(text);
+ return node->AddChild(child);
+ }
+
+ static bool IsMatch(const NPT_XmlNode* const & node, const char* tag, const char* namespc_mapped) {
+ // if m_Namespace is NULL, we're looking for ANY namespace
+ // if m_Namespace is '\0', we're looking for NO namespace
+ // if m_Namespace is non-empty, look for that SPECIFIC namespace
+
+ const NPT_XmlElementNode* element = node->AsElementNode();
+ // is tag the same (case sensitive)?
+ if (element && element->GetTag() == tag) {
+ if (namespc_mapped) {
+ // look for a SPECIFIC namespace or NO namespace
+ const NPT_String* namespc = element->GetNamespace();
+ if (namespc) {
+ // the element has a namespace, match if it is equal to
+ // what we're looking for
+ return *namespc == namespc_mapped;
+ } else {
+ // the element does not have a namespace, match if we're
+ // looking for NO namespace
+ return namespc_mapped[0] == '\0';
+ }
+ } else {
+ // ANY namespace will match
+ return true;
+ }
+ }
+ return false;
+ }
+
+ static NPT_Result GetChildren(NPT_XmlElementNode* node,
+ NPT_Array& children,
+ const char* tag,
+ const char* namespc = "") {
+ if (!node) return NPT_FAILURE;
+
+ // special case "" means we look for the same namespace as the parent
+ if (namespc && namespc[0] == '\0') namespc = node->GetNamespace()?node->GetNamespace()->GetChars():NPT_XML_NO_NAMESPACE;
+
+ const char* namespc_mapped = (namespc==NULL)?"":(namespc[0]=='*' && namespc[1]=='\0')?NULL:namespc;
+
+ // get all children first
+ NPT_List& allchildren = node->GetChildren();
+
+ // iterate through children and add only elements with matching tag
+ NPT_List::Iterator child = allchildren.GetFirstItem();
+ while (child) {
+ if (IsMatch(*child, tag, namespc_mapped)) {
+ children.Add((*child)->AsElementNode());
+ }
+ ++child;
+ }
+ return NPT_SUCCESS;
+ }
+
+ static NPT_XmlElementNode* GetChild(NPT_XmlElementNode* node,
+ const char* tag,
+ const char* namespc = "") {
+ if (!node) return NULL;
+
+ // special case "" means we look for the same namespace as the parent
+ if (namespc && namespc[0] == '\0') namespc = node->GetNamespace()?node->GetNamespace()->GetChars():NPT_XML_NO_NAMESPACE;
+
+ return node->GetChild(tag, namespc);
+ }
+
+ static NPT_Result GetChild(NPT_XmlElementNode* parent,
+ NPT_XmlElementNode*& child,
+ NPT_Ordinal n = 0) {
+ if (!parent) return NPT_FAILURE;
+
+ // reset child
+ child = NULL;
+
+ // get all children first
+ NPT_List::Iterator children = parent->GetChildren().GetFirstItem();
+ while (children) {
+ if ((*children)->AsElementNode() && n-- == 0) {
+ child = (*children)->AsElementNode();
+ return NPT_SUCCESS;
+ }
+ children++;
+ }
+
+ return NPT_FAILURE;
+ }
+
+ static NPT_Result Serialize(NPT_XmlNode& node, NPT_String& xml) {
+ NPT_XmlWriter writer(2);
+ NPT_MemoryStreamReference stream(new NPT_MemoryStream());
+ NPT_CHECK(writer.Serialize(node, *stream));
+
+ NPT_LargeSize size;
+ stream->GetAvailable(size);
+ if (size != (NPT_Size)size) return NPT_ERROR_OUT_OF_RANGE;
+
+ xml.Reserve((NPT_Size)size);
+ stream->Read(xml.UseChars(), (NPT_Size)size);
+ xml.SetLength((NPT_Size)size);
+ return NPT_SUCCESS;
+ }
+private:
+ // members
+};
+
+#endif // _PLT_XML_HELPER_H_
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/FrameStreamer/PltFrameBuffer.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/FrameStreamer/PltFrameBuffer.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,91 @@
+/*****************************************************************
+|
+| Platinum - Frame Buffer
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltFrameBuffer.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.framebuffer")
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::PLT_FrameBuffer
++---------------------------------------------------------------------*/
+PLT_FrameBuffer::PLT_FrameBuffer()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::~PLT_FrameBuffer
++---------------------------------------------------------------------*/
+PLT_FrameBuffer::~PLT_FrameBuffer()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::SetNextFrame
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameBuffer::SetNextFrame(const NPT_Byte* data, NPT_Size size)
+{
+ NPT_AutoLock lock(m_FrameLock);
+
+ m_Frame.SetData(data, size);
+ m_FrameIndex.SetValue(m_FrameIndex.GetValue()+1);
+
+ NPT_LOG_INFO_1("Set frame %d", m_FrameIndex.GetValue());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer::GetNextFrame
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameBuffer::GetNextFrame(NPT_UInt32& last_fame_index,
+ NPT_DataBuffer& buffer,
+ NPT_Timeout timeout)
+{
+ NPT_CHECK_WARNING(m_FrameIndex.WaitWhileEquals(last_fame_index, timeout));
+
+ {
+ NPT_AutoLock lock(m_FrameLock);
+ buffer.SetData(m_Frame.GetData(), m_Frame.GetDataSize());
+
+ // update current frame index
+ last_fame_index = m_FrameIndex.GetValue();
+ NPT_LOG_INFO_1("Retrieved frame %d", last_fame_index);
+ }
+
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/FrameStreamer/PltFrameBuffer.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/FrameStreamer/PltFrameBuffer.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,65 @@
+/*****************************************************************
+|
+| Platinum - Frame Buffer
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_FRAME_BUFFER_H_
+#define _PLT_FRAME_BUFFER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+
+/*----------------------------------------------------------------------
+| PLT_FrameBuffer
++---------------------------------------------------------------------*/
+class PLT_FrameBuffer
+{
+ public:
+ // constructor & destructor
+ PLT_FrameBuffer();
+ virtual ~PLT_FrameBuffer();
+
+ // data buffer handling methods
+ virtual NPT_Result SetNextFrame(const NPT_Byte* buffer, NPT_Size bufferSize);
+ virtual NPT_Result GetNextFrame(NPT_UInt32& last_fame_index,
+ NPT_DataBuffer& buffer,
+ NPT_Timeout timeout = NPT_TIMEOUT_INFINITE);
+
+ protected:
+ // members
+ NPT_SharedVariable m_FrameIndex;
+ NPT_DataBuffer m_Frame;
+ NPT_Mutex m_FrameLock;
+};
+
+#endif // _PLT_FRAME_BUFFER_H_
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/FrameStreamer/PltFrameServer.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/FrameStreamer/PltFrameServer.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,412 @@
+/*****************************************************************
+|
+| Platinum - Frame Server
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltMediaItem.h"
+#include "PltService.h"
+#include "PltDidl.h"
+#include "PltFrameStream.h"
+#include "PltFrameServer.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.frame")
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define BOUNDARY "BOUNDARYGOAWAY"
+
+/*----------------------------------------------------------------------
+| PLT_SocketPolicyServer
++---------------------------------------------------------------------*/
+class PLT_SocketPolicyServer : public NPT_Thread
+{
+public:
+ PLT_SocketPolicyServer(const char* policy, NPT_UInt32 port = 0) :
+ m_Policy(policy),
+ m_Port(port),
+ m_Aborted(false) {}
+
+ ~PLT_SocketPolicyServer() {
+ Stop();
+ }
+
+ NPT_Result Start() {
+ NPT_Result result = NPT_FAILURE;
+
+ // bind
+ // randomly try a port for our http server
+ int retries = 100;
+ do {
+ int random = NPT_System::GetRandomInteger();
+ int port = (unsigned short)(50000 + (random % 15000));
+
+ result = m_Socket.Bind(
+ NPT_SocketAddress(NPT_IpAddress::Any, m_Port?m_Port:port),
+ true);
+
+ if (NPT_SUCCEEDED(result) || m_Port)
+ break;
+ } while (--retries > 0);
+
+ if (NPT_FAILED(result) || retries == 0) return NPT_FAILURE;
+
+ // remember that we're bound
+ NPT_SocketInfo info;
+ m_Socket.GetInfo(info);
+ m_Port = info.local_address.GetPort();
+
+ return NPT_Thread::Start();
+ }
+
+ NPT_Result Stop() {
+ m_Aborted = true;
+ m_Socket.Disconnect();
+
+ return Wait();
+ }
+
+ void Run() {
+ do {
+ // wait for a connection
+ NPT_Socket* client = NULL;
+ NPT_LOG_FINE_1("waiting for connection on port %d...", m_Port);
+ NPT_Result result = m_Socket.WaitForNewClient(client, NPT_TIMEOUT_INFINITE);
+ if (NPT_FAILED(result) || client == NULL) return;
+
+ NPT_SocketInfo client_info;
+ client->GetInfo(client_info);
+ NPT_LOG_FINE_2("client connected (%s)",
+ client_info.local_address.ToString().GetChars(),
+ client_info.remote_address.ToString().GetChars());
+
+ // get the output stream
+ NPT_OutputStreamReference output;
+ client->GetOutputStream(output);
+
+ NPT_MemoryStream* policy = new NPT_MemoryStream();
+ policy->Write(m_Policy.GetChars(), m_Policy.GetLength());
+ NPT_InputStreamReference input(policy);
+
+ NPT_StreamToStreamCopy(*input, *output);
+
+
+ delete client;
+ } while (!m_Aborted);
+ }
+
+ NPT_TcpServerSocket m_Socket;
+ NPT_String m_Policy;
+ NPT_UInt32 m_Port;
+ bool m_Aborted;
+};
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::PLT_FrameServer
++---------------------------------------------------------------------*/
+PLT_FrameServer::PLT_FrameServer(PLT_FrameBuffer& frame_buffer,
+ const char* www_root,
+ const char* friendly_name,
+ bool show_ip,
+ const char* uuid,
+ NPT_UInt16 port) :
+ PLT_FileMediaServer(www_root,
+ friendly_name,
+ show_ip,
+ uuid,
+ port),
+ m_FrameBuffer(frame_buffer),
+ m_PolicyServer(NULL)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::~PLT_FrameServer
++---------------------------------------------------------------------*/
+PLT_FrameServer::~PLT_FrameServer()
+{
+ delete m_PolicyServer;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::SetupDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameServer::SetupDevice()
+{
+ // FIXME: hack for now: find the first valid non local ip address
+ // to use in item resources. TODO: we should advertise all ips as
+ // multiple resources instead.
+ NPT_List ips;
+ PLT_UPnPMessageHelper::GetIPAddresses(ips);
+ if (ips.GetItemCount() == 0) return NPT_ERROR_INTERNAL;
+
+ // set the base paths for content
+ m_StreamBaseUri = NPT_HttpUrl(*ips.GetFirstItem(), GetPort(), "/screensplitr");
+
+ // start the xml socket policy server for flash
+ m_PolicyServer = new PLT_SocketPolicyServer(
+ "",
+ 8989);
+ NPT_CHECK_SEVERE(m_PolicyServer->Start());
+
+ return PLT_FileMediaServer::SetupDevice();
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::ProcessHttpRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameServer::ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ if (request.GetUrl().GetPath().StartsWith(m_StreamBaseUri.GetPath())) {
+ return ProcessStreamRequest(request, context, response);
+ }
+
+ return PLT_FileMediaServer::ProcessHttpRequest(request, context, response);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::ProcessStreamRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameServer::ProcessStreamRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_LOG_FINE("Received Request:");
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, &request);
+
+ if (request.GetMethod().Compare("GET")) {
+ response.SetStatus(500, "Internal Server Error");
+ return NPT_SUCCESS;
+ }
+
+ response.SetProtocol(NPT_HTTP_PROTOCOL_1_0);
+ response.GetHeaders().SetHeader(NPT_HTTP_HEADER_CONNECTION, "close");
+ response.GetHeaders().SetHeader("Cache-Control", "no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0");
+ response.GetHeaders().SetHeader("Pragma", "no-cache");
+ response.GetHeaders().SetHeader("Expires", "Tue, 4 Jan 2000 02:43:05 GMT");
+
+ NPT_HttpEntity* entity = new NPT_HttpEntity();
+ entity->SetContentType("multipart/x-mixed-replace;boundary=" BOUNDARY);
+
+ NPT_InputStreamReference body(new PLT_InputFrameStream(m_FrameBuffer, BOUNDARY));
+ entity->SetInputStream(body, false);
+
+ return response.SetEntity(entity);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::OnBrowseMetadata
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameServer::OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_String didl;
+ PLT_MediaObjectReference item;
+
+ item = BuildFromID(object_id, &context.GetLocalAddress());
+ if (item.IsNull()) {
+ /* error */
+ NPT_LOG_WARNING("PLT_FrameServer::OnBrowse - ObjectID not found.");
+ action->SetError(701, "No Such Object.");
+ return NPT_FAILURE;
+ }
+
+ NPT_String filter;
+ NPT_CHECK_SEVERE(action->GetArgumentValue("Filter", filter));
+
+ NPT_String tmp;
+ NPT_CHECK_SEVERE(PLT_Didl::ToDidl(*item.AsPointer(), filter, tmp));
+
+ /* add didl header and footer */
+ didl = didl_header + tmp + didl_footer;
+
+ NPT_CHECK_SEVERE(action->SetArgumentValue("Result", didl));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("NumberReturned", "1"));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("TotalMatches", "1"));
+
+ // update ID may be wrong here, it should be the one of the container?
+ // TODO: We need to keep track of the overall updateID of the CDS
+ NPT_CHECK_SEVERE(action->SetArgumentValue("UpdateId", "1"));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::OnBrowseDirectChildren
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FrameServer::OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context)
+{
+ /* Only root allowed */
+ if (!NPT_StringsEqual(object_id, "0")) {
+ /* error */
+ NPT_LOG_WARNING("PLT_FrameServer::OnBrowse - ObjectID not found.");
+ action->SetError(701, "No Such Object.");
+ return NPT_FAILURE;
+ }
+
+ NPT_String startingInd;
+ NPT_CHECK_SEVERE(action->GetArgumentValue("StartingIndex", startingInd));
+
+ NPT_UInt32 start_index;
+ if (NPT_FAILED(startingInd.ToInteger(start_index))) {
+ action->SetError(412, "Precondition failed");
+ return NPT_FAILURE;
+ }
+
+ NPT_String filter;
+ NPT_CHECK_SEVERE(action->GetArgumentValue("Filter", filter));
+
+ NPT_String didl = didl_header;
+ PLT_MediaObjectReference item;
+
+ unsigned long num_returned = 0;
+ unsigned long total_matches = 0;
+ if (start_index == 0) {
+ item = BuildFromID("1", &context.GetLocalAddress());
+ if (!item.IsNull()) {
+ NPT_String tmp;
+ NPT_CHECK_SEVERE(PLT_Didl::ToDidl(*item.AsPointer(), filter, tmp));
+ didl += tmp;
+
+ num_returned++;
+ total_matches++;
+ }
+ };
+
+ didl += didl_footer;
+
+ NPT_CHECK_SEVERE(action->SetArgumentValue("Result", didl));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("NumberReturned", NPT_String::FromInteger(num_returned)));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("TotalMatches", NPT_String::FromInteger(total_matches)));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("UpdateId", "1"));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::BuildResourceUri
++---------------------------------------------------------------------*/
+NPT_String
+PLT_FrameServer::BuildResourceUri(const NPT_HttpUrl& base_uri,
+ const char* host,
+ const char* file_path)
+{
+ NPT_HttpUrl uri = base_uri;
+
+ if (host) uri.SetHost(host);
+
+ if (file_path) {
+ uri.SetPath(uri.GetPath() + file_path);
+ }
+
+ return uri.ToStringWithDefaultPort(0);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer::BuildFromID
++---------------------------------------------------------------------*/
+PLT_MediaObject*
+PLT_FrameServer::BuildFromID(const char* id,
+ const NPT_SocketAddress* req_local_address /* = NULL */)
+{
+ PLT_MediaItemResource resource;
+ PLT_MediaObject* object = NULL;
+
+ if (NPT_StringsEqual(id, "1")) {
+ object = new PLT_MediaItem();
+ object->m_ObjectID = "1";
+ object->m_ParentID = "0";
+
+ /* Set the title using the filename for now */
+ object->m_Title = "ScreenSplitr";
+
+ /* Set the protocol Info from the extension */
+ resource.m_ProtocolInfo = "http-get:*:video/x-motion-jpg:DLNA.ORG_OP=01";
+
+ /* Set the resource file size */
+ //resource.m_Size = info.m_Size;
+
+ // get list of ip addresses
+ NPT_List ips;
+ NPT_CHECK_LABEL_SEVERE(PLT_UPnPMessageHelper::GetIPAddresses(ips), failure);
+
+ // if we're passed an interface where we received the request from
+ // move the ip to the top
+ if (req_local_address && req_local_address->GetIpAddress().ToString() != "0.0.0.0") {
+ ips.Remove(req_local_address->GetIpAddress().ToString());
+ ips.Insert(ips.GetFirstItem(), req_local_address->GetIpAddress().ToString());
+ }
+
+ // iterate through list and build list of resources
+ NPT_List::Iterator ip = ips.GetFirstItem();
+ while (ip) {
+ /* prepend the base URI and url encode it */
+ //resource.m_Uri = NPT_Uri::Encode(uri.ToString(), NPT_Uri::UnsafeCharsToEncode);
+ resource.m_Uri = BuildResourceUri(m_StreamBaseUri, *ip, NULL);
+
+ object->m_ObjectClass.type = "object.item.videoItem.movie";
+ object->m_Resources.Add(resource);
+
+ ++ip;
+ }
+ } else if (NPT_StringsEqual(id, "0")) {
+ object = new PLT_MediaContainer;
+
+ object->m_ObjectID = "0";
+ object->m_ParentID = "-1";
+ object->m_Title = "Root";
+ ((PLT_MediaContainer*)object)->m_ChildrenCount = 1;
+
+ object->m_ObjectClass.type = "object.container";
+ }
+
+ return object;
+
+failure:
+ delete object;
+ return NULL;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/FrameStreamer/PltFrameServer.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/FrameStreamer/PltFrameServer.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,97 @@
+/*****************************************************************
+|
+| Platinum - Frame Server
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_FRAME_SERVER_H_
+#define _PLT_FRAME_SERVER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltFileMediaServer.h"
+#include "PltFrameBuffer.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_SocketPolicyServer;
+
+/*----------------------------------------------------------------------
+| PLT_FrameServer class
++---------------------------------------------------------------------*/
+class PLT_FrameServer : public PLT_FileMediaServer
+{
+public:
+ PLT_FrameServer(PLT_FrameBuffer& frame_buffer,
+ const char* www_root,
+ const char* friendly_name,
+ bool show_ip = false,
+ const char* uuid = NULL,
+ NPT_UInt16 port = 0);
+
+protected:
+ virtual ~PLT_FrameServer();
+
+ // overridable
+ virtual NPT_Result ProcessStreamRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+ // PLT_DeviceHost methods
+ virtual NPT_Result SetupDevice();
+ virtual NPT_Result ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+ // PLT_FileMediaServer methods
+ virtual NPT_String BuildResourceUri(const NPT_HttpUrl& base_uri, const char* host, const char* file_path);
+
+ // PLT_MediaServer methods
+ virtual NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context);
+
+ virtual PLT_MediaObject* BuildFromID(const char* id,
+ const NPT_SocketAddress* req_local_address /* = NULL */);
+
+protected:
+ friend class PLT_MediaItem;
+
+ PLT_FrameBuffer& m_FrameBuffer;
+ NPT_HttpUrl m_StreamBaseUri;
+ PLT_SocketPolicyServer* m_PolicyServer;
+};
+
+#endif /* _PLT_FRAME_SERVER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/FrameStreamer/PltFrameStream.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/FrameStreamer/PltFrameStream.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,125 @@
+/*****************************************************************
+|
+| Platinum - Frame Stream
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltFrameStream.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.core.framestream")
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::PLT_InputFrameStream
++---------------------------------------------------------------------*/
+PLT_InputFrameStream::PLT_InputFrameStream(PLT_FrameBuffer& frame_buffer,
+ const char* boundary) :
+ m_FrameBuffer(frame_buffer),
+ m_LastFrameIndex(0),
+ m_Boundary(boundary),
+ m_Eos(false)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::~PLT_InputFrameStream
++---------------------------------------------------------------------*/
+PLT_InputFrameStream::~PLT_InputFrameStream()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::GetAvailable
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputFrameStream::GetAvailable(NPT_LargeSize& available)
+{
+ NPT_CHECK_WARNING(m_Part.GetAvailable(available));
+
+ if (available == 0 && !m_Eos) {
+ NPT_CHECK_WARNING(FillBuffer());
+ NPT_CHECK_WARNING(m_Part.GetAvailable(available));
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::FillBuffer
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputFrameStream::FillBuffer()
+{
+ // reset memorystream
+ m_Part.SetSize(0);
+
+ // fetch next frame
+ NPT_DataBuffer frame;
+ NPT_CHECK_WARNING(m_FrameBuffer.GetNextFrame(m_LastFrameIndex, frame));
+
+ // empty frame means we're done
+ if (frame.GetDataSize() == 0) {
+ m_Part.WriteLine("--" + m_Boundary + "--");
+ m_Eos = true;
+ return NPT_SUCCESS;
+ }
+
+ m_Part.WriteLine("--" + m_Boundary);
+ m_Part.WriteLine("Content-Type: image/jpeg");
+ m_Part.WriteLine("Content-Length: "+NPT_String::FromInteger(frame.GetDataSize()));
+ m_Part.WriteLine("");
+ m_Part.Write(frame.GetData(), frame.GetDataSize());
+ m_Part.WriteLine("");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream::Read
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_InputFrameStream::Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read /*= 0*/)
+{
+
+ if (bytes_read) *bytes_read = 0;
+
+ if (bytes_to_read == 0) {
+ return NPT_SUCCESS;
+ }
+
+ // make sure we have data
+ NPT_LargeSize available;
+ NPT_CHECK_WARNING(GetAvailable(available));
+
+ return m_Part.Read(buffer, bytes_to_read, bytes_read);
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/FrameStreamer/PltFrameStream.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/FrameStreamer/PltFrameStream.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,78 @@
+/*****************************************************************
+|
+| Platinum - Frame Stream
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_FRAMESTREAM_H_
+#define _PLT_FRAMESTREAM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltFrameBuffer.h"
+
+/*----------------------------------------------------------------------
+| PLT_InputFrameStream
++---------------------------------------------------------------------*/
+class PLT_InputFrameStream : public NPT_InputStream
+{
+public:
+ // methods
+ PLT_InputFrameStream(PLT_FrameBuffer& frame_buffer,
+ const char* boundary);
+ virtual ~PLT_InputFrameStream();
+
+ // NPT_InputStream methods
+ NPT_Result Read(void* buffer,
+ NPT_Size bytes_to_read,
+ NPT_Size* bytes_read = 0);
+
+ NPT_Result Seek(NPT_Position offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Skip(NPT_Size offset) { NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result Tell(NPT_Position& offset){ NPT_COMPILER_UNUSED(offset); return NPT_FAILURE; }
+ NPT_Result GetSize(NPT_LargeSize& size) { NPT_COMPILER_UNUSED(size); return NPT_FAILURE; }
+ NPT_Result GetAvailable(NPT_LargeSize& available);
+
+private:
+ NPT_Result FillBuffer();
+
+protected:
+ PLT_FrameBuffer& m_FrameBuffer;
+ NPT_MemoryStream m_Part;
+ NPT_UInt32 m_LastFrameIndex;
+ NPT_String m_Boundary;
+ bool m_Eos;
+};
+
+typedef NPT_Reference PLT_InputFrameStreamReference;
+
+#endif /* _PLT_FRAMESTREAM_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaConnect/PltMediaConnect.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,310 @@
+/*****************************************************************
+|
+| Platinum - AV Media Connect Device
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "Platinum.h"
+#include "PltMediaConnect.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.devices.mediaconnect")
+
+/*----------------------------------------------------------------------
+| forward references
++---------------------------------------------------------------------*/
+extern NPT_UInt8 X_MS_MediaReceiverRegistrarSCPD[];
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::PLT_MediaConnect
++---------------------------------------------------------------------*/
+PLT_MediaConnect::PLT_MediaConnect(const char* path,
+ const char* friendly_name,
+ bool show_ip /* = false */,
+ const char* uuid /* = NULL */,
+ NPT_UInt16 port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_FileMediaServer(path, friendly_name, show_ip, uuid, port, port_rebind),
+ m_RegistrarService(NULL)
+{
+ m_ModelName = "Windows Media Player Sharing"; // for Xbox3630 & Sonos to accept us
+ m_ModelNumber = "3.0"; // must be >= 3.0 for Sonos to accept us
+ m_ModelDescription = "Media Server";
+ m_Manufacturer = "Plutinosoft";
+ m_ManufacturerURL = "http://www.plutinosoft.com/";
+ m_ModelURL = "http://www.plutinosoft.com";
+ m_DlnaDoc = "DMS-1.00";
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::~PLT_MediaConnect
++---------------------------------------------------------------------*/
+PLT_MediaConnect::~PLT_MediaConnect()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::SetupServices
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::SetupServices(PLT_DeviceData& data)
+{
+ m_RegistrarService = new PLT_Service(
+ &data,
+ "urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:1",
+ "urn:microsoft.com:serviceId:X_MS_MediaReceiverRegistrar");
+
+ NPT_CHECK_FATAL(m_RegistrarService->SetSCPDXML((const char*) X_MS_MediaReceiverRegistrarSCPD));
+ NPT_CHECK_FATAL(m_RegistrarService->InitURLs("X_MS_MediaReceiverRegistrar", data.GetUUID()));
+ NPT_CHECK_FATAL(data.AddService(m_RegistrarService));
+
+ m_RegistrarService->SetStateVariable("AuthorizationGrantedUpdateID", "0");
+ m_RegistrarService->SetStateVariable("AuthorizationDeniedUpdateID", "0");
+ m_RegistrarService->SetStateVariable("ValidationSucceededUpdateID", "0");
+ m_RegistrarService->SetStateVariable("ValidationRevokedUpdateID", "0");
+
+ return PLT_FileMediaServer::SetupServices(data);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::ProcessGetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::ProcessGetDescription(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_String m_OldModelName = m_ModelName;
+ NPT_String m_OldModelNumber = m_ModelNumber;
+ NPT_String m_OldDlnaDoc = m_DlnaDoc;
+ NPT_String m_OldDlnaCap = m_DlnaCap;
+
+ // change some things based on User-Agent header
+ NPT_HttpHeader* user_agent = request.GetHeaders().GetHeader(NPT_HTTP_HEADER_USER_AGENT);
+ if (user_agent && user_agent->GetValue().Find("Xbox", 0, true)>=0) {
+ // For the XBox 360 to discover us, ModelName must stay "Windows Media Player Sharing"
+ m_ModelName = "Windows Media Player Sharing";
+ m_ModelNumber = "3.0";
+ }
+
+ // PS3
+ NPT_HttpHeader* client_info = request.GetHeaders().GetHeader("X-AV-Client-Info");
+ if (client_info && client_info->GetValue().Find("PLAYSTATION 3", 0, true)>=0) {
+ m_DlnaDoc = "DMS-1.50";
+ m_DlnaCap = "av-upload,image-upload,audio-upload";
+ }
+
+ NPT_Result res = PLT_FileMediaServer::ProcessGetDescription(request, context, response);
+
+ // reset to old values now
+ m_ModelName = m_OldModelName;
+ m_ModelNumber = m_OldModelNumber;
+ m_DlnaDoc = m_OldDlnaDoc;
+ m_DlnaCap = m_OldDlnaCap;
+
+ return res;
+}
+
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::Authorize
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::Authorize(PLT_MediaConnectInfo* info, bool state)
+{
+ info->m_Authorized = state;
+ if (state == true) {
+ return m_RegistrarService->IncStateVariable("AuthorizationGrantedUpdateID");
+ }
+
+ return m_RegistrarService->IncStateVariable("AuthorizationDeniedUpdateID");
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::Validate
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::Validate(PLT_MediaConnectInfo* info, bool state)
+{
+ info->m_Validated = state;
+ if (state == true) {
+ return m_RegistrarService->IncStateVariable("ValidationSucceededUpdateID");
+ }
+
+ return m_RegistrarService->IncStateVariable("ValidationRevokedUpdateID");
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::OnAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ PLT_MediaConnectInfo* mc_info = NULL;
+
+ /* parse the action name */
+ NPT_String name = action->GetActionDesc()->GetName();
+
+ /* handle X_MS_MediaReceiverRegistrar actions here */
+ if (name.Compare("IsAuthorized") == 0) {
+ return OnIsAuthorized(action, mc_info);
+ }
+ if (name.Compare("RegisterDevice") == 0) {
+ return OnRegisterDevice(action, mc_info);
+ }
+ if (name.Compare("IsValidated") == 0) {
+ return OnIsValidated(action, mc_info);
+ }
+
+ return PLT_FileMediaServer::OnAction(action, context);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::LookUpMediaConnectInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::LookUpMediaConnectInfo(NPT_String deviceID,
+ PLT_MediaConnectInfo*& mc_info)
+{
+ mc_info = NULL;
+
+ if (deviceID.GetLength()) {
+ /* lookup the MAC from the UDN */
+ NPT_String* MAC;
+ if (NPT_SUCCEEDED(m_MediaConnectUDNMap.Get(deviceID, MAC))) {
+ /* lookup the PLT_MediaConnectInfo from the MAC now */
+ return m_MediaConnectDeviceInfoMap.Get(*MAC, mc_info);
+ }
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::OnIsAuthorized
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::OnIsAuthorized(PLT_ActionReference& action,
+ PLT_MediaConnectInfo* mc_info)
+{
+ bool authorized = true;
+
+ NPT_String deviceID;
+ action->GetArgumentValue("DeviceID", deviceID);
+
+ /* is there a device ID passed ? */
+ if (deviceID.GetLength()) {
+ /* lookup the MediaConnectInfo from the UDN */
+ NPT_String MAC;
+ PLT_MediaConnectInfo* device_info;
+ if (NPT_FAILED(LookUpMediaConnectInfo(deviceID, device_info))) {
+ authorized = false;
+ } else {
+ authorized = device_info->m_Authorized;
+ }
+ } else {
+ authorized = mc_info?mc_info->m_Authorized:true;
+ }
+
+ action->SetArgumentValue("Result", authorized?"1":"0");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::OnRegisterDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::OnRegisterDevice(PLT_ActionReference& action,
+ PLT_MediaConnectInfo* mc_info)
+{
+ NPT_COMPILER_UNUSED(mc_info);
+
+ NPT_String reqMsgBase64;
+ action->GetArgumentValue("RegistrationReqMsg", reqMsgBase64);
+
+ NPT_String respMsgBase64;
+ action->SetArgumentValue("RegistrationRespMsg", respMsgBase64);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::OnIsValidated
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::OnIsValidated(PLT_ActionReference& action,
+ PLT_MediaConnectInfo* mc_info)
+{
+ bool validated = true;
+
+ NPT_String deviceID;
+ action->GetArgumentValue("DeviceID", deviceID);
+
+ /* is there a device ID passed ? */
+ if (deviceID.GetLength()) {
+ /* lookup the MediaConnectInfo from the UDN */
+ NPT_String MAC;
+ PLT_MediaConnectInfo* device_info;
+ if (NPT_FAILED(LookUpMediaConnectInfo(deviceID, device_info))) {
+ validated = false;
+ } else {
+ validated = device_info->m_Validated;
+ }
+ } else {
+ validated = mc_info?mc_info->m_Validated:true;
+ }
+
+ action->SetArgumentValue("Result", validated?"1":"0");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect::GetFilePath
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaConnect::GetFilePath(const char* object_id,
+ NPT_String& filepath)
+{
+ if (!object_id) return NPT_ERROR_INVALID_PARAMETERS;
+
+ // Reroute XBox360 and WMP requests to our route
+ if (NPT_StringsEqual(object_id, "15")) {
+ return PLT_FileMediaServer::GetFilePath("", filepath); // Videos
+ } else if (NPT_StringsEqual(object_id, "16")) {
+ return PLT_FileMediaServer::GetFilePath("", filepath); // Photos
+ } else if (NPT_StringsEqual(object_id, "13")) {
+ return PLT_FileMediaServer::GetFilePath("", filepath); // Music
+ }
+
+ return PLT_FileMediaServer::GetFilePath(object_id, filepath);;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaConnect/PltMediaConnect.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,116 @@
+/*****************************************************************
+|
+| Platinum - AV Media Connect Device
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_CONNECT_H_
+#define _PLT_MEDIA_CONNECT_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltFileMediaServer.h"
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnectInfo
++---------------------------------------------------------------------*/
+class PLT_MediaConnectInfo
+{
+public:
+ PLT_MediaConnectInfo(bool authorized = false) :
+ m_Authorized(authorized), m_Validated(false) {}
+
+ bool m_Authorized;
+ bool m_Validated;
+ NPT_String m_UDN;
+};
+
+/*----------------------------------------------------------------------
+| defines
++---------------------------------------------------------------------*/
+typedef NPT_Map PLT_MediaConnectDeviceInfoMap;
+typedef NPT_Map::Entry PLT_MediaConnectDeviceInfoMapEntry;
+typedef NPT_Map PLT_UDNtoMACMap;
+typedef NPT_Map::Entry PLT_UDNtoMACMapEntry;
+
+/*----------------------------------------------------------------------
+| PLT_MediaConnect
++---------------------------------------------------------------------*/
+class PLT_MediaConnect : public PLT_FileMediaServer
+{
+public:
+ PLT_MediaConnect(const char* path,
+ const char* friendly_name,
+ bool show_ip = false,
+ const char* udn = NULL,
+ NPT_UInt16 port = 0,
+ bool port_rebind = false);
+
+ NPT_Result Authorize(PLT_MediaConnectInfo* info, bool state);
+ NPT_Result Validate(PLT_MediaConnectInfo* info, bool state);
+
+protected:
+ virtual ~PLT_MediaConnect();
+
+
+ // PLT_DeviceHost methods
+ virtual NPT_Result SetupServices(PLT_DeviceData& data);
+ virtual NPT_Result OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result ProcessGetDescription(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+
+ // PLT_FileMediaServer methods
+ virtual NPT_Result GetFilePath(const char* object_id, NPT_String& filepath);
+
+ // X_MS_MediaReceiverRegistrar
+ virtual NPT_Result OnIsAuthorized(PLT_ActionReference& action,
+ PLT_MediaConnectInfo* mediaConnectInfo);
+ virtual NPT_Result OnRegisterDevice(PLT_ActionReference& action,
+ PLT_MediaConnectInfo* mediaConnectInfo);
+ virtual NPT_Result OnIsValidated(PLT_ActionReference& action,
+ PLT_MediaConnectInfo* mediaConnectInfo);
+
+private:
+ NPT_Result LookUpMediaConnectInfo(NPT_String deviceID,
+ PLT_MediaConnectInfo*& mediaConnectInfo);
+
+protected:
+ PLT_MediaConnectDeviceInfoMap m_MediaConnectDeviceInfoMap;
+ PLT_UDNtoMACMap m_MediaConnectUDNMap;
+
+private:
+ PLT_Service* m_RegistrarService;
+};
+
+#endif /* _PLT_MEDIA_CONNECT_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaConnect/PltMediaConnectSCPDs.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaConnect/PltMediaConnectSCPDs.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,175 @@
+/*****************************************************************
+|
+| Platinum - AV Media Server Device SCPDs
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 X_MS_MediaReceiverRegistrarSCPD[2589] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x27, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x27, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A,
+ 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E,
+ 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x73,
+ 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E,
+ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C,
+ 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x65, 0x72, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65,
+ 0x71, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x71, 0x4D, 0x73,
+ 0x67, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69,
+ 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F,
+ 0x6E, 0x52, 0x65, 0x73, 0x70, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x73, 0x56, 0x61, 0x6C, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x65, 0x76,
+ 0x69, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73,
+ 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65,
+ 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x6E, 0x74, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x67,
+ 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x71, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x62, 0x69, 0x6E,
+ 0x2E, 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+ 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x67, 0x69, 0x73,
+ 0x74, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x73, 0x70, 0x4D, 0x73, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x62, 0x69, 0x6E, 0x2E,
+ 0x62, 0x61, 0x73, 0x65, 0x36, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x75, 0x74, 0x68, 0x6F, 0x72, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x47, 0x72, 0x61,
+ 0x6E, 0x74, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x75, 0x74, 0x68, 0x6F,
+ 0x72, 0x69, 0x7A, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44, 0x65, 0x6E, 0x69, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+ 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x56, 0x61, 0x6C, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x75, 0x63, 0x63, 0x65,
+ 0x65, 0x64, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x56, 0x61, 0x6C, 0x69, 0x64,
+ 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x52, 0x65, 0x76, 0x6F, 0x6B, 0x65, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x3C,
+ 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
+};
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaConnect/X_MS_MediaReceiverRegistrarSCPD.xml Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,88 @@
+
+
+
+ 1
+ 0
+
+
+
+ IsAuthorized
+
+
+ DeviceID
+ in
+ A_ARG_TYPE_DeviceID
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+
+
+ RegisterDevice
+
+
+ RegistrationReqMsg
+ in
+ A_ARG_TYPE_RegistrationReqMsg
+
+
+ RegistrationRespMsg
+ out
+ A_ARG_TYPE_RegistrationRespMsg
+
+
+
+
+ IsValidated
+
+
+ DeviceID
+ in
+ A_ARG_TYPE_DeviceID
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+
+
+
+
+ A_ARG_TYPE_DeviceID
+ string
+
+
+ A_ARG_TYPE_Result
+ int
+
+
+ A_ARG_TYPE_RegistrationReqMsg
+ bin.base64
+
+
+ A_ARG_TYPE_RegistrationRespMsg
+ bin.base64
+
+
+ AuthorizationGrantedUpdateID
+ ui4
+
+
+ AuthorizationDeniedUpdateID
+ ui4
+
+
+ ValidationSucceededUpdateID
+ ui4
+
+
+ ValidationRevokedUpdateID
+ ui4
+
+
+
\ No newline at end of file
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaRenderer/AVTransportSCPD.xml Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,561 @@
+
+
+
+ 1
+ 0
+
+
+
+ GetCurrentTransportActions
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Actions
+ out
+ CurrentTransportActions
+
+
+
+
+ GetDeviceCapabilities
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ PlayMedia
+ out
+ PossiblePlaybackStorageMedia
+
+
+ RecMedia
+ out
+ PossibleRecordStorageMedia
+
+
+ RecQualityModes
+ out
+ PossibleRecordQualityModes
+
+
+
+
+ GetMediaInfo
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ NrTracks
+ out
+ NumberOfTracks
+
+
+ MediaDuration
+ out
+ CurrentMediaDuration
+
+
+ CurrentURI
+ out
+ AVTransportURI
+
+
+ CurrentURIMetaData
+ out
+ AVTransportURIMetaData
+
+
+ NextURI
+ out
+ NextAVTransportURI
+
+
+ NextURIMetaData
+ out
+ NextAVTransportURIMetaData
+
+
+ PlayMedium
+ out
+ PlaybackStorageMedium
+
+
+ RecordMedium
+ out
+ RecordStorageMedium
+
+
+ WriteStatus
+ out
+ RecordMediumWriteStatus
+
+
+
+
+ GetPositionInfo
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Track
+ out
+ CurrentTrack
+
+
+ TrackDuration
+ out
+ CurrentTrackDuration
+
+
+ TrackMetaData
+ out
+ CurrentTrackMetaData
+
+
+ TrackURI
+ out
+ CurrentTrackURI
+
+
+ RelTime
+ out
+ RelativeTimePosition
+
+
+ AbsTime
+ out
+ AbsoluteTimePosition
+
+
+ RelCount
+ out
+ RelativeCounterPosition
+
+
+ AbsCount
+ out
+ AbsoluteCounterPosition
+
+
+
+
+ GetTransportInfo
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentTransportState
+ out
+ TransportState
+
+
+ CurrentTransportStatus
+ out
+ TransportStatus
+
+
+ CurrentSpeed
+ out
+ TransportPlaySpeed
+
+
+
+
+ GetTransportSettings
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ PlayMode
+ out
+ CurrentPlayMode
+
+
+ RecQualityMode
+ out
+ CurrentRecordQualityMode
+
+
+
+
+ Next
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+
+
+ Pause
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+
+
+ Play
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Speed
+ in
+ TransportPlaySpeed
+
+
+
+
+ Previous
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+
+
+ Seek
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Unit
+ in
+ A_ARG_TYPE_SeekMode
+
+
+ Target
+ in
+ A_ARG_TYPE_SeekTarget
+
+
+
+
+ SetAVTransportURI
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentURI
+ in
+ AVTransportURI
+
+
+ CurrentURIMetaData
+ in
+ AVTransportURIMetaData
+
+
+
+
+ SetPlayMode
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ NewPlayMode
+ in
+ CurrentPlayMode
+
+
+
+
+ Stop
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+
+
+
+
+ CurrentPlayMode
+ string
+
+ NORMAL
+ REPEAT_ALL
+ INTRO
+
+ NORMAL
+
+
+ RecordStorageMedium
+ string
+
+ UNKNOWN
+ DV
+ MINI-DV
+ VHS
+ W-VHS
+ S-VHS
+ D-VHS
+ VHSC
+ VIDEO8
+ HI8
+ CD-ROM
+ CD-DA
+ CD-R
+ CD-RW
+ VIDEO-CD
+ SACD
+ MD-AUDIO
+ MD-PICTURE
+ DVD-ROM
+ DVD-VIDEO
+ DVD-R
+ DVD+RW
+ DVD-RW
+ DVD-RAM
+ DVD-AUDIO
+ DAT
+ LD
+ HDD
+ MICRO-MV
+ NETWORK
+ NONE
+ NOT_IMPLEMENTED
+ vendor-defined
+
+
+
+ LastChange
+ string
+
+
+ RelativeTimePosition
+ string
+
+
+ CurrentTrackURI
+ string
+
+
+ CurrentTrackDuration
+ string
+
+
+ CurrentRecordQualityMode
+ string
+
+ 0:EP
+ 1:LP
+ 2:SP
+ 0:BASIC
+ 1:MEDIUM
+ 2:HIGH
+ NOT_IMPLEMENTED
+ vendor-defined
+
+
+
+ CurrentMediaDuration
+ string
+
+
+ AbsoluteCounterPosition
+ i4
+
+
+ RelativeCounterPosition
+ i4
+
+
+ A_ARG_TYPE_InstanceID
+ ui4
+
+
+ AVTransportURI
+ string
+
+
+ TransportState
+ string
+
+ STOPPED
+ PAUSED_PLAYBACK
+ PAUSED_RECORDING
+ PLAYING
+ RECORDING
+ TRANSITIONING
+ NO_MEDIA_PRESENT
+
+
+
+ CurrentTrackMetaData
+ string
+
+
+ NextAVTransportURI
+ string
+
+
+ PossibleRecordQualityModes
+ string
+
+
+ CurrentTrack
+ ui4
+
+ 0
+ 4294967295
+ 1
+
+
+
+ AbsoluteTimePosition
+ string
+
+
+ NextAVTransportURIMetaData
+ string
+
+
+ PlaybackStorageMedium
+ string
+
+ UNKNOWN
+ DV
+ MINI-DV
+ VHS
+ W-VHS
+ S-VHS
+ D-VHS
+ VHSC
+ VIDEO8
+ HI8
+ CD-ROM
+ CD-DA
+ CD-R
+ CD-RW
+ VIDEO-CD
+ SACD
+ MD-AUDIO
+ MD-PICTURE
+ DVD-ROM
+ DVD-VIDEO
+ DVD-R
+ DVD+RW
+ DVD-RW
+ DVD-RAM
+ DVD-AUDIO
+ DAT
+ LD
+ HDD
+ MICRO-MV
+ NETWORK
+ NONE
+ NOT_IMPLEMENTED
+ vendor-defined
+
+
+
+ CurrentTransportActions
+ string
+
+
+ RecordMediumWriteStatus
+ string
+
+ WRITABLE
+ PROTECTED
+ NOT_WRITABLE
+ UNKNOWN
+ NOT_IMPLEMENTED
+
+
+
+ PossiblePlaybackStorageMedia
+ string
+
+
+ AVTransportURIMetaData
+ string
+
+
+ NumberOfTracks
+ ui4
+
+ 0
+ 4294967295
+
+
+
+ A_ARG_TYPE_SeekMode
+ string
+
+ ABS_TIME
+ REL_TIME
+ ABS_COUNT
+ REL_COUNT
+ TRACK_NR
+ CHANNEL_FREQ
+ TAPE-INDEX
+ FRAME
+
+
+
+ A_ARG_TYPE_SeekTarget
+ string
+
+
+ PossibleRecordStorageMedia
+ string
+
+
+ TransportStatus
+ string
+
+ OK
+ ERROR_OCCURRED
+ vendor-defined
+
+
+
+ TransportPlaySpeed
+ string
+
+ 1
+ vendor-defined
+
+
+
+
\ No newline at end of file
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaRenderer/ConnectionManagerSCPD.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaRenderer/ConnectionManagerSCPD.xml Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,132 @@
+
+
+
+ 1
+ 0
+
+
+
+ GetCurrentConnectionInfo
+
+
+ ConnectionID
+ in
+ A_ARG_TYPE_ConnectionID
+
+
+ RcsID
+ out
+ A_ARG_TYPE_RcsID
+
+
+ AVTransportID
+ out
+ A_ARG_TYPE_AVTransportID
+
+
+ ProtocolInfo
+ out
+ A_ARG_TYPE_ProtocolInfo
+
+
+ PeerConnectionManager
+ out
+ A_ARG_TYPE_ConnectionManager
+
+
+ PeerConnectionID
+ out
+ A_ARG_TYPE_ConnectionID
+
+
+ Direction
+ out
+ A_ARG_TYPE_Direction
+
+
+ Status
+ out
+ A_ARG_TYPE_ConnectionStatus
+
+
+
+
+ GetProtocolInfo
+
+
+ Source
+ out
+ SourceProtocolInfo
+
+
+ Sink
+ out
+ SinkProtocolInfo
+
+
+
+
+ GetCurrentConnectionIDs
+
+
+ ConnectionIDs
+ out
+ CurrentConnectionIDs
+
+
+
+
+
+
+ A_ARG_TYPE_ProtocolInfo
+ string
+
+
+ A_ARG_TYPE_ConnectionStatus
+ string
+
+ OK
+ ContentFormatMismatch
+ InsufficientBandwidth
+ UnreliableChannel
+ Unknown
+
+
+
+ A_ARG_TYPE_AVTransportID
+ i4
+
+
+ A_ARG_TYPE_RcsID
+ i4
+
+
+ A_ARG_TYPE_ConnectionID
+ i4
+
+
+ A_ARG_TYPE_ConnectionManager
+ string
+
+
+ SourceProtocolInfo
+ string
+
+
+ SinkProtocolInfo
+ string
+
+
+ A_ARG_TYPE_Direction
+ string
+
+ Input
+ Output
+
+
+
+ CurrentConnectionIDs
+ string
+
+
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaRenderer/PltMediaController.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,1035 @@
+/*****************************************************************
+|
+| Platinum - AV Media Controller (Media Renderer Control Point)
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaController.h"
+#include "PltDidl.h"
+#include "PltDeviceData.h"
+#include "PltXmlHelper.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.renderer.controller")
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::PLT_MediaController
++---------------------------------------------------------------------*/
+PLT_MediaController::PLT_MediaController(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaControllerDelegate* delegate /* = NULL */) :
+ m_CtrlPoint(ctrl_point),
+ m_Delegate(delegate)
+{
+ m_CtrlPoint->AddListener(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::~PLT_MediaController
++---------------------------------------------------------------------*/
+PLT_MediaController::~PLT_MediaController()
+{
+ m_CtrlPoint->RemoveListener(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnDeviceAdded
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnDeviceAdded(PLT_DeviceDataReference& device)
+{
+ PLT_DeviceDataReference data;
+ NPT_String uuid = device->GetUUID();
+ // is it a new device?
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_MediaRenderers, PLT_DeviceDataFinder(uuid), data))) {
+ NPT_LOG_FINE_1("Device (%s) is already in our list!", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE("Device Found:");
+ device->ToLog(NPT_LOG_LEVEL_FINE);
+
+ // verify the device implements the function we need
+ PLT_Service* serviceAVT;
+ PLT_Service* serviceCMR;
+ NPT_String type;
+
+ type = "urn:schemas-upnp-org:service:AVTransport:1";
+ if (NPT_FAILED(device->FindServiceByType(type, serviceAVT))) {
+ NPT_LOG_FINE_1("Service %s not found", (const char*)type);
+ return NPT_FAILURE;
+ }
+
+ type = "urn:schemas-upnp-org:service:ConnectionManager:1";
+ if (NPT_FAILED(device->FindServiceByType(type, serviceCMR))) {
+ NPT_LOG_FINE_1("Service %s not found", (const char*)type);
+ return NPT_FAILURE;
+ }
+
+ m_MediaRenderers.Add(device);
+
+ if (m_Delegate && m_Delegate->OnMRAdded(device)) {
+ // subscribe to AVT eventing if delegate wants it
+ m_CtrlPoint->Subscribe(serviceAVT);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnDeviceRemoved
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnDeviceRemoved(PLT_DeviceDataReference& device)
+{
+ // only release if we have kept it around
+ PLT_DeviceDataReference data;
+ NPT_String uuid = device->GetUUID();
+ // is it a new device?
+ if (NPT_FAILED(NPT_ContainerFind(m_MediaRenderers, PLT_DeviceDataFinder(uuid), data))) {
+ NPT_LOG_FINE_1("Device (%s) not found in our list!", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE("Device Removed:");
+ device->ToLog(NPT_LOG_LEVEL_FINE);
+
+ if (m_Delegate) {
+ m_Delegate->OnMRRemoved(device);
+ }
+
+ m_MediaRenderers.Remove(device);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::FindActionDesc
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::FindActionDesc(PLT_DeviceDataReference& device,
+ const char* service_type,
+ const char* action_name,
+ PLT_ActionDesc*& action_desc)
+{
+ // look for the service
+ PLT_Service* service;
+ if (NPT_FAILED(device->FindServiceByType(service_type, service))) {
+ NPT_LOG_FINE_1("Service %s not found", (const char*)service_type);
+ return NPT_FAILURE;
+ }
+
+ action_desc = service->FindActionDesc(action_name);
+ if (action_desc == NULL) {
+ NPT_LOG_FINE_1("Action %s not found in service", action_name);
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::CreateAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::CreateAction(PLT_DeviceDataReference& device,
+ const char* service_type,
+ const char* action_name,
+ PLT_ActionReference& action)
+{
+ PLT_ActionDesc* action_desc;
+ NPT_CHECK_SEVERE(FindActionDesc(device, service_type, action_name, action_desc));
+ action = new PLT_Action(action_desc);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::CallAVTransportAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::CallAVTransportAction(PLT_ActionReference& action,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ // Set the object id
+ NPT_CHECK_SEVERE(action->SetArgumentValue("InstanceID",
+ NPT_String::FromInteger(instance_id)));
+
+ // set the arguments on the action, this will check the argument values
+ return m_CtrlPoint->InvokeAction(action, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetCurrentTransportActions
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetCurrentTransportActions(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetCurrentTransportActions",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetDeviceCapabilities
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetDeviceCapabilities(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetDeviceCapabilities",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetMediaInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetMediaInfo(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetMediaInfo",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetPositionInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetPositionInfo(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetPositionInfo",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetTransportInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetTransportInfo(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetTransportInfo",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetTransportSettings
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetTransportSettings(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "GetTransportSettings",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Next
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Next(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Next",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Pause
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Pause(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Pause",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Play
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Play(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ NPT_String speed,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Play",
+ action));
+
+ // Set the speed
+ if (NPT_FAILED(action->SetArgumentValue("Speed", speed))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Previous
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Previous(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Previous",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Seek
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Seek(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ NPT_String unit,
+ NPT_String target,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Seek",
+ action));
+
+ // Set the unit
+ if (NPT_FAILED(action->SetArgumentValue("Unit", unit))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // Set the target
+ if (NPT_FAILED(action->SetArgumentValue("Target", target))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::SetAVTransportURI
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::SetAVTransportURI(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ const char* uri,
+ const char* metadata,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "SetAVTransportURI",
+ action));
+
+ // set the uri
+ if (NPT_FAILED(action->SetArgumentValue("CurrentURI", uri))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the uri metadata
+ if (NPT_FAILED(action->SetArgumentValue("CurrentURIMetaData", metadata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::SetPlayMode
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::SetPlayMode(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ NPT_String new_play_mode,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "SetPlayMode",
+ action));
+
+ // set the New PlayMode
+ if (NPT_FAILED(action->SetArgumentValue("NewPlayMode", new_play_mode))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::Stop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::Stop(PLT_DeviceDataReference& device,
+ NPT_UInt32 instance_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "Stop",
+ action));
+ return CallAVTransportAction(action, instance_id, userdata);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetCurrentConnectionIDs
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetCurrentConnectionIDs(PLT_DeviceDataReference& device,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "GetCurrentConnectionIDs",
+ action));
+
+ // set the arguments on the action, this will check the argument values
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetCurrentConnectionInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetCurrentConnectionInfo(PLT_DeviceDataReference& device,
+ NPT_UInt32 connection_id,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "GetCurrentConnectionInfo",
+ action));
+
+ // set the New PlayMode
+ if (NPT_FAILED(action->SetArgumentValue("ConnectionID", NPT_String::FromInteger(connection_id)))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the arguments on the action, this will check the argument values
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::GetProtocolInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::GetProtocolInfo(PLT_DeviceDataReference& device,
+ void* userdata)
+{
+ PLT_ActionReference action;
+ NPT_CHECK_SEVERE(CreateAction(device,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "GetProtocolInfo",
+ action));
+
+ // set the arguments on the action, this will check the argument values
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnActionResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata)
+{
+ if (m_Delegate == NULL) return NPT_SUCCESS;
+
+ /* make sure device is a renderer we've previously found */
+ PLT_DeviceDataReference device;
+ NPT_String uuid = action->GetActionDesc()->GetService()->GetDevice()->GetUUID();
+ if (NPT_FAILED(NPT_ContainerFind(m_MediaRenderers, PLT_DeviceDataFinder(uuid), device))) {
+ NPT_LOG_FINE_1("Device (%s) not found in our list of renderers", (const char*)uuid);
+ res = NPT_FAILURE;
+ }
+
+ /* extract action name */
+ NPT_String actionName = action->GetActionDesc()->GetName();
+
+ /* AVTransport response ? */
+ if (actionName.Compare("GetCurrentTransportActions", true) == 0) {
+ return OnGetCurrentTransportActionsResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetDeviceCapabilities", true) == 0) {
+ return OnGetDeviceCapabilitiesResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetMediaInfo", true) == 0) {
+ return OnGetMediaInfoResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetPositionInfo", true) == 0) {
+ return OnGetPositionInfoResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetTransportInfo", true) == 0) {
+ return OnGetTransportInfoResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetTransportSettings", true) == 0) {
+ return OnGetTransportSettingsResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("Next", true) == 0) {
+ m_Delegate->OnNextResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Pause", true) == 0) {
+ m_Delegate->OnPauseResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Play", true) == 0) {
+ m_Delegate->OnPlayResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Previous", true) == 0) {
+ m_Delegate->OnPreviousResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Seek", true) == 0) {
+ m_Delegate->OnSeekResult(res, device, userdata);
+ }
+ else if (actionName.Compare("SetAVTransportURI", true) == 0) {
+ m_Delegate->OnSetAVTransportURIResult(res, device, userdata);
+ }
+ else if (actionName.Compare("SetPlayMode", true) == 0) {
+ m_Delegate->OnSetPlayModeResult(res, device, userdata);
+ }
+ else if (actionName.Compare("Stop", true) == 0) {
+ m_Delegate->OnStopResult(res, device, userdata);
+ }
+ else if (actionName.Compare("GetCurrentConnectionIDs", true) == 0) {
+ return OnGetCurrentConnectionIDsResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetCurrentConnectionInfo", true) == 0) {
+ return OnGetCurrentConnectionInfoResponse(res, device, action, userdata);
+ }
+ else if (actionName.Compare("GetProtocolInfo", true) == 0) {
+ return OnGetProtocolInfoResponse(res, device, action, userdata);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetCurrentTransportActionsResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetCurrentTransportActionsResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String actions;
+ PLT_StringList values;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("Actions", actions))) {
+ goto bad_action;
+ }
+
+ // parse the list of actions and return a list to listener
+ ParseCSV(actions, values);
+
+ m_Delegate->OnGetCurrentTransportActionsResult(NPT_SUCCESS, device, &values, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetCurrentTransportActionsResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetDeviceCapabilitiesResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetDeviceCapabilitiesResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_DeviceCapabilities capabilities;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("PlayMedia", value))) {
+ goto bad_action;
+ }
+ // parse the list of medias and return a list to listener
+ ParseCSV(value, capabilities.play_media);
+
+ if (NPT_FAILED(action->GetArgumentValue("RecMedia", value))) {
+ goto bad_action;
+ }
+ // parse the list of rec and return a list to listener
+ ParseCSV(value, capabilities.rec_media);
+
+ if (NPT_FAILED(action->GetArgumentValue("RecQualityModes", value))) {
+ goto bad_action;
+ }
+ // parse the list of modes and return a list to listener
+ ParseCSV(value, capabilities.rec_quality_modes);
+
+ m_Delegate->OnGetDeviceCapabilitiesResult(NPT_SUCCESS, device, &capabilities, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetDeviceCapabilitiesResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetMediaInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetMediaInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_MediaInfo info;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("NrTracks", info.num_tracks))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("MediaDuration", value))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.media_duration))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("CurrentURI", info.cur_uri))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("CurrentURIMetaData", info.cur_metadata))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("NextURI", info.next_uri))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("NextURIMetaData", info.next_metadata))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("PlayMedium", info.play_medium))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("RecordMedium", info.rec_medium))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("WriteStatus", info.write_status))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetMediaInfoResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetMediaInfoResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetPositionInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetPositionInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_PositionInfo info;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("Track", info.track))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("TrackDuration", value))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.track_duration))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("TrackMetaData", info.track_metadata))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("TrackURI", info.track_uri))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("RelTime", value))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.rel_time))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("AbsTime", value))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(value, info.abs_time))) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("RelCount", info.rel_count))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("AbsCount", info.abs_count))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetPositionInfoResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetPositionInfoResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetTransportInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetTransportInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ PLT_TransportInfo info;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("CurrentTransportState", info.cur_transport_state))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("CurrentTransportStatus", info.cur_transport_status))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("CurrentSpeed", info.cur_speed))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetTransportInfoResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetTransportInfoResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetTransportSettingsResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetTransportSettingsResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ PLT_TransportSettings settings;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("PlayMode", settings.play_mode))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("RecQualityMode", settings.rec_quality_mode))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnGetTransportSettingsResult(NPT_SUCCESS, device, &settings, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetTransportSettingsResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetCurrentConnectionIDsResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetCurrentConnectionIDsResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_StringList IDs;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("ConnectionIDs", value))) {
+ goto bad_action;
+ }
+ // parse the list of medias and return a list to listener
+ ParseCSV(value, IDs);
+
+ m_Delegate->OnGetCurrentConnectionIDsResult(NPT_SUCCESS, device, &IDs, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetCurrentConnectionIDsResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetCurrentConnectionInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetCurrentConnectionInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String value;
+ PLT_ConnectionInfo info;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("RcsID", info.rcs_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("AVTransportID", info.avtransport_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("ProtocolInfo", info.protocol_info))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("PeerConnectionManager", info.peer_connection_mgr))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("PeerConnectionID", info.peer_connection_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("Direction", info.direction))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("Status", info.status))) {
+ goto bad_action;
+ }
+ m_Delegate->OnGetCurrentConnectionInfoResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetCurrentConnectionInfoResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnGetProtocolInfoResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnGetProtocolInfoResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata)
+{
+ NPT_String source_info, sink_info;
+ PLT_StringList sources, sinks;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("Source", source_info))) {
+ goto bad_action;
+ }
+ ParseCSV(source_info, sources);
+
+ if (NPT_FAILED(action->GetArgumentValue("Sink", sink_info))) {
+ goto bad_action;
+ }
+ ParseCSV(sink_info, sinks);
+
+ m_Delegate->OnGetProtocolInfoResult(NPT_SUCCESS, device, &sources, &sinks, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnGetProtocolInfoResult(NPT_FAILURE, device, NULL, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaController::OnEventNotify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaController::OnEventNotify(PLT_Service* service, NPT_List* vars)
+{
+ if (!m_Delegate) return NPT_SUCCESS;
+
+ // parse LastChange var into smaller vars
+ PLT_StateVariable* lastChangeVar = NULL;
+ if (NPT_SUCCEEDED(NPT_ContainerFind(*vars, PLT_ListStateVariableNameFinder("LastChange"), lastChangeVar))) {
+ vars->Remove(lastChangeVar);
+ PLT_Service* var_service = lastChangeVar->GetService();
+ NPT_String text = lastChangeVar->GetValue();
+
+ NPT_XmlNode* xml = NULL;
+ NPT_XmlParser parser;
+ if (NPT_FAILED(parser.Parse(text, xml)) || !xml || !xml->AsElementNode()) {
+ delete xml;
+ return NPT_FAILURE;
+ }
+
+ NPT_XmlElementNode* node = xml->AsElementNode();
+ if (!node->GetTag().Compare("Event", true)) {
+ // look for the instance with attribute id = 0
+ NPT_XmlElementNode* instance = NULL;
+ for (NPT_Cardinal i=0; iGetChildren().GetItemCount(); i++) {
+ NPT_XmlElementNode* child;
+ if (NPT_FAILED(PLT_XmlHelper::GetChild(node, child, i)))
+ continue;
+
+ if (!child->GetTag().Compare("InstanceID", true)) {
+ // extract the "val" attribute value
+ NPT_String value;
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(child, "val", value)) &&
+ !value.Compare("0")) {
+ instance = child;
+ break;
+ }
+ }
+ }
+
+ // did we find an instance with id = 0 ?
+ if (instance != NULL) {
+ // all the children of the Instance node are state variables
+ for (NPT_Cardinal j=0; jGetChildren().GetItemCount(); j++) {
+ NPT_XmlElementNode* var_node;
+ if (NPT_FAILED(PLT_XmlHelper::GetChild(instance, var_node, j)))
+ continue;
+
+ // look for the state variable in this service
+ const NPT_String* value = var_node->GetAttribute("val");
+ PLT_StateVariable* var = var_service->FindStateVariable(var_node->GetTag());
+ if (value != NULL && var != NULL) {
+ // get the value and set the state variable
+ // if it succeeded, add it to the list of vars we'll event
+ if (NPT_SUCCEEDED(var->SetValue(*value))) {
+ vars->Add(var);
+ NPT_LOG_FINE_2("PLT_MediaController received var change for (%s): %s", (const char*)var->GetName(), (const char*)var->GetValue());
+ }
+ }
+ }
+ }
+ }
+ delete xml;
+ }
+
+ if (vars->GetItemCount()) {
+ m_Delegate->OnMRStateVariablesChanged(service, vars);
+ }
+
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaRenderer/PltMediaController.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaRenderer/PltMediaController.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,305 @@
+/*****************************************************************
+|
+| Platinum - AV Media Controller (Media Renderer Control Point)
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_CONTROLLER_H_
+#define _PLT_MEDIA_CONTROLLER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltCtrlPoint.h"
+
+/*----------------------------------------------------------------------
+| Defines
++---------------------------------------------------------------------*/
+typedef NPT_List PLT_StringList;
+
+struct PLT_DeviceCapabilities {
+ PLT_StringList play_media;
+ PLT_StringList rec_media;
+ PLT_StringList rec_quality_modes;
+};
+
+struct PLT_MediaInfo {
+ NPT_UInt32 num_tracks;
+ NPT_TimeStamp media_duration;
+ NPT_String cur_uri;
+ NPT_String cur_metadata;
+ NPT_String next_uri;
+ NPT_String next_metadata;
+ NPT_String play_medium;
+ NPT_String rec_medium;
+ NPT_String write_status;
+};
+
+struct PLT_PositionInfo {
+ NPT_UInt32 track;
+ NPT_TimeStamp track_duration;
+ NPT_String track_metadata;
+ NPT_String track_uri;
+ NPT_TimeStamp rel_time;
+ NPT_TimeStamp abs_time;
+ NPT_Int32 rel_count;
+ NPT_Int32 abs_count;
+};
+
+struct PLT_TransportInfo {
+ NPT_String cur_transport_state;
+ NPT_String cur_transport_status;
+ NPT_String cur_speed;
+};
+
+struct PLT_TransportSettings {
+ NPT_String play_mode;
+ NPT_String rec_quality_mode;
+};
+
+struct PLT_ConnectionInfo {
+ NPT_UInt32 rcs_id;
+ NPT_UInt32 avtransport_id;
+ NPT_String protocol_info;
+ NPT_String peer_connection_mgr;
+ NPT_UInt32 peer_connection_id;
+ NPT_String direction;
+ NPT_String status;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaControllerDelegate class
++---------------------------------------------------------------------*/
+class PLT_MediaControllerDelegate
+{
+public:
+ virtual ~PLT_MediaControllerDelegate() {}
+
+ virtual bool OnMRAdded(PLT_DeviceDataReference& /* device */) { return true; }
+ virtual void OnMRRemoved(PLT_DeviceDataReference& /* device */) {}
+ virtual void OnMRStateVariablesChanged(PLT_Service* /* service */,
+ NPT_List* /* vars */) {}
+
+ // AVTransport
+ virtual void OnGetCurrentTransportActionsResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_StringList* /* actions */,
+ void* /* userdata */) {}
+
+ virtual void OnGetDeviceCapabilitiesResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_DeviceCapabilities* /* capabilities */,
+ void* /* userdata */) {}
+
+ virtual void OnGetMediaInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_MediaInfo* /* info */,
+ void* /* userdata */) {}
+
+ virtual void OnGetPositionInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_PositionInfo* /* info */,
+ void* /* userdata */) {}
+
+ virtual void OnGetTransportInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_TransportInfo* /* info */,
+ void* /* userdata */) {}
+
+ virtual void OnGetTransportSettingsResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_TransportSettings* /* settings */,
+ void* /* userdata */) {}
+
+ virtual void OnNextResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnPauseResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnPlayResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnPreviousResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnSeekResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnSetAVTransportURIResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnSetPlayModeResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ virtual void OnStopResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ void* /* userdata */) {}
+
+ // ConnectionManager
+ virtual void OnGetCurrentConnectionIDsResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_StringList* /* ids */,
+ void* /* userdata */) {}
+
+ virtual void OnGetCurrentConnectionInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_ConnectionInfo* /* info */,
+ void* /* userdata */) {}
+
+ virtual void OnGetProtocolInfoResult(
+ NPT_Result /* res */,
+ PLT_DeviceDataReference& /* device */,
+ PLT_StringList* /* sources */,
+ PLT_StringList* /* sinks */,
+ void* /* userdata */) {}
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaController class
++---------------------------------------------------------------------*/
+class PLT_MediaController : public PLT_CtrlPointListener
+{
+public:
+ PLT_MediaController(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaControllerDelegate* delegate = NULL);
+ virtual ~PLT_MediaController();
+
+ // public methods
+ virtual void SetDelegate(PLT_MediaControllerDelegate* delegate) {
+ m_Delegate = delegate;
+ }
+
+ // PLT_CtrlPointListener methods
+ virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device);
+ virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device);
+ virtual NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata);
+ virtual NPT_Result OnEventNotify(PLT_Service* service, NPT_List* vars);
+
+ // AVTransport
+ NPT_Result GetCurrentTransportActions(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetDeviceCapabilities(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetMediaInfo(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetPositionInfo(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetTransportInfo(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result GetTransportSettings(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result Next(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result Pause(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result Play(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, NPT_String speed, void* userdata);
+ NPT_Result Previous(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+ NPT_Result Seek(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, NPT_String unit, NPT_String target, void* userdata);
+ NPT_Result SetAVTransportURI(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, const char* uri, const char* metadata, void* userdata);
+ NPT_Result SetPlayMode(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, NPT_String new_play_mode, void* userdata);
+ NPT_Result Stop(PLT_DeviceDataReference& device, NPT_UInt32 instance_id, void* userdata);
+
+ // ConnectionManager
+ NPT_Result GetCurrentConnectionIDs(PLT_DeviceDataReference& device, void* userdata);
+ NPT_Result GetCurrentConnectionInfo(PLT_DeviceDataReference& device, NPT_UInt32 connection_id, void* userdata);
+ NPT_Result GetProtocolInfo(PLT_DeviceDataReference& device, void* userdata);
+
+private:
+ NPT_Result FindActionDesc(PLT_DeviceDataReference& device,
+ const char* service_type,
+ const char* action_name,
+ PLT_ActionDesc*& action_desc);
+
+ NPT_Result CreateAction(PLT_DeviceDataReference& device,
+ const char* service_type,
+ const char* action_name,
+ PLT_ActionReference& action);
+
+ NPT_Result CallAVTransportAction(PLT_ActionReference& action,
+ NPT_UInt32 instance_id,
+ void* userdata = NULL);
+
+ NPT_Result OnGetCurrentTransportActionsResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetDeviceCapabilitiesResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetMediaInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetPositionInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetTransportInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetTransportSettingsResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+
+ NPT_Result OnGetCurrentConnectionIDsResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetCurrentConnectionInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+ NPT_Result OnGetProtocolInfoResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata);
+
+ static void ParseCSV(const char* csv, PLT_StringList& values) {
+ const char* start = csv;
+ const char* p = start;
+
+ // look for the , character
+ while (*p) {
+ if (*p == ',') {
+ NPT_String val(start, (int)(p-start));
+ val.Trim(' ');
+ values.Add(val);
+ start = p + 1;
+ }
+ p++;
+ }
+
+ // last one
+ NPT_String last(start, (int)(p-start));
+ last.Trim(' ');
+ if (last.GetLength()) {
+ values.Add(last);
+ }
+ }
+
+private:
+ PLT_CtrlPointReference m_CtrlPoint;
+ PLT_MediaControllerDelegate* m_Delegate;
+ NPT_List m_MediaRenderers;
+};
+
+#endif /* _PLT_MEDIA_CONTROLLER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,435 @@
+/*****************************************************************
+|
+| Platinum - AV Media Renderer Device
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaRenderer.h"
+#include "PltService.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.renderer")
+
+/*----------------------------------------------------------------------
+| external references
++---------------------------------------------------------------------*/
+extern NPT_UInt8 RDR_ConnectionManagerSCPD[];
+extern NPT_UInt8 RDR_AVTransportSCPD[];
+extern NPT_UInt8 RDR_RenderingControlSCPD[];
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::PLT_MediaRenderer
++---------------------------------------------------------------------*/
+PLT_MediaRenderer::PLT_MediaRenderer(const char* friendly_name,
+ bool show_ip /* = false */,
+ const char* uuid /* = NULL */,
+ unsigned int port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_DeviceHost("/", uuid, "urn:schemas-upnp-org:device:MediaRenderer:1", friendly_name, show_ip, port, port_rebind)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::~PLT_MediaRenderer
++---------------------------------------------------------------------*/
+PLT_MediaRenderer::~PLT_MediaRenderer()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::SetupServices
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::SetupServices(PLT_DeviceData& data)
+{
+ PLT_Service* service;
+
+ {
+ /* AVTransport */
+ service = new PLT_Service(
+ &data,
+ "urn:schemas-upnp-org:service:AVTransport:1",
+ "urn:upnp-org:serviceId:AVT_1-0",
+ "urn:schemas-upnp-org:metadata-1-0/AVT/");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_AVTransportSCPD));
+ NPT_CHECK_FATAL(service->InitURLs("AVTransport", data.GetUUID()));
+ NPT_CHECK_FATAL(data.AddService(service));
+
+ service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f));
+ service->SetStateVariable("A_ARG_TYPE_InstanceID", "0");
+
+ // GetCurrentTransportActions
+ service->SetStateVariable("CurrentTransportActions", "Play,Pause,Stop,Seek,Next,Previous");
+
+ // GetDeviceCapabilities
+ service->SetStateVariable("PossiblePlaybackStorageMedia", "NONE,NETWORK");
+ service->SetStateVariable("PossibleRecordStorageMedia", "NOT_IMPLEMENTED");
+ service->SetStateVariable("PossibleRecordQualityModes", "NOT_IMPLEMENTED");
+
+ // GetMediaInfo
+ service->SetStateVariable("NumberOfTracks", "0");
+ service->SetStateVariable("CurrentMediaDuration", "00:00:00");;
+ service->SetStateVariable("AVTransportURI", "");
+ service->SetStateVariable("AVTransportURIMetadata", "");;
+ service->SetStateVariable("NextAVTransportURI", "NOT_IMPLEMENTED");
+ service->SetStateVariable("NextAVTransportURIMetadata", "NOT_IMPLEMENTED");
+ service->SetStateVariable("PlaybackStorageMedium", "NONE");
+ service->SetStateVariable("RecordStorageMedium", "NOT_IMPLEMENTED");
+ service->SetStateVariable("RecordMediumWriteStatus", "NOT_IMPLEMENTED");
+
+ // GetPositionInfo
+ service->SetStateVariable("CurrentTrack", "0");
+ service->SetStateVariable("CurrentTrackDuration", "00:00:00");
+ service->SetStateVariable("CurrentTrackMetadata", "");
+ service->SetStateVariable("CurrentTrackURI", "");
+ service->SetStateVariable("RelativeTimePosition", "00:00:00");
+ service->SetStateVariable("AbsoluteTimePosition", "00:00:00");
+ service->SetStateVariable("RelativeCounterPosition", "2147483647"); // means NOT_IMPLEMENTED
+ service->SetStateVariable("AbsoluteCounterPosition", "2147483647"); // means NOT_IMPLEMENTED
+
+ // disable indirect eventing for certain state variables
+ PLT_StateVariable* var;
+ var = service->FindStateVariable("RelativeTimePosition");
+ if (var) var->DisableIndirectEventing();
+ var = service->FindStateVariable("AbsoluteTimePosition");
+ if (var) var->DisableIndirectEventing();
+ var = service->FindStateVariable("RelativeCounterPosition");
+ if (var) var->DisableIndirectEventing();
+ var = service->FindStateVariable("AbsoluteCounterPosition");
+ if (var) var->DisableIndirectEventing();
+
+ // GetTransportInfo
+ service->SetStateVariable("TransportState", "NO_MEDIA_PRESENT");
+ service->SetStateVariable("TransportStatus", "OK");
+ service->SetStateVariable("TransportPlaySpeed", "1");
+
+ // GetTransportSettings
+ service->SetStateVariable("CurrentPlayMode", "NORMAL");
+ service->SetStateVariable("CurrentRecordQualityMode", "NOT_IMPLEMENTED");
+ }
+
+ {
+ /* ConnectionManager */
+ service = new PLT_Service(
+ &data,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "urn:upnp-org:serviceId:CMGR_1-0");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_ConnectionManagerSCPD));
+ NPT_CHECK_FATAL(service->InitURLs("ConnectionManager", data.GetUUID()));
+ NPT_CHECK_FATAL(data.AddService(service));
+
+ service->SetStateVariable("CurrentConnectionIDs", "0");
+
+ // put all supported mime types here instead
+ service->SetStateVariable("SinkProtocolInfo", "http-get:*:*:*");
+ service->SetStateVariable("SourceProtocolInfo", "");
+ }
+
+ {
+ /* RenderingControl */
+ service = new PLT_Service(
+ &data,
+ "urn:schemas-upnp-org:service:RenderingControl:1",
+ "urn:upnp-org:serviceId:RCS_1-0",
+ "urn:schemas-upnp-org:metadata-1-0/RCS/");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) RDR_RenderingControlSCPD));
+ NPT_CHECK_FATAL(service->InitURLs("RenderingControl", data.GetUUID()));
+ NPT_CHECK_FATAL(data.AddService(service));
+
+ service->SetStateVariableRate("LastChange", NPT_TimeInterval(0.2f));
+
+ service->SetStateVariable("Mute", "0");
+ service->SetStateVariable("Volume", "100");
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ /* parse the action name */
+ NPT_String name = action->GetActionDesc()->GetName();
+
+ /* Is it a ConnectionManager Service Action ? */
+ if (name.Compare("GetCurrentConnectionIDs", true) == 0) {
+ if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) {
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+ }
+ if (name.Compare("GetProtocolInfo", true) == 0) {
+ if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) {
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+ }
+ if (name.Compare("GetCurrentConnectionInfo", true) == 0) {
+ return OnGetCurrentConnectionInfo(action);
+ }
+
+ /* Is it a AVTransport Service Action ? */
+
+ // since all actions take an instance ID and we only support 1 instance
+ // verify that the Instance ID is 0 and return an error here now if not
+ NPT_String serviceType = action->GetActionDesc()->GetService()->GetServiceType();
+ if (serviceType.Compare("urn:schemas-upnp-org:service:AVTransport:1", true) == 0) {
+ if (NPT_FAILED(action->VerifyArgumentValue("InstanceID", "0"))) {
+ action->SetError(802,"Not valid InstanceID.");
+ return NPT_FAILURE;
+ }
+ }
+
+ if (name.Compare("GetCurrentTransportActions", true) == 0) {
+ if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) {
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+ }
+ if (name.Compare("GetDeviceCapabilities", true) == 0) {
+ if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) {
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+ }
+ if (name.Compare("GetMediaInfo", true) == 0) {
+ if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) {
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+ }
+ if (name.Compare("GetPositionInfo", true) == 0) {
+ if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) {
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+ }
+ if (name.Compare("GetTransportInfo", true) == 0) {
+ if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) {
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+ }
+ if (name.Compare("GetTransportSettings", true) == 0) {
+ if (NPT_FAILED(action->SetArgumentsOutFromStateVariable())) {
+ return NPT_FAILURE;
+ }
+ return NPT_SUCCESS;
+ }
+ if (name.Compare("Next", true) == 0) {
+ return OnNext(action);
+ }
+ if (name.Compare("Pause", true) == 0) {
+ return OnPause(action);
+ }
+ if (name.Compare("Play", true) == 0) {
+ return OnPlay(action);
+ }
+ if (name.Compare("Previous", true) == 0) {
+ return OnPrevious(action);
+ }
+ if (name.Compare("Seek", true) == 0) {
+ return OnSeek(action);
+ }
+ if (name.Compare("Stop", true) == 0) {
+ return OnStop(action);
+ }
+ if (name.Compare("SetAVTransportURI", true) == 0) {
+ return OnSetAVTransportURI(action);
+ }
+ if (name.Compare("SetPlayMode", true) == 0) {
+ return OnSetPlayMode(action);
+ }
+
+ /* Is it a RendererControl Service Action ? */
+ if (serviceType.Compare("urn:schemas-upnp-org:service:RenderingControl:1", true) == 0) {
+ /* we only support master channel */
+ if (NPT_FAILED(action->VerifyArgumentValue("Channel", "Master"))) {
+ action->SetError(402,"Invalid Args.");
+ return NPT_FAILURE;
+ }
+ }
+
+ if (name.Compare("GetVolume", true) == 0) {
+ NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable());
+ return NPT_SUCCESS;
+ }
+
+ if (name.Compare("GetMute", true) == 0) {
+ NPT_CHECK_SEVERE(action->SetArgumentsOutFromStateVariable());
+ return NPT_SUCCESS;
+ }
+
+ if (name.Compare("SetVolume", true) == 0) {
+ return OnSetVolume(action);
+ }
+
+ if (name.Compare("SetMute", true) == 0) {
+ return OnSetMute(action);
+ }
+
+ action->SetError(401,"No Such Action.");
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnGetCurrentConnectionInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnGetCurrentConnectionInfo(PLT_ActionReference& action)
+{
+ if (NPT_FAILED(action->VerifyArgumentValue("ConnectionID", "0"))) {
+ action->SetError(706,"No Such Connection.");
+ return NPT_FAILURE;
+ }
+
+ if (NPT_FAILED(action->SetArgumentValue("RcsID", "0"))){
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("AVTransportID", "0"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("ProtocolInfo", "http-get:*:*:*"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("PeerConnectionManager", "/"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("PeerConnectionID", "-1"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("Direction", "Input"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("Status", "Unknown"))) {
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnNext
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnNext(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnPause
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnPause(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnPlay
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnPlay(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnPrevious
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnPrevious(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSeek
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSeek(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnStop
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnStop(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSetAVTransportURI
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetAVTransportURI(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSetPlayMode
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetPlayMode(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSetVolume
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetVolume(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer::OnSetMute
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaRenderer::OnSetMute(PLT_ActionReference& /* action */)
+{
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaRenderer/PltMediaRenderer.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,108 @@
+/*****************************************************************
+|
+| Platinum - AV Media Renderer Device
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_RENDERER_H_
+#define _PLT_MEDIA_RENDERER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDeviceHost.h"
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer class
++---------------------------------------------------------------------*/
+class PLT_MediaRendererInterface
+{
+public:
+ virtual ~PLT_MediaRendererInterface() {}
+
+ // ConnectionManager
+ virtual NPT_Result OnGetCurrentConnectionInfo(PLT_ActionReference& action) = 0;
+
+ // AVTransport
+ virtual NPT_Result OnNext(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnPause(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnPlay(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnPrevious(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSeek(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnStop(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetAVTransportURI(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetPlayMode(PLT_ActionReference& action) = 0;
+
+ // RenderingControl
+ virtual NPT_Result OnSetVolume(PLT_ActionReference& action) = 0;
+ virtual NPT_Result OnSetMute(PLT_ActionReference& action) = 0;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaRenderer class
++---------------------------------------------------------------------*/
+class PLT_MediaRenderer : public PLT_DeviceHost,
+ public PLT_MediaRendererInterface
+{
+public:
+ PLT_MediaRenderer(const char* friendly_name,
+ bool show_ip = false,
+ const char* uuid = NULL,
+ unsigned int port = 0,
+ bool port_rebind = false);
+
+ // PLT_DeviceHost methods
+ virtual NPT_Result SetupServices(PLT_DeviceData& data);
+ virtual NPT_Result OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+
+protected:
+ virtual ~PLT_MediaRenderer();
+
+ // PLT_MediaRendererInterface methods
+ // ConnectionManager
+ virtual NPT_Result OnGetCurrentConnectionInfo(PLT_ActionReference& action);
+
+ // AVTransport
+ virtual NPT_Result OnNext(PLT_ActionReference& action);
+ virtual NPT_Result OnPause(PLT_ActionReference& action);
+ virtual NPT_Result OnPlay(PLT_ActionReference& action);
+ virtual NPT_Result OnPrevious(PLT_ActionReference& action);
+ virtual NPT_Result OnSeek(PLT_ActionReference& action);
+ virtual NPT_Result OnStop(PLT_ActionReference& action);
+ virtual NPT_Result OnSetAVTransportURI(PLT_ActionReference& action);
+ virtual NPT_Result OnSetPlayMode(PLT_ActionReference& action);
+
+ // RenderingControl
+ virtual NPT_Result OnSetVolume(PLT_ActionReference& action);
+ virtual NPT_Result OnSetMute(PLT_ActionReference& action);
+};
+
+#endif /* _PLT_MEDIA_RENDERER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaRenderer/PltMediaRendererSCPDs.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaRenderer/PltMediaRendererSCPDs.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,2791 @@
+/*****************************************************************
+|
+| Platinum - AV Media Renderer Device SCPDs
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 RDR_AVTransportSCPD[22130] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72,
+ 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E,
+ 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69,
+ 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
+ 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74,
+ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72,
+ 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x73,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C,
+ 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63,
+ 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C,
+ 0x61, 0x79, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73,
+ 0x69, 0x62, 0x6C, 0x65, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D,
+ 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52,
+ 0x65, 0x63, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73,
+ 0x69, 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64,
+ 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63,
+ 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69,
+ 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x49,
+ 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
+ 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x72, 0x54, 0x72,
+ 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+ 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x4F,
+ 0x66, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43,
+ 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56,
+ 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74,
+ 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E,
+ 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F,
+ 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x4E, 0x65, 0x78, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55,
+ 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D,
+ 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x57, 0x72, 0x69, 0x74, 0x65,
+ 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72,
+ 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x57, 0x72, 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x47, 0x65, 0x74, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74,
+ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75, 0x72, 0x61,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+ 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74,
+ 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74,
+ 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61,
+ 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x54, 0x69, 0x6D, 0x65, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x54, 0x69, 0x6D, 0x65,
+ 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x54, 0x69, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+ 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x43, 0x6F, 0x75,
+ 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74,
+ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43,
+ 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65,
+ 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6E,
+ 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73,
+ 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
+ 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61,
+ 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72,
+ 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x53, 0x70, 0x65, 0x65,
+ 0x64, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x65, 0x74,
+ 0x74, 0x69, 0x6E, 0x67, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63,
+ 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C,
+ 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+ 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x52, 0x65, 0x63, 0x6F, 0x72,
+ 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x78, 0x74,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49,
+ 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x50, 0x61, 0x75, 0x73, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x54,
+ 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x53, 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6F, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73,
+ 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x65, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E,
+ 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x6E, 0x69, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x4D, 0x6F, 0x64, 0x65, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53,
+ 0x65, 0x65, 0x6B, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x41, 0x56, 0x54, 0x72,
+ 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x55, 0x52, 0x49,
+ 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72,
+ 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x53, 0x65, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E, 0x65, 0x77, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x6F, 0x70, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74,
+ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+ 0x6E, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74,
+ 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x3C, 0x2F,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x52, 0x45, 0x50, 0x45, 0x41, 0x54, 0x5F, 0x41, 0x4C, 0x4C, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x49, 0x4E, 0x54, 0x52, 0x4F, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x65, 0x66, 0x61,
+ 0x75, 0x6C, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x52, 0x4D, 0x41, 0x4C, 0x3C, 0x2F, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6C, 0x74, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+ 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72,
+ 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
+ 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x3C, 0x2F,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x44, 0x56, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4D, 0x49, 0x4E, 0x49, 0x2D, 0x44, 0x56, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x56, 0x48, 0x53, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x57, 0x2D, 0x56, 0x48, 0x53, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x2D, 0x56, 0x48, 0x53, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x2D,
+ 0x56, 0x48, 0x53, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x56, 0x48, 0x53, 0x43, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x56, 0x49, 0x44, 0x45, 0x4F, 0x38, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x48, 0x49, 0x38, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x52, 0x4F, 0x4D, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D,
+ 0x44, 0x41, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x52, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x52, 0x57, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x56, 0x49, 0x44, 0x45, 0x4F, 0x2D, 0x43, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x41, 0x43, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4D, 0x44,
+ 0x2D, 0x41, 0x55, 0x44, 0x49, 0x4F, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4D, 0x44, 0x2D, 0x50, 0x49, 0x43, 0x54, 0x55, 0x52, 0x45, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x52, 0x4F, 0x4D, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x56, 0x49, 0x44, 0x45,
+ 0x4F, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x52, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2B, 0x52, 0x57, 0x3C, 0x2F,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x52, 0x57, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x52, 0x41, 0x4D, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x44, 0x56, 0x44, 0x2D, 0x41, 0x55, 0x44, 0x49, 0x4F, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x41, 0x54, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4C, 0x44,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x48, 0x44, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4D, 0x49, 0x43, 0x52, 0x4F, 0x2D, 0x4D, 0x56, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x4E, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54,
+ 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x76, 0x65, 0x6E, 0x64,
+ 0x6F, 0x72, 0x2D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x64, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4C, 0x61, 0x73,
+ 0x74, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E,
+ 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65,
+ 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72,
+ 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72,
+ 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61, 0x6C, 0x69,
+ 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x30, 0x3A, 0x45, 0x50, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x31, 0x3A, 0x4C, 0x50, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x32, 0x3A, 0x53, 0x50, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x30, 0x3A, 0x42, 0x41, 0x53, 0x49, 0x43, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x31,
+ 0x3A, 0x4D, 0x45, 0x44, 0x49, 0x55, 0x4D, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x32, 0x3A, 0x48, 0x49, 0x47, 0x48, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
+ 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x76, 0x65,
+ 0x6E, 0x64, 0x6F, 0x72, 0x2D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x64, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75,
+ 0x72, 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75, 0x74, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x65, 0x72, 0x50, 0x6F,
+ 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
+ 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x6C, 0x61, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6F, 0x75, 0x6E, 0x74,
+ 0x65, 0x72, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34,
+ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65,
+ 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
+ 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E,
+ 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F,
+ 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E,
+ 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x54, 0x4F, 0x50, 0x50, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x50,
+ 0x41, 0x55, 0x53, 0x45, 0x44, 0x5F, 0x50, 0x4C, 0x41, 0x59, 0x42, 0x41, 0x43, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x50, 0x41, 0x55,
+ 0x53, 0x45, 0x44, 0x5F, 0x52, 0x45, 0x43, 0x4F, 0x52, 0x44, 0x49, 0x4E, 0x47, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x50, 0x4C, 0x41, 0x59,
+ 0x49, 0x4E, 0x47, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x52, 0x45, 0x43, 0x4F, 0x52, 0x44, 0x49, 0x4E, 0x47, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x54, 0x52,
+ 0x41, 0x4E, 0x53, 0x49, 0x54, 0x49, 0x4F, 0x4E, 0x49, 0x4E, 0x47, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x5F, 0x4D, 0x45, 0x44,
+ 0x49, 0x41, 0x5F, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4E, 0x54, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+ 0x6E, 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E,
+ 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x4E, 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x51, 0x75, 0x61,
+ 0x6C, 0x69, 0x74, 0x79, 0x4D, 0x6F, 0x64, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
+ 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E,
+ 0x74, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D,
+ 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x34, 0x32, 0x39, 0x34, 0x39,
+ 0x36, 0x37, 0x32, 0x39, 0x35, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74,
+ 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x62, 0x73, 0x6F, 0x6C, 0x75,
+ 0x74, 0x65, 0x54, 0x69, 0x6D, 0x65, 0x50, 0x6F, 0x73, 0x69, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+ 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E,
+ 0x65, 0x78, 0x74, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74,
+ 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
+ 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E,
+ 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74,
+ 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73,
+ 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x44, 0x56, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4D, 0x49, 0x4E, 0x49, 0x2D, 0x44, 0x56, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x56, 0x48,
+ 0x53, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x57, 0x2D, 0x56, 0x48, 0x53, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x2D, 0x56, 0x48, 0x53, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x44, 0x2D, 0x56, 0x48, 0x53, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x56, 0x48, 0x53, 0x43, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x56, 0x49, 0x44, 0x45, 0x4F,
+ 0x38, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x48, 0x49, 0x38, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x52, 0x4F, 0x4D, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43,
+ 0x44, 0x2D, 0x44, 0x41, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x52, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x44, 0x2D, 0x52, 0x57, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x56, 0x49, 0x44, 0x45, 0x4F, 0x2D, 0x43, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x53, 0x41, 0x43, 0x44, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x4D, 0x44, 0x2D, 0x41, 0x55, 0x44, 0x49, 0x4F, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4D, 0x44, 0x2D, 0x50, 0x49, 0x43, 0x54, 0x55, 0x52,
+ 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x52, 0x4F, 0x4D, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x56, 0x49,
+ 0x44, 0x45, 0x4F, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x52, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2B, 0x52, 0x57,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x52, 0x57, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x52, 0x41, 0x4D, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x44, 0x56, 0x44, 0x2D, 0x41, 0x55, 0x44, 0x49, 0x4F, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x44, 0x41, 0x54, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x4C, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x48, 0x44, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4D, 0x49, 0x43, 0x52, 0x4F, 0x2D, 0x4D, 0x56, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x4E, 0x45, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
+ 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x76, 0x65,
+ 0x6E, 0x64, 0x6F, 0x72, 0x2D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x64, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75,
+ 0x72, 0x72, 0x65, 0x6E, 0x74, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x4D, 0x65, 0x64, 0x69, 0x75, 0x6D, 0x57, 0x72,
+ 0x69, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72,
+ 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x57, 0x52, 0x49, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x50, 0x52, 0x4F, 0x54, 0x45, 0x43, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E, 0x4F, 0x54, 0x5F, 0x57, 0x52,
+ 0x49, 0x54, 0x41, 0x42, 0x4C, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x55, 0x4E, 0x4B, 0x4E, 0x4F, 0x57, 0x4E, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4E,
+ 0x4F, 0x54, 0x5F, 0x49, 0x4D, 0x50, 0x4C, 0x45, 0x4D, 0x45, 0x4E, 0x54, 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+ 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50,
+ 0x6F, 0x73, 0x73, 0x69, 0x62, 0x6C, 0x65, 0x50, 0x6C, 0x61, 0x79, 0x62, 0x61, 0x63, 0x6B, 0x53, 0x74, 0x6F, 0x72, 0x61,
+ 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E,
+ 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70,
+ 0x6F, 0x72, 0x74, 0x55, 0x52, 0x49, 0x4D, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+ 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4E,
+ 0x75, 0x6D, 0x62, 0x65, 0x72, 0x4F, 0x66, 0x54, 0x72, 0x61, 0x63, 0x6B, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52,
+ 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75,
+ 0x6D, 0x3E, 0x34, 0x32, 0x39, 0x34, 0x39, 0x36, 0x37, 0x32, 0x39, 0x35, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75,
+ 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x53, 0x65, 0x65, 0x6B, 0x4D, 0x6F, 0x64, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x41, 0x42, 0x53, 0x5F, 0x54, 0x49,
+ 0x4D, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x52, 0x45, 0x4C, 0x5F, 0x54, 0x49, 0x4D, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x41, 0x42, 0x53, 0x5F,
+ 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x52, 0x45, 0x4C, 0x5F, 0x43, 0x4F, 0x55, 0x4E, 0x54, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x54, 0x52, 0x41, 0x43, 0x4B, 0x5F, 0x4E, 0x52, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x43, 0x48, 0x41, 0x4E, 0x4E, 0x45, 0x4C, 0x5F, 0x46,
+ 0x52, 0x45, 0x51, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x54, 0x41, 0x50, 0x45, 0x2D, 0x49, 0x4E, 0x44, 0x45, 0x58, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x46,
+ 0x52, 0x41, 0x4D, 0x45, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x53, 0x65, 0x65, 0x6B, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74,
+ 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x6F, 0x73, 0x73, 0x69,
+ 0x62, 0x6C, 0x65, 0x52, 0x65, 0x63, 0x6F, 0x72, 0x64, 0x53, 0x74, 0x6F, 0x72, 0x61, 0x67, 0x65, 0x4D, 0x65, 0x64, 0x69,
+ 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75,
+ 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x4F, 0x4B, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x45, 0x52, 0x52, 0x4F, 0x52, 0x5F, 0x4F, 0x43, 0x43, 0x55, 0x52, 0x52,
+ 0x45, 0x44, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x76, 0x65, 0x6E, 0x64, 0x6F, 0x72, 0x2D, 0x64, 0x65, 0x66, 0x69, 0x6E, 0x65, 0x64,
+ 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x50, 0x6C, 0x61, 0x79, 0x53,
+ 0x70, 0x65, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x31, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x76, 0x65, 0x6E, 0x64, 0x6F, 0x72, 0x2D, 0x64, 0x65,
+ 0x66, 0x69, 0x6E, 0x65, 0x64, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
+};
+
+NPT_UInt8 RDR_RenderingControlSCPD[27181] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72,
+ 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E,
+ 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69,
+ 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x47, 0x65, 0x74, 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C,
+ 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72,
+ 0x72, 0x65, 0x6E, 0x74, 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65,
+ 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64, 0x65,
+ 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x42, 0x6C,
+ 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49,
+ 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F,
+ 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+ 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64,
+ 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6E,
+ 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
+ 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43,
+ 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x65, 0x6D, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E,
+ 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72,
+ 0x54, 0x65, 0x6D, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x65, 0x6D, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x47, 0x65, 0x74, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x61, 0x73, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49,
+ 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x61, 0x73, 0x74, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x61, 0x73, 0x74, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x47, 0x65, 0x74, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65,
+ 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
+ 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65,
+ 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75,
+ 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64,
+ 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x47,
+ 0x72, 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x56, 0x69,
+ 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x47, 0x72, 0x65, 0x65,
+ 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x48, 0x6F, 0x72,
+ 0x69, 0x7A, 0x6F, 0x6E, 0x74, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E,
+ 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x48, 0x6F, 0x72, 0x69, 0x7A,
+ 0x6F, 0x6E, 0x74, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x48, 0x6F, 0x72, 0x69, 0x7A, 0x6F, 0x6E, 0x74, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x4C, 0x6F, 0x75, 0x64, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E,
+ 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65,
+ 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x4C, 0x6F, 0x75, 0x64, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x4C, 0x6F, 0x75, 0x64, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x4D, 0x75, 0x74, 0x65, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68,
+ 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x4D, 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x4D, 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42,
+ 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73,
+ 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61,
+ 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x64, 0x56,
+ 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65,
+ 0x74, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64, 0x65,
+ 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64,
+ 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x70, 0x6E, 0x65,
+ 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+ 0x6E, 0x74, 0x53, 0x68, 0x61, 0x72, 0x70, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x53, 0x68, 0x61, 0x72, 0x70, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74,
+ 0x69, 0x63, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49,
+ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6C,
+ 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56, 0x65, 0x72,
+ 0x74, 0x69, 0x63, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74,
+ 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E,
+ 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43,
+ 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47,
+ 0x65, 0x74, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x56, 0x6F,
+ 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+ 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44,
+ 0x42, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x52, 0x61, 0x6E, 0x67,
+ 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65,
+ 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x4D, 0x69, 0x6E, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56,
+ 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x4D, 0x61, 0x78, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56,
+ 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4C, 0x69, 0x73, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65,
+ 0x74, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65,
+ 0x6E, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x6C, 0x65, 0x63, 0x74, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E,
+ 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x65,
+ 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69,
+ 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64,
+ 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x42,
+ 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74,
+ 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x42, 0x72, 0x69, 0x67, 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x53, 0x65, 0x74, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x65, 0x6D, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65,
+ 0x64, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x65, 0x6D, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x65, 0x6D, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72,
+ 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x61, 0x73, 0x74, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x43, 0x6F, 0x6E, 0x74,
+ 0x72, 0x61, 0x73, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x72, 0x61, 0x73, 0x74,
+ 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61,
+ 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61,
+ 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x47, 0x72, 0x65, 0x65, 0x6E,
+ 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53,
+ 0x65, 0x74, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x47, 0x72, 0x65, 0x65,
+ 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x47, 0x72,
+ 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x48,
+ 0x6F, 0x72, 0x69, 0x7A, 0x6F, 0x6E, 0x74, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74,
+ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x48, 0x6F, 0x72,
+ 0x69, 0x7A, 0x6F, 0x6E, 0x74, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x48, 0x6F, 0x72, 0x69, 0x7A, 0x6F, 0x6E, 0x74, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E,
+ 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x4C, 0x6F, 0x75, 0x64, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61,
+ 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E,
+ 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73,
+ 0x69, 0x72, 0x65, 0x64, 0x4C, 0x6F, 0x75, 0x64, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x4C, 0x6F, 0x75, 0x64, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x4D, 0x75, 0x74, 0x65, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68,
+ 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x4D, 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x4D,
+ 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C,
+ 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74,
+ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63,
+ 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64,
+ 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x52,
+ 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49,
+ 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47,
+ 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E,
+ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47,
+ 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x53, 0x68, 0x61, 0x72, 0x70, 0x6E, 0x65, 0x73, 0x73, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E,
+ 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x53,
+ 0x68, 0x61, 0x72, 0x70, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x68, 0x61, 0x72,
+ 0x70, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6C,
+ 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74,
+ 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73,
+ 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6C,
+ 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x56, 0x6F, 0x6C, 0x75, 0x6D,
+ 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65,
+ 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x74, 0x56, 0x6F, 0x6C, 0x75,
+ 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63, 0x65,
+ 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x68, 0x61,
+ 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x65, 0x73, 0x69, 0x72, 0x65, 0x64, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x2D, 0x33, 0x32, 0x37, 0x36, 0x38, 0x3C,
+ 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x33, 0x32, 0x37, 0x36, 0x37, 0x3C, 0x2F, 0x6D,
+ 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4C, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6E, 0x67, 0x65, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x4D, 0x61, 0x73, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4C, 0x46, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x52, 0x46, 0x3C, 0x2F,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69,
+ 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x4C, 0x6F, 0x75, 0x64, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x62,
+ 0x6F, 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x48, 0x6F, 0x72,
+ 0x69, 0x7A, 0x6F, 0x6E, 0x74, 0x61, 0x6C, 0x4B, 0x65, 0x79, 0x73, 0x74, 0x6F, 0x6E, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x2D, 0x33, 0x32, 0x37, 0x36, 0x38, 0x3C, 0x2F, 0x6D, 0x69, 0x6E,
+ 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x33, 0x32, 0x37, 0x36, 0x37, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D,
+ 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
+ 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x63,
+ 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
+ 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x42, 0x6C, 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C,
+ 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30,
+ 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30, 0x30, 0x3C, 0x2F, 0x6D, 0x61,
+ 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52,
+ 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E,
+ 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D,
+ 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61,
+ 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30, 0x30, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31,
+ 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x72,
+ 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69,
+ 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D,
+ 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30, 0x30, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E,
+ 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+ 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x56,
+ 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E,
+ 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30, 0x30, 0x3C, 0x2F, 0x6D,
+ 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4D, 0x75, 0x74, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x62, 0x6F,
+ 0x6F, 0x6C, 0x65, 0x61, 0x6E, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x42, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x6E, 0x65, 0x73, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D,
+ 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30, 0x30, 0x3C, 0x2F,
+ 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
+ 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x72, 0x65, 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x4C, 0x69, 0x73,
+ 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x65,
+ 0x73, 0x65, 0x74, 0x4E, 0x61, 0x6D, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E,
+ 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F,
+ 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x46, 0x61, 0x63, 0x74, 0x6F, 0x72, 0x79, 0x44, 0x65, 0x66, 0x61,
+ 0x75, 0x6C, 0x74, 0x73, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x74, 0x61, 0x6C, 0x6C, 0x61, 0x74, 0x69, 0x6F, 0x6E, 0x44,
+ 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x73, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x56, 0x65, 0x6E, 0x64, 0x6F, 0x72, 0x20, 0x64, 0x65, 0x66,
+ 0x69, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6C, 0x6F, 0x72, 0x54, 0x65, 0x6D, 0x70, 0x65, 0x72,
+ 0x61, 0x74, 0x75, 0x72, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E,
+ 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x36, 0x35, 0x35, 0x33, 0x35, 0x3C,
+ 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+ 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x56, 0x6F, 0x6C, 0x75, 0x6D, 0x65, 0x44, 0x42, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x2D, 0x33, 0x32, 0x37, 0x36, 0x38, 0x3C, 0x2F, 0x6D, 0x69,
+ 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x33, 0x32, 0x37, 0x36, 0x37, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69,
+ 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x72,
+ 0x61, 0x73, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C,
+ 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30, 0x30, 0x3C, 0x2F, 0x6D, 0x61, 0x78,
+ 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61,
+ 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+ 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x72, 0x65, 0x65, 0x6E, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69,
+ 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D,
+ 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30, 0x30, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E,
+ 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+ 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52,
+ 0x65, 0x64, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x42, 0x6C, 0x61, 0x63, 0x6B, 0x4C, 0x65, 0x76, 0x65, 0x6C, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D,
+ 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61,
+ 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30, 0x30, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31,
+ 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x42, 0x6C,
+ 0x75, 0x65, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x47, 0x61, 0x69, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75,
+ 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E,
+ 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69,
+ 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E,
+ 0x31, 0x30, 0x30, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x68, 0x61, 0x72, 0x70, 0x6E, 0x65, 0x73,
+ 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x32, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77,
+ 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x30, 0x3C, 0x2F, 0x6D,
+ 0x69, 0x6E, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6D, 0x61, 0x78, 0x69, 0x6D, 0x75, 0x6D, 0x3E, 0x31, 0x30, 0x30, 0x3C, 0x2F, 0x6D, 0x61, 0x78, 0x69, 0x6D,
+ 0x75, 0x6D, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74,
+ 0x65, 0x70, 0x3E, 0x31, 0x3C, 0x2F, 0x73, 0x74, 0x65, 0x70, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x52, 0x61, 0x6E, 0x67,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E,
+ 0x00
+};
+
+NPT_UInt8 RDR_ConnectionManagerSCPD[5428] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x27, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65,
+ 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x6A,
+ 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72,
+ 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49,
+ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56,
+ 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61,
+ 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x50, 0x65, 0x65, 0x72, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+ 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F,
+ 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6F, 0x74, 0x6F,
+ 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F,
+ 0x75, 0x72, 0x63, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66,
+ 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x69, 0x6E, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x69, 0x6E, 0x6B, 0x50, 0x72, 0x6F, 0x74,
+ 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43,
+ 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x65,
+ 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+ 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x74, 0x61, 0x74,
+ 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
+ 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4F, 0x4B, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x46, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x4D, 0x69, 0x73, 0x6D,
+ 0x61, 0x74, 0x63, 0x68, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69,
+ 0x65, 0x6E, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x55,
+ 0x6E, 0x72, 0x65, 0x6C, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x55, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x41, 0x56, 0x54, 0x72,
+ 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+ 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F,
+ 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27,
+ 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49,
+ 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53,
+ 0x69, 0x6E, 0x6B, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
+ 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x49, 0x6E, 0x70, 0x75, 0x74, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4F, 0x75, 0x74, 0x70, 0x75, 0x74,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x65,
+ 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F,
+ 0x73, 0x63, 0x70, 0x64, 0x3E, 0x0D, 0x0A, 0x00
+};
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaRenderer/RenderingControlSCPD.xml Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,749 @@
+
+
+
+ 1
+ 0
+
+
+
+ GetBlueVideoBlackLevel
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentBlueVideoBlackLevel
+ out
+ BlueVideoBlackLevel
+
+
+
+
+ GetBlueVideoGain
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentBlueVideoGain
+ out
+ BlueVideoGain
+
+
+
+
+ GetBrightness
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentBrightness
+ out
+ Brightness
+
+
+
+
+ GetColorTemperature
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentColorTemperature
+ out
+ ColorTemperature
+
+
+
+
+ GetContrast
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentContrast
+ out
+ Contrast
+
+
+
+
+ GetGreenVideoBlackLevel
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentGreenVideoBlackLevel
+ out
+ GreenVideoBlackLevel
+
+
+
+
+ GetGreenVideoGain
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentGreenVideoGain
+ out
+ GreenVideoGain
+
+
+
+
+ GetHorizontalKeystone
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentHorizontalKeystone
+ out
+ HorizontalKeystone
+
+
+
+
+ GetLoudness
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Channel
+ in
+ A_ARG_TYPE_Channel
+
+
+ CurrentLoudness
+ out
+ Loudness
+
+
+
+
+ GetMute
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Channel
+ in
+ A_ARG_TYPE_Channel
+
+
+ CurrentMute
+ out
+ Mute
+
+
+
+
+ GetRedVideoBlackLevel
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentRedVideoBlackLevel
+ out
+ RedVideoBlackLevel
+
+
+
+
+ GetRedVideoGain
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentRedVideoGain
+ out
+ RedVideoGain
+
+
+
+
+ GetSharpness
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentSharpness
+ out
+ Sharpness
+
+
+
+
+ GetVerticalKeystone
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentVerticalKeystone
+ out
+ VerticalKeystone
+
+
+
+
+ GetVolume
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Channel
+ in
+ A_ARG_TYPE_Channel
+
+
+ CurrentVolume
+ out
+ Volume
+
+
+
+
+ GetVolumeDB
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Channel
+ in
+ A_ARG_TYPE_Channel
+
+
+ CurrentVolume
+ out
+ VolumeDB
+
+
+
+
+ GetVolumeDBRange
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Channel
+ in
+ A_ARG_TYPE_Channel
+
+
+ MinValue
+ out
+ VolumeDB
+
+
+ MaxValue
+ out
+ VolumeDB
+
+
+
+
+ ListPresets
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ CurrentPresetNameList
+ out
+ PresetNameList
+
+
+
+
+ SelectPreset
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ PresetName
+ in
+ A_ARG_TYPE_PresetName
+
+
+
+
+ SetBlueVideoBlackLevel
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredBlueVideoBlackLevel
+ in
+ BlueVideoBlackLevel
+
+
+
+
+ SetBlueVideoGain
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredBlueVideoGain
+ in
+ BlueVideoGain
+
+
+
+
+ SetBrightness
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredBrightness
+ in
+ Brightness
+
+
+
+
+ SetColorTemperature
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredColorTemperature
+ in
+ ColorTemperature
+
+
+
+
+ SetContrast
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredContrast
+ in
+ Contrast
+
+
+
+
+ SetGreenVideoBlackLevel
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredGreenVideoBlackLevel
+ in
+ GreenVideoBlackLevel
+
+
+
+
+ SetGreenVideoGain
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredGreenVideoGain
+ in
+ GreenVideoGain
+
+
+
+
+ SetHorizontalKeystone
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredHorizontalKeystone
+ in
+ HorizontalKeystone
+
+
+
+
+ SetLoudness
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Channel
+ in
+ A_ARG_TYPE_Channel
+
+
+ DesiredLoudness
+ in
+ Loudness
+
+
+
+
+ SetMute
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Channel
+ in
+ A_ARG_TYPE_Channel
+
+
+ DesiredMute
+ in
+ Mute
+
+
+
+
+ SetRedVideoBlackLevel
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredRedVideoBlackLevel
+ in
+ RedVideoBlackLevel
+
+
+
+
+ SetRedVideoGain
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredRedVideoGain
+ in
+ RedVideoGain
+
+
+
+
+ SetSharpness
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredSharpness
+ in
+ Sharpness
+
+
+
+
+ SetVerticalKeystone
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ DesiredVerticalKeystone
+ in
+ VerticalKeystone
+
+
+
+
+ SetVolume
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Channel
+ in
+ A_ARG_TYPE_Channel
+
+
+ DesiredVolume
+ in
+ Volume
+
+
+
+
+ SetVolumeDB
+
+
+ InstanceID
+ in
+ A_ARG_TYPE_InstanceID
+
+
+ Channel
+ in
+ A_ARG_TYPE_Channel
+
+
+ DesiredVolume
+ in
+ VolumeDB
+
+
+
+
+
+
+ VerticalKeystone
+ i2
+
+ -32768
+ 32767
+ 1
+
+
+
+ LastChange
+ string
+
+
+ A_ARG_TYPE_Channel
+ string
+
+ Master
+ LF
+ RF
+
+
+
+ Loudness
+ boolean
+
+
+ HorizontalKeystone
+ i2
+
+ -32768
+ 32767
+ 1
+
+
+
+ A_ARG_TYPE_InstanceID
+ ui4
+
+
+ BlueVideoBlackLevel
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+ RedVideoGain
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+ GreenVideoBlackLevel
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+ Volume
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+ Mute
+ boolean
+
+
+ Brightness
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+ PresetNameList
+ string
+
+
+ A_ARG_TYPE_PresetName
+ string
+
+ FactoryDefaults
+ InstallationDefaults
+ Vendor defined
+
+
+
+ ColorTemperature
+ ui2
+
+ 0
+ 65535
+ 1
+
+
+
+ VolumeDB
+ i2
+
+ -32768
+ 32767
+
+
+
+ Contrast
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+ GreenVideoGain
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+ RedVideoBlackLevel
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+ BlueVideoGain
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+ Sharpness
+ ui2
+
+ 0
+ 100
+ 1
+
+
+
+
\ No newline at end of file
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/ConnectionManagerSCPD.xml Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,132 @@
+
+
+
+ 1
+ 0
+
+
+
+ GetCurrentConnectionInfo
+
+
+ ConnectionID
+ in
+ A_ARG_TYPE_ConnectionID
+
+
+ RcsID
+ out
+ A_ARG_TYPE_RcsID
+
+
+ AVTransportID
+ out
+ A_ARG_TYPE_AVTransportID
+
+
+ ProtocolInfo
+ out
+ A_ARG_TYPE_ProtocolInfo
+
+
+ PeerConnectionManager
+ out
+ A_ARG_TYPE_ConnectionManager
+
+
+ PeerConnectionID
+ out
+ A_ARG_TYPE_ConnectionID
+
+
+ Direction
+ out
+ A_ARG_TYPE_Direction
+
+
+ Status
+ out
+ A_ARG_TYPE_ConnectionStatus
+
+
+
+
+ GetProtocolInfo
+
+
+ Source
+ out
+ SourceProtocolInfo
+
+
+ Sink
+ out
+ SinkProtocolInfo
+
+
+
+
+ GetCurrentConnectionIDs
+
+
+ ConnectionIDs
+ out
+ CurrentConnectionIDs
+
+
+
+
+
+
+ A_ARG_TYPE_ProtocolInfo
+ string
+
+
+ A_ARG_TYPE_ConnectionStatus
+ string
+
+ OK
+ ContentFormatMismatch
+ InsufficientBandwidth
+ UnreliableChannel
+ Unknown
+
+
+
+ A_ARG_TYPE_AVTransportID
+ i4
+
+
+ A_ARG_TYPE_RcsID
+ i4
+
+
+ A_ARG_TYPE_ConnectionID
+ i4
+
+
+ A_ARG_TYPE_ConnectionManager
+ string
+
+
+ SourceProtocolInfo
+ string
+
+
+ SinkProtocolInfo
+ string
+
+
+ A_ARG_TYPE_Direction
+ string
+
+ Input
+ Output
+
+
+
+ CurrentConnectionIDs
+ string
+
+
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/ContentDirectorySCPD.xml Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,148 @@
+
+
+
+ 1
+ 0
+
+
+
+ Browse
+
+
+ ObjectID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ BrowseFlag
+ in
+ A_ARG_TYPE_BrowseFlag
+
+
+ Filter
+ in
+ A_ARG_TYPE_Filter
+
+
+ StartingIndex
+ in
+ A_ARG_TYPE_Index
+
+
+ RequestedCount
+ in
+ A_ARG_TYPE_Count
+
+
+ SortCriteria
+ in
+ A_ARG_TYPE_SortCriteria
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+ NumberReturned
+ out
+ A_ARG_TYPE_Count
+
+
+ TotalMatches
+ out
+ A_ARG_TYPE_Count
+
+
+ UpdateID
+ out
+ A_ARG_TYPE_UpdateID
+
+
+
+
+ GetSortCapabilities
+
+
+ SortCaps
+ out
+ SortCapabilities
+
+
+
+
+ GetSystemUpdateID
+
+
+ Id
+ out
+ SystemUpdateID
+
+
+
+
+ GetSearchCapabilities
+
+
+ SearchCaps
+ out
+ SearchCapabilities
+
+
+
+
+
+
+ A_ARG_TYPE_BrowseFlag
+ string
+
+ BrowseMetadata
+ BrowseDirectChildren
+
+
+
+ ContainerUpdateIDs
+ string
+
+
+ SystemUpdateID
+ ui4
+
+
+ A_ARG_TYPE_Count
+ ui4
+
+
+ A_ARG_TYPE_SortCriteria
+ string
+
+
+ SortCapabilities
+ string
+
+
+ A_ARG_TYPE_Index
+ ui4
+
+
+ A_ARG_TYPE_ObjectID
+ string
+
+
+ A_ARG_TYPE_UpdateID
+ ui4
+
+
+ A_ARG_TYPE_Result
+ string
+
+
+ SearchCapabilities
+ string
+
+
+ A_ARG_TYPE_Filter
+ string
+
+
+
\ No newline at end of file
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/ContentDirectorywSearchSCPD.xml Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,207 @@
+
+
+
+ 1
+ 0
+
+
+
+ Browse
+
+
+ ObjectID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ BrowseFlag
+ in
+ A_ARG_TYPE_BrowseFlag
+
+
+ Filter
+ in
+ A_ARG_TYPE_Filter
+
+
+ StartingIndex
+ in
+ A_ARG_TYPE_Index
+
+
+ RequestedCount
+ in
+ A_ARG_TYPE_Count
+
+
+ SortCriteria
+ in
+ A_ARG_TYPE_SortCriteria
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+ NumberReturned
+ out
+ A_ARG_TYPE_Count
+
+
+ TotalMatches
+ out
+ A_ARG_TYPE_Count
+
+
+ UpdateID
+ out
+ A_ARG_TYPE_UpdateID
+
+
+
+
+ GetSortCapabilities
+
+
+ SortCaps
+ out
+ SortCapabilities
+
+
+
+
+ GetSystemUpdateID
+
+
+ Id
+ out
+ SystemUpdateID
+
+
+
+
+ GetSearchCapabilities
+
+
+ SearchCaps
+ out
+ SearchCapabilities
+
+
+
+
+ Search
+
+
+ ContainerID
+ in
+ A_ARG_TYPE_ObjectID
+
+
+ SearchCriteria
+ in
+ A_ARG_TYPE_SearchCriteria
+
+
+ Filter
+ in
+ A_ARG_TYPE_Filter
+
+
+ StartingIndex
+ in
+ A_ARG_TYPE_Index
+
+
+ RequestedCount
+ in
+ A_ARG_TYPE_Count
+
+
+ SortCriteria
+ in
+ A_ARG_TYPE_SortCriteria
+
+
+ Result
+ out
+ A_ARG_TYPE_Result
+
+
+ NumberReturned
+ out
+ A_ARG_TYPE_Count
+
+
+ TotalMatches
+ out
+ A_ARG_TYPE_Count
+
+
+ UpdateID
+ out
+ A_ARG_TYPE_UpdateID
+
+
+
+
+
+
+ A_ARG_TYPE_BrowseFlag
+ string
+
+ BrowseMetadata
+ BrowseDirectChildren
+
+
+
+ ContainerUpdateIDs
+ string
+
+
+ SystemUpdateID
+ ui4
+
+
+ A_ARG_TYPE_Count
+ ui4
+
+
+ A_ARG_TYPE_SortCriteria
+ string
+
+
+ A_ARG_TYPE_SearchCriteria
+ string
+
+
+ SortCapabilities
+ string
+
+
+ A_ARG_TYPE_Index
+ ui4
+
+
+ A_ARG_TYPE_ObjectID
+ string
+
+
+ A_ARG_TYPE_UpdateID
+ ui4
+
+
+ A_ARG_TYPE_Result
+ string
+
+
+ SearchCapabilities
+ string
+
+
+ A_ARG_TYPE_Filter
+ string
+
+
+
\ No newline at end of file
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltDidl.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltDidl.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,355 @@
+/*****************************************************************
+|
+| Platinum - DIDL
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltDidl.h"
+#include "PltXmlHelper.h"
+#include "PltService.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.didl")
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+const char* didl_header = "";
+const char* didl_footer = "";
+const char* didl_namespace_dc = "http://purl.org/dc/elements/1.1/";
+const char* didl_namespace_upnp = "urn:schemas-upnp-org:metadata-1-0/upnp/";
+const char* didl_namespace_dlna = "urn:schemas-dlna-org:metadata-1-0/";
+
+/*----------------------------------------------------------------------
+| PLT_Didl::ConvertFilterToMask
++---------------------------------------------------------------------*/
+NPT_UInt32
+PLT_Didl::ConvertFilterToMask(NPT_String filter)
+{
+ // easy out
+ if (filter.GetLength() == 0) return PLT_FILTER_MASK_ALL;
+
+ // a filter string is a comma delimited set of fields identifying
+ // a given DIDL property (or set of properties).
+ // These fields are or start with: upnp:, @, res@, res, dc:, container@
+
+ NPT_UInt32 mask = 0;
+ const char* s = filter;
+ int i = 0;
+
+ while (s[i] != '\0') {
+ int next_comma = filter.Find(',', i);
+ int len = ((next_comma < 0)?filter.GetLength():next_comma)-i;
+
+ if (NPT_String::CompareN(s+i, "*", 1) == 0) {
+ // return now, there's no point in parsing the rest
+ return PLT_FILTER_MASK_ALL;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_CREATOR, len) == 0) {
+ mask |= PLT_FILTER_MASK_CREATOR;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ARTIST, len) == 0) {
+ mask |= PLT_FILTER_MASK_ARTIST;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ACTOR, len) == 0) {
+ mask |= PLT_FILTER_MASK_ACTOR;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_AUTHOR, len) == 0) {
+ mask |= PLT_FILTER_MASK_AUTHOR;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_DATE, len) == 0) {
+ mask |= PLT_FILTER_MASK_DATE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ALBUM, len) == 0) {
+ mask |= PLT_FILTER_MASK_ALBUM;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_GENRE, len) == 0) {
+ mask |= PLT_FILTER_MASK_GENRE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ALBUMARTURI, len) == 0) {
+ mask |= PLT_FILTER_MASK_ALBUMARTURI;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_DESCRIPTION, len) == 0) {
+ mask |= PLT_FILTER_MASK_DESCRIPTION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_ORIGINALTRACK, len) == 0) {
+ mask |= PLT_FILTER_MASK_ORIGINALTRACK;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_SEARCHABLE, len) == 0) {
+ mask |= PLT_FILTER_MASK_SEARCHABLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_CONTAINER_SEARCHABLE, len) == 0) {
+ mask |= PLT_FILTER_MASK_SEARCHABLE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_CHILDCOUNT, len) == 0) {
+ mask |= PLT_FILTER_MASK_CHILDCOUNT;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_CONTAINER_CHILDCOUNT, len) == 0) {
+ mask |= PLT_FILTER_MASK_CHILDCOUNT;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_DURATION, len) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_DURATION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_SIZE, len) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_SIZE;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_PROTECTION, len) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_PROTECTION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES_RESOLUTION, len) == 0) {
+ mask |= PLT_FILTER_MASK_RES | PLT_FILTER_MASK_RES_RESOLUTION;
+ } else if (NPT_String::CompareN(s+i, PLT_FILTER_FIELD_RES, len) == 0) {
+ mask |= PLT_FILTER_MASK_RES;
+ }
+
+ if (next_comma < 0) {
+ return mask;
+ }
+
+ i = next_comma + 1;
+ }
+
+ return mask;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::AppendXmlUnEscape
++---------------------------------------------------------------------*/
+void
+PLT_Didl::AppendXmlUnEscape(NPT_String& out, NPT_String& in)
+{
+ const char* input = (const char*) in;
+ unsigned int i=0;
+ while (i';
+ i += 4;
+ } else if (NPT_String::CompareN(input+i, "&", 5) == 0) {
+ out += '&';
+ i += 5;
+ } else if (NPT_String::CompareN(input+i, """, 6) == 0) {
+ out += '"';
+ i += 6;
+ } else if (NPT_String::CompareN(input+i, "'", 6) == 0) {
+ out += '\'';
+ i += 6;
+ } else {
+ out += *(input+i);
+ i++;
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::AppendXmlEscape
++---------------------------------------------------------------------*/
+void
+PLT_Didl::AppendXmlEscape(NPT_String& out, NPT_String& in)
+{
+ for (int i=0; i<(int)in.GetLength(); i++) {
+ if (in[i] == '<') {
+ out += "<";
+ } else if (in[i] == '>') {
+ out += ">";
+ } else if (in[i] == '&') {
+ out += "&";
+ } else if (in[i] == '"') {
+ out += """;
+ } else if (in[i] == '\'') {
+ out += "'";
+ } else {
+ out += in[i];
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::FormatTimeStamp
++---------------------------------------------------------------------*/
+void
+PLT_Didl::FormatTimeStamp(NPT_String& out, NPT_UInt32 seconds)
+{
+ int hours = seconds/3600;
+ if (hours == 0) {
+ out += "00:";
+ } else {
+ if (hours < 10) {
+ out += '0';
+ }
+ out += NPT_String::FromInteger(hours) + ":";
+ }
+
+ int minutes = (seconds/60)%60;
+ if (minutes == 0) {
+ out += "00:";
+ } else {
+ if (minutes < 10) {
+ out += '0';
+ }
+ out += NPT_String::FromInteger(minutes) + ":";
+ }
+
+ int secs = seconds%60;
+ if (secs == 0) {
+ out += "00";
+ } else {
+ if (secs < 10) {
+ out += '0';
+ }
+ out += NPT_String::FromInteger(secs);
+ }
+
+ out += ".000";
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::ParseTimeStamp
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Didl::ParseTimeStamp(NPT_String timestamp, NPT_UInt32& seconds)
+{
+ // assume a timestamp in the format HH:MM:SS
+ int colon;
+ NPT_String str = timestamp;
+ NPT_UInt32 num;
+
+ // extract millisecondsfirst
+ if ((colon = timestamp.ReverseFind('.')) != -1) {
+ str = timestamp.SubString(colon + 1);
+ timestamp = timestamp.Left(colon);
+ }
+
+ // extract seconds first
+ str = timestamp;
+ if ((colon = timestamp.ReverseFind(':')) != -1) {
+ str = timestamp.SubString(colon + 1);
+ timestamp = timestamp.Left(colon);
+ }
+
+ if (NPT_FAILED(str.ToInteger(num))) {
+ return NPT_FAILURE;
+ }
+
+ seconds = num;
+
+ // extract minutes
+ str = timestamp;
+ if (timestamp.GetLength()) {
+ if ((colon = timestamp.ReverseFind(':')) != -1) {
+ str = timestamp.SubString(colon + 1);
+ timestamp = timestamp.Left(colon);
+ }
+
+ if (NPT_FAILED(str.ToInteger(num))) {
+ return NPT_FAILURE;
+ }
+
+ seconds += 60*num;
+ }
+
+ // extract hours
+ str = timestamp;
+ if (timestamp.GetLength()) {
+ if ((colon = timestamp.ReverseFind(':')) != -1) {
+ str = timestamp.SubString(colon + 1);
+ timestamp = timestamp.Left(colon);
+ }
+
+ if (NPT_FAILED(str.ToInteger(num))) {
+ return NPT_FAILURE;
+ }
+
+ seconds += 3600*num;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Didl::ToDidl(PLT_MediaObject& object, NPT_String filter, NPT_String& didl)
+{
+ NPT_UInt32 mask = ConvertFilterToMask(filter);
+
+ // Allocate enough space for the didl
+ didl.Reserve(2048);
+
+ return object.ToDidl(mask, didl);
+}
+
+/*----------------------------------------------------------------------
+| PLT_Didl::FromDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_Didl::FromDidl(const char* xml, PLT_MediaObjectListReference& objects)
+{
+ NPT_String str;
+ PLT_MediaObject* object = NULL;
+ NPT_XmlNode* node = NULL;
+ NPT_XmlElementNode* didl = NULL;
+
+ NPT_LOG_FINE("Parsing Didl...");
+
+ NPT_XmlParser parser;
+ if (NPT_FAILED(parser.Parse(xml, node)) || !node || !node->AsElementNode()) {
+ goto cleanup;
+ }
+
+ didl = node->AsElementNode();
+
+ NPT_LOG_FINE("Processing Didl xml...");
+ if (didl->GetTag().Compare("DIDL-Lite", true)) {
+ goto cleanup;
+ }
+
+ // create entry list
+ objects = new PLT_MediaObjectList();
+
+ // for each child, find out if it's a container or not
+ // and then invoke the FromDidl on it
+ for (NPT_List::Iterator children = didl->GetChildren().GetFirstItem(); children; children++) {
+ NPT_XmlElementNode* child = (*children)->AsElementNode();
+ if (!child) continue;
+
+ if (child->GetTag().Compare("Container", true) == 0) {
+ object = new PLT_MediaContainer();
+ } else if (child->GetTag().Compare("item", true) == 0) {
+ object = new PLT_MediaItem();
+ } else {
+ goto cleanup;
+ }
+
+ if (NPT_FAILED(object->FromDidl(child))) {
+ goto cleanup;
+ }
+ objects->Add(object);
+ }
+
+ delete node;
+ return NPT_SUCCESS;
+
+cleanup:
+ objects = NULL;
+ delete node;
+ delete object;
+ return NPT_FAILURE;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltDidl.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltDidl.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,118 @@
+/*****************************************************************
+|
+| Platinum - DIDL handling
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_DIDL_H_
+#define _PLT_DIDL_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaItem.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define PLT_FILTER_MASK_ALL 0xFFFFFFFF
+
+#define PLT_FILTER_MASK_CREATOR 0x00000001
+#define PLT_FILTER_MASK_ARTIST 0x00000002
+#define PLT_FILTER_MASK_ALBUM 0x00000004
+#define PLT_FILTER_MASK_GENRE 0x00000008
+#define PLT_FILTER_MASK_ALBUMARTURI 0x00000010
+#define PLT_FILTER_MASK_DESCRIPTION 0x00000020
+#define PLT_FILTER_MASK_SEARCHABLE 0x00000040
+#define PLT_FILTER_MASK_CHILDCOUNT 0x00000080
+#define PLT_FILTER_MASK_ORIGINALTRACK 0x00000100
+#define PLT_FILTER_MASK_ACTOR 0x00000200
+#define PLT_FILTER_MASK_AUTHOR 0x00000400
+#define PLT_FILTER_MASK_DATE 0x00000800
+
+#define PLT_FILTER_MASK_RES 0x00010000
+#define PLT_FILTER_MASK_RES_DURATION 0x00020000
+#define PLT_FILTER_MASK_RES_SIZE 0x00040000
+#define PLT_FILTER_MASK_RES_PROTECTION 0x00080000
+#define PLT_FILTER_MASK_RES_RESOLUTION 0x00100000
+
+#define PLT_FILTER_FIELD_CREATOR "dc:creator"
+#define PLT_FILTER_FIELD_DATE "dc:date"
+#define PLT_FILTER_FIELD_ARTIST "upnp:artist"
+#define PLT_FILTER_FIELD_ACTOR "upnp:actor"
+#define PLT_FILTER_FIELD_AUTHOR "upnp:author"
+#define PLT_FILTER_FIELD_ALBUM "upnp:album"
+#define PLT_FILTER_FIELD_GENRE "upnp:genre"
+#define PLT_FILTER_FIELD_ALBUMARTURI "upnp:albumArtURI"
+#define PLT_FILTER_FIELD_DESCRIPTION "upnp:longDescription"
+#define PLT_FILTER_FIELD_ORIGINALTRACK "upnp:originalTrackNumber"
+#define PLT_FILTER_FIELD_SEARCHABLE "@searchable"
+#define PLT_FILTER_FIELD_CHILDCOUNT "@childcount"
+#define PLT_FILTER_FIELD_CONTAINER_CHILDCOUNT "container@childCount"
+#define PLT_FILTER_FIELD_CONTAINER_SEARCHABLE "container@searchable"
+
+#define PLT_FILTER_FIELD_RES "res"
+#define PLT_FILTER_FIELD_RES_DURATION "res@duration"
+#define PLT_FILTER_FIELD_RES_SIZE "res@size"
+#define PLT_FILTER_FIELD_RES_PROTECTION "res@protection"
+#define PLT_FILTER_FIELD_RES_RESOLUTION "res@resolution"
+
+extern const char* didl_header;
+extern const char* didl_footer;
+extern const char* didl_namespace_dc;
+extern const char* didl_namespace_upnp;
+
+/*----------------------------------------------------------------------
+| PLT_Didl class
++---------------------------------------------------------------------*/
+class PLT_Didl
+{
+public:
+ static NPT_Result ToDidl(PLT_MediaObject& object, NPT_String filter, NPT_String& didl);
+ static NPT_Result FromDidl(const char* didl, PLT_MediaObjectListReference& objects);
+
+ static void AppendXmlEscape(NPT_String& out, NPT_String& in);
+ static void AppendXmlUnEscape(NPT_String& out, NPT_String& in);
+ static NPT_Result ParseTimeStamp(NPT_String timestamp, NPT_UInt32& seconds);
+ static void FormatTimeStamp(NPT_String& out, NPT_UInt32 seconds);
+
+ static NPT_Result ParseTimeStamp(NPT_String in, NPT_TimeStamp& timestamp) {
+ NPT_UInt32 seconds;
+ NPT_Result res = ParseTimeStamp(in, seconds);
+ timestamp = NPT_TimeStamp(seconds, 0);
+ return res;
+ }
+
+private:
+ static NPT_UInt32 ConvertFilterToMask(NPT_String filter);
+};
+
+#endif /* _PLT_DIDL_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltFileMediaServer.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltFileMediaServer.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,641 @@
+/*****************************************************************
+|
+| Platinum - File Media Server
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltFileMediaServer.h"
+#include "PltMediaItem.h"
+#include "PltService.h"
+#include "PltTaskManager.h"
+#include "PltHttpServer.h"
+#include "PltDidl.h"
+#include "PltMetadataHandler.h"
+#include "PltVersion.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.file")
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::PLT_FileMediaServer
++---------------------------------------------------------------------*/
+PLT_FileMediaServer::PLT_FileMediaServer(const char* path,
+ const char* friendly_name,
+ bool show_ip /* = false */,
+ const char* uuid /* = NULL */,
+ NPT_UInt16 port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_MediaServer(friendly_name,
+ show_ip,
+ uuid,
+ port,
+ port_rebind)
+{
+ /* set up the server root path */
+ m_Path = path;
+ m_Path.TrimRight("/\\");
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::~PLT_FileMediaServer
++---------------------------------------------------------------------*/
+PLT_FileMediaServer::~PLT_FileMediaServer()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::AddMetadataHandler
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::AddMetadataHandler(PLT_MetadataHandler* handler)
+{
+ // make sure we don't have a metadatahandler registered for the same extension
+/* PLT_MetadataHandler* prev_handler;
+ NPT_Result ret = NPT_ContainerFind(m_MetadataHandlers, PLT_MetadataHandlerFinder(handler->GetExtension()), prev_handler);
+ if (NPT_SUCCEEDED(ret)) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ } */
+
+ m_MetadataHandlers.Add(handler);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::SetupDevice
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::SetupDevice()
+{
+ // FIXME: hack for now: find the first valid non local ip address
+ // to use in item resources. TODO: we should advertise all ips as
+ // multiple resources instead.
+ NPT_List ips;
+ PLT_UPnPMessageHelper::GetIPAddresses(ips);
+ if (ips.GetItemCount() == 0) return NPT_ERROR_INTERNAL;
+
+ // set the base paths for content and album arts
+ m_FileBaseUri = NPT_HttpUrl(*ips.GetFirstItem(), GetPort(), "/content");
+ m_AlbumArtBaseUri = NPT_HttpUrl(*ips.GetFirstItem(), GetPort(), "/albumart");
+
+ return PLT_MediaServer::SetupDevice();
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::ProcessHttpRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ if (request.GetUrl().GetPath().StartsWith(m_FileBaseUri.GetPath()) ||
+ request.GetUrl().GetPath().StartsWith(m_AlbumArtBaseUri.GetPath())) {
+ return ProcessFileRequest(request, context, response);
+ }
+
+ return PLT_MediaServer::ProcessHttpRequest(request, context, response);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::ProcessGetDescription
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::ProcessGetDescription(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_String m_OldModelName = m_ModelName;
+ NPT_String m_OldModelNumber = m_ModelNumber;
+
+ // change some things based on User-Agent header
+ NPT_HttpHeader* user_agent = request.GetHeaders().GetHeader(NPT_HTTP_HEADER_USER_AGENT);
+ if (user_agent && user_agent->GetValue().Find("Sonos", 0, true)>=0) {
+ // Force "Rhapsody" so that Sonos is happy to find us
+ m_ModelName = "Rhapsody";
+ m_ModelNumber = "3.0";
+
+ // return modified description
+ NPT_String doc;
+ NPT_Result res = GetDescription(doc);
+
+ // reset to old values now
+ m_ModelName = m_OldModelName;
+ m_ModelNumber = m_OldModelNumber;
+
+ NPT_CHECK_FATAL(res);
+
+ PLT_HttpHelper::SetBody(response, doc);
+ PLT_HttpHelper::SetContentType(response, "text/xml");
+
+ return NPT_SUCCESS;
+ }
+
+ return PLT_MediaServer::ProcessGetDescription(request, context, response);
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::ExtractResourcePath
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::ExtractResourcePath(const NPT_HttpUrl& url, NPT_String& file_path)
+{
+ // Extract uri path from url
+ NPT_String uri_path = NPT_Uri::PercentDecode(url.GetPath());
+
+ // extract file path from query
+ NPT_HttpUrlQuery query(url.GetQuery());
+ file_path = query.GetField("path");
+ if (file_path.GetLength()) return NPT_SUCCESS;
+
+ // hack for XBMC support for 360, we urlencoded the ? to that the 360 doesn't strip out the query
+ // but then the query ends being parsed as part of the path
+ int index = uri_path.Find("path=");
+ if (index>0) {
+ file_path = uri_path.Right(uri_path.GetLength()-index-5);
+ return NPT_SUCCESS;
+ }
+
+ uri_path = url.GetPath();
+ if (uri_path.StartsWith(m_FileBaseUri.GetPath(), true)) {
+ file_path = NPT_Uri::PercentDecode(uri_path.SubString(m_FileBaseUri.GetPath().GetLength()));
+ return NPT_SUCCESS;
+ } else if (uri_path.StartsWith(m_AlbumArtBaseUri.GetPath(), true)) {
+ file_path = NPT_Uri::PercentDecode(uri_path.SubString(m_AlbumArtBaseUri.GetPath().GetLength()));
+ return NPT_SUCCESS;
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::ProcessFileRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response)
+{
+ NPT_LOG_FINE("PLT_FileMediaServer::ProcessFileRequest Received Request:");
+ PLT_LOG_HTTP_MESSAGE(NPT_LOG_LEVEL_FINE, &request);
+
+ response.GetHeaders().SetHeader("Accept-Ranges", "bytes");
+
+ if (request.GetMethod().Compare("GET") && request.GetMethod().Compare("HEAD")) {
+ response.SetStatus(500, "Internal Server Error");
+ return NPT_SUCCESS;
+ }
+
+ // Extract file path from url
+ NPT_String file_path;
+ NPT_CHECK_LABEL_WARNING(ExtractResourcePath(request.GetUrl(), file_path),
+ failure);
+
+ // Serve file now
+ if (request.GetUrl().GetPath().StartsWith(m_FileBaseUri.GetPath(), true)) {
+ NPT_CHECK_WARNING(ServeFile(request, context, response, NPT_FilePath::Create(m_Path, file_path)));
+ return NPT_SUCCESS;
+ } else if (request.GetUrl().GetPath().StartsWith(m_AlbumArtBaseUri.GetPath(), true)) {
+ NPT_CHECK_WARNING(OnAlbumArtRequest(response, NPT_FilePath::Create(m_Path, file_path)));
+ return NPT_SUCCESS;
+ }
+
+ // fallthrough
+
+failure:
+ response.SetStatus(404, "File Not Found");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::ServeFile
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::ServeFile(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ const NPT_String& file_path)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_Position start, end;
+ PLT_HttpHelper::GetRange(request, start, end);
+
+ return PLT_FileServer::ServeFile(response,
+ file_path,
+ start,
+ end,
+ !request.GetMethod().Compare("HEAD"));
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::OnAlbumArtRequest
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::OnAlbumArtRequest(NPT_HttpResponse& response,
+ NPT_String file_path)
+{
+ NPT_LargeSize total_len;
+ NPT_File file(file_path);
+ NPT_InputStreamReference stream;
+
+ // prevent hackers from accessing files outside of our root
+ if ((file_path.Find("/..") >= 0) || (file_path.Find("\\..") >= 0)) {
+ goto filenotfound;
+ }
+
+ if (NPT_FAILED(file.Open(NPT_FILE_OPEN_MODE_READ)) ||
+ NPT_FAILED(file.GetInputStream(stream)) ||
+ NPT_FAILED(stream->GetSize(total_len)) || (total_len == 0)) {
+ goto filenotfound;
+ } else {
+ NPT_String extension = NPT_FilePath::FileExtension(file_path);
+ if (extension.GetLength() == 0) {
+ goto filenotfound;
+ }
+
+ PLT_MetadataHandler* metadataHandler = NULL;
+ char* caData;
+ int caDataLen;
+ NPT_Result ret = NPT_ContainerFind(m_MetadataHandlers,
+ PLT_MetadataHandlerFinder(extension),
+ metadataHandler);
+ if (NPT_FAILED(ret) || metadataHandler == NULL) {
+ goto filenotfound;
+ }
+ // load the metadatahandler and read the cover art
+ if (NPT_FAILED(metadataHandler->Load(*stream)) ||
+ NPT_FAILED(metadataHandler->GetCoverArtData(caData, caDataLen))) {
+ goto filenotfound;
+ }
+
+ PLT_HttpHelper::SetContentType(response, "application/octet-stream");
+ PLT_HttpHelper::SetBody(response, caData, caDataLen);
+ delete caData;
+ return NPT_SUCCESS;
+ }
+
+filenotfound:
+ response.SetStatus(404, "File Not Found");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::OnBrowseMetadata
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_String didl;
+ PLT_MediaObjectReference item;
+
+ /* locate the file from the object ID */
+ NPT_String filepath;
+ if (NPT_FAILED(GetFilePath(object_id, filepath))) {
+ /* error */
+ NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowse - ObjectID not found.");
+ action->SetError(701, "No Such Object.");
+ return NPT_FAILURE;
+ }
+
+ item = BuildFromFilePath(filepath, context, true);
+
+ if (item.IsNull()) return NPT_FAILURE;
+
+ NPT_String filter;
+ NPT_CHECK_SEVERE(action->GetArgumentValue("Filter", filter));
+
+ NPT_String tmp;
+ NPT_CHECK_SEVERE(PLT_Didl::ToDidl(*item.AsPointer(), filter, tmp));
+
+ /* add didl header and footer */
+ didl = didl_header + tmp + didl_footer;
+
+ NPT_CHECK_SEVERE(action->SetArgumentValue("Result", didl));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("NumberReturned", "1"));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("TotalMatches", "1"));
+
+ // update ID may be wrong here, it should be the one of the container?
+ // TODO: We need to keep track of the overall updateID of the CDS
+ NPT_CHECK_SEVERE(action->SetArgumentValue("UpdateId", "1"));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::OnBrowseDirectChildren
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context)
+{
+ /* locate the file from the object ID */
+ NPT_String dir;
+ if (NPT_FAILED(GetFilePath(object_id, dir))) {
+ /* error */
+ NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowse - ObjectID not found.");
+ action->SetError(701, "No Such Object.");
+ return NPT_FAILURE;
+ }
+
+ /* retrieve the item type */
+ NPT_FileInfo info;
+ NPT_Result res = NPT_File::GetInfo(dir, &info);
+ if (NPT_FAILED(res)) {
+ /* Object does not exist */
+ NPT_LOG_WARNING_1("PLT_FileMediaServer::OnBrowse - BROWSEDIRECTCHILDREN failed for item %s", dir.GetChars());
+ action->SetError(800, "Can't retrieve info " + dir);
+ return NPT_FAILURE;
+ }
+
+ if (info.m_Type != NPT_FileInfo::FILE_TYPE_DIRECTORY) {
+ /* error */
+ NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowse - BROWSEDIRECTCHILDREN not allowed on an item.");
+ action->SetError(710, "item is not a container.");
+ return NPT_FAILURE;
+ }
+
+ NPT_String filter;
+ NPT_String startingInd;
+ NPT_String reqCount;
+
+ NPT_CHECK_SEVERE(action->GetArgumentValue("Filter", filter));
+ NPT_CHECK_SEVERE(action->GetArgumentValue("StartingIndex", startingInd));
+ NPT_CHECK_SEVERE(action->GetArgumentValue("RequestedCount", reqCount));
+
+ // in case someone forgot to pass a filter
+ if (filter.GetLength() == 0) filter = "*";
+
+ NPT_UInt32 start_index, req_count;
+ if (NPT_FAILED(startingInd.ToInteger(start_index)) ||
+ NPT_FAILED(reqCount.ToInteger(req_count))) {
+ action->SetError(412, "Precondition failed");
+ return NPT_FAILURE;
+ }
+
+ NPT_List entries;
+ res = NPT_File::ListDirectory(dir, entries, 0, 0);
+ if (NPT_FAILED(res)) {
+ NPT_LOG_WARNING_1("PLT_FileMediaServer::OnBrowseDirectChildren - failed to open dir %s", (const char*) dir);
+ return res;
+ }
+
+ unsigned long cur_index = 0;
+ unsigned long num_returned = 0;
+ unsigned long total_matches = 0;
+ NPT_String didl = didl_header;
+
+ PLT_MediaObjectReference item;
+ for (NPT_List::Iterator it = entries.GetFirstItem();
+ it;
+ ++it) {
+ NPT_String filepath = NPT_FilePath::Create(dir, *it);
+
+ // verify we want to process this file first
+ if (!ProcessFile(filepath)) continue;
+
+ item = BuildFromFilePath(
+ filepath,
+ context,
+ true);
+
+ if (!item.IsNull()) {
+ if ((cur_index >= start_index) && ((num_returned < req_count) || (req_count == 0))) {
+ NPT_String tmp;
+ NPT_CHECK_SEVERE(PLT_Didl::ToDidl(*item.AsPointer(), filter, tmp));
+
+ didl += tmp;
+ num_returned++;
+ }
+ cur_index++;
+ total_matches++;
+ }
+ };
+
+ didl += didl_footer;
+
+ NPT_CHECK_SEVERE(action->SetArgumentValue("Result", didl));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("NumberReturned", NPT_String::FromInteger(num_returned)));
+ NPT_CHECK_SEVERE(action->SetArgumentValue("TotalMatches", NPT_String::FromInteger(total_matches))); // 0 means we don't know how many we have but most browsers don't like that!!
+ NPT_CHECK_SEVERE(action->SetArgumentValue("UpdateId", "1"));
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::GetFilePath
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_FileMediaServer::GetFilePath(const char* object_id,
+ NPT_String& filepath)
+{
+ if (!object_id) return NPT_ERROR_INVALID_PARAMETERS;
+
+ filepath = m_Path;
+
+ if (NPT_StringLength(object_id) > 2 || object_id[0]!='0') {
+ filepath += (const char*)object_id + (object_id[0]=='0'?1:0);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::BuildResourceUri
++---------------------------------------------------------------------*/
+NPT_String
+PLT_FileMediaServer::BuildResourceUri(const NPT_HttpUrl& base_uri,
+ const char* host,
+ const char* file_path)
+{
+ NPT_String result;
+ NPT_HttpUrl uri = base_uri;
+
+ if (host) uri.SetHost(host);
+
+ if (file_path) {
+ NPT_HttpUrlQuery query(uri.GetQuery());
+ query.AddField("path", file_path);
+ uri.SetQuery(query.ToString());
+ }
+
+ // 360 hack: force inclusion of port
+ result = uri.ToStringWithDefaultPort(0);
+
+ // 360 hack: it removes the query, so we make it look like a path
+ // and we replace + with urlencoded value of space
+ result.Replace('?', "%3F");
+ result.Replace('+', "%20");
+ return result;
+}
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer::BuildFromFilePath
++---------------------------------------------------------------------*/
+PLT_MediaObject*
+PLT_FileMediaServer::BuildFromFilePath(const NPT_String& filepath,
+ const PLT_HttpRequestContext& context,
+ bool with_count /* = true */,
+ bool keep_extension_in_title /* = false */)
+{
+ NPT_String root = m_Path;
+ PLT_MediaItemResource resource;
+ PLT_MediaObject* object = NULL;
+
+ NPT_LOG_INFO_1("Building didl for file '%s'", (const char*)filepath);
+
+ /* retrieve the entry type (directory or file) */
+ NPT_FileInfo info;
+ NPT_CHECK_LABEL_FATAL(NPT_File::GetInfo(filepath, &info), failure);
+
+ if (info.m_Type == NPT_FileInfo::FILE_TYPE_REGULAR) {
+ object = new PLT_MediaItem();
+
+ /* Set the title using the filename for now */
+ object->m_Title = NPT_FilePath::BaseName(filepath, keep_extension_in_title);
+ if (object->m_Title.GetLength() == 0) goto failure;
+
+ /* make sure we return something with a valid mimetype */
+ if (NPT_StringsEqual(PLT_MediaItem::GetMimeType(filepath), "application/unknown"))
+ goto failure;
+
+ /* Set the protocol Info from the extension */
+ resource.m_ProtocolInfo = PLT_MediaItem::GetProtInfo(filepath, context);
+ if (resource.m_ProtocolInfo.GetLength() == 0) goto failure;
+
+ /* Set the resource file size */
+ resource.m_Size = info.m_Size;
+
+ /* format the resource URI */
+ NPT_String url = filepath.SubString(root.GetLength()+1);
+
+ // get list of ip addresses
+ NPT_List ips;
+ NPT_CHECK_LABEL_SEVERE(PLT_UPnPMessageHelper::GetIPAddresses(ips), failure);
+
+ // if we're passed an interface where we received the request from
+ // move the ip to the top
+ if (context.GetLocalAddress().GetIpAddress().ToString() != "0.0.0.0") {
+ ips.Remove(context.GetLocalAddress().GetIpAddress().ToString());
+ ips.Insert(ips.GetFirstItem(), context.GetLocalAddress().GetIpAddress().ToString());
+ }
+
+ // iterate through list and build list of resources
+ NPT_List::Iterator ip = ips.GetFirstItem();
+
+ /* Look to see if a metadatahandler exists for this extension */
+ PLT_MetadataHandler* handler = NULL;
+ NPT_Result res = NPT_ContainerFind(
+ m_MetadataHandlers,
+ PLT_MetadataHandlerFinder(NPT_FilePath::FileExtension(filepath)),
+ handler);
+ if (NPT_SUCCEEDED(res) && handler) {
+ /* if it failed loading data, reset the metadatahandler so we don't use it */
+ if (NPT_SUCCEEDED(handler->LoadFile(filepath))) {
+ /* replace the title with the one from the Metadata */
+ NPT_String newTitle;
+ if (handler->GetTitle(newTitle) != NULL) {
+ object->m_Title = newTitle;
+ }
+
+ /* assign description */
+ handler->GetDescription(object->m_Description.long_description);
+
+ /* assign album art uri if we haven't yet */
+ /* prepend the album art base URI and url encode it */
+ if (object->m_ExtraInfo.album_art_uri.GetLength() == 0) {
+ object->m_ExtraInfo.album_art_uri =
+ NPT_Uri::PercentEncode(BuildResourceUri(m_AlbumArtBaseUri, *ip, url),
+ NPT_Uri::UnsafeCharsToEncode);
+ }
+
+ /* duration */
+ handler->GetDuration(resource.m_Duration);
+
+ /* protection */
+ handler->GetProtection(resource.m_Protection);
+ }
+ }
+
+ object->m_ObjectClass.type = PLT_MediaItem::GetUPnPClass(filepath, context);
+
+ while (ip) {
+ /* prepend the base URI and url encode it */
+ //resource.m_Uri = NPT_Uri::Encode(uri.ToString(), NPT_Uri::UnsafeCharsToEncode);
+ resource.m_Uri = BuildResourceUri(m_FileBaseUri, *ip, url);
+ object->m_Resources.Add(resource);
+ ++ip;
+ }
+ } else {
+ object = new PLT_MediaContainer;
+
+ /* Assign a title for this container */
+ if (filepath.Compare(root, true) == 0) {
+ object->m_Title = "Root";
+ } else {
+ object->m_Title = NPT_FilePath::BaseName(filepath, keep_extension_in_title);
+ if (object->m_Title.GetLength() == 0) goto failure;
+ }
+
+ /* Get the number of children for this container */
+ NPT_Cardinal count = 0;
+ if (with_count && NPT_SUCCEEDED(NPT_File::GetCount(filepath, count))) {
+ ((PLT_MediaContainer*)object)->m_ChildrenCount = count;
+ }
+
+ object->m_ObjectClass.type = "object.container.storageFolder";
+ }
+
+ /* is it the root? */
+ if (filepath.Compare(root, true) == 0) {
+ object->m_ParentID = "-1";
+ object->m_ObjectID = "0";
+ } else {
+ NPT_String directory = NPT_FilePath::DirectoryName(filepath);
+ /* is the parent path the root? */
+ if (directory.GetLength() == root.GetLength()) {
+ object->m_ParentID = "0";
+ } else {
+ object->m_ParentID = "0" + filepath.SubString(root.GetLength(), directory.GetLength() - root.GetLength());
+ }
+ object->m_ObjectID = "0" + filepath.SubString(root.GetLength());
+ }
+
+ return object;
+
+failure:
+ delete object;
+ return NULL;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltFileMediaServer.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,118 @@
+/*****************************************************************
+|
+| Platinum - File Media Server
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_FILE_MEDIA_SERVER_H_
+#define _PLT_FILE_MEDIA_SERVER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaServer.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define MAX_PATH_LENGTH 1024
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_MetadataHandler;
+
+/*----------------------------------------------------------------------
+| PLT_FileMediaServer class
++---------------------------------------------------------------------*/
+class PLT_FileMediaServer : public PLT_MediaServer
+{
+public:
+ PLT_FileMediaServer(const char* path,
+ const char* friendly_name,
+ bool show_ip = false,
+ const char* uuid = NULL,
+ NPT_UInt16 port = 0,
+ bool port_rebind = false);
+
+ // overridable
+ virtual NPT_Result AddMetadataHandler(PLT_MetadataHandler* handler);
+ virtual NPT_Result ExtractResourcePath(const NPT_HttpUrl& url, NPT_String& file_path);
+ virtual NPT_String BuildResourceUri(const NPT_HttpUrl& base_uri, const char* host, const char* file_path);
+
+protected:
+ virtual ~PLT_FileMediaServer();
+
+ // overridable
+ virtual NPT_Result ProcessFileRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+ // PLT_DeviceHost methods
+ virtual NPT_Result SetupDevice();
+ virtual NPT_Result ProcessHttpRequest(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+ virtual NPT_Result ProcessGetDescription(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response);
+ // PLT_MediaServer methods
+ virtual NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result ServeFile(NPT_HttpRequest& request,
+ const NPT_HttpRequestContext& context,
+ NPT_HttpResponse& response,
+ const NPT_String& file_path);
+ virtual NPT_Result OnAlbumArtRequest(NPT_HttpResponse& response,
+ NPT_String file_path);
+ virtual NPT_Result GetFilePath(const char* object_id, NPT_String& filepath);
+ virtual bool ProcessFile(const NPT_String&) { return true;}
+ virtual PLT_MediaObject* BuildFromFilePath(const NPT_String& filepath,
+ const PLT_HttpRequestContext& context,
+ bool with_count = true,
+ bool keep_extension_in_title = false);
+
+public:
+ NPT_UInt16 m_FileServerPort;
+
+protected:
+ friend class PLT_MediaItem;
+
+ NPT_String m_Path;
+ NPT_HttpUrl m_FileBaseUri;
+ NPT_HttpUrl m_AlbumArtBaseUri;
+ NPT_List m_MetadataHandlers;
+};
+
+#endif /* _PLT_FILE_MEDIA_SERVER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaBrowser.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,314 @@
+/*****************************************************************
+|
+| Platinum - AV Media Browser (Media Server Control Point)
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaBrowser.h"
+#include "PltDidl.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.browser")
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::PLT_MediaBrowser
++---------------------------------------------------------------------*/
+PLT_MediaBrowser::PLT_MediaBrowser(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaBrowserDelegate* delegate /* = NULL */) :
+ m_CtrlPoint(ctrl_point),
+ m_Delegate(delegate)
+{
+ m_CtrlPoint->AddListener(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::~PLT_MediaBrowser
++---------------------------------------------------------------------*/
+PLT_MediaBrowser::~PLT_MediaBrowser()
+{
+ m_CtrlPoint->RemoveListener(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnDeviceAdded
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnDeviceAdded(PLT_DeviceDataReference& device)
+{
+ // verify the device implements the function we need
+ PLT_Service* serviceCDS;
+ PLT_Service* serviceCMR;
+ NPT_String type;
+
+ type = "urn:schemas-upnp-org:service:ContentDirectory:1";
+ if (NPT_FAILED(device->FindServiceByType(type, serviceCDS))) {
+ NPT_LOG_WARNING_2("Service %s not found in device \"%s\"",
+ type.GetChars(),
+ device->GetFriendlyName().GetChars());
+ return NPT_FAILURE;
+ }
+
+ type = "urn:schemas-upnp-org:service:ConnectionManager:1";
+ if (NPT_FAILED(device->FindServiceByType(type, serviceCMR))) {
+ NPT_LOG_WARNING_2("Service %s not found in device \"%s\"",
+ type.GetChars(),
+ device->GetFriendlyName().GetChars());
+ return NPT_FAILURE;
+ }
+
+ {
+ NPT_AutoLock lock(m_MediaServers);
+
+ PLT_DeviceDataReference data;
+ NPT_String uuid = device->GetUUID();
+ // is it a new device?
+ if (NPT_SUCCEEDED(NPT_ContainerFind(m_MediaServers, PLT_DeviceDataFinder(uuid), data))) {
+ NPT_LOG_WARNING_1("Device (%s) is already in our list!", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE("Device Found:");
+ device->ToLog(NPT_LOG_LEVEL_FINE);
+
+ m_MediaServers.Add(device);
+ }
+
+ if (m_Delegate && m_Delegate->OnMSAdded(device)) {
+ m_CtrlPoint->Subscribe(serviceCDS);
+ m_CtrlPoint->Subscribe(serviceCMR);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnDeviceRemoved
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnDeviceRemoved(PLT_DeviceDataReference& device)
+{
+ PLT_DeviceDataReference data;
+
+ {
+ NPT_AutoLock lock(m_MediaServers);
+
+ // only release if we have kept it around
+ NPT_String uuid = device->GetUUID();
+ // is it a new device?
+ if (NPT_FAILED(NPT_ContainerFind(m_MediaServers, PLT_DeviceDataFinder(uuid), data))) {
+ NPT_LOG_WARNING_1("Device (%s) not found in our list!", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+
+ NPT_LOG_FINE("Device Removed:");
+ device->ToLog(NPT_LOG_LEVEL_FINE);
+
+ m_MediaServers.Remove(device);
+ }
+
+ if (m_Delegate) {
+ m_Delegate->OnMSRemoved(device);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::Browse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::Browse(PLT_DeviceDataReference& device,
+ const char* obj_id,
+ NPT_UInt32 start_index,
+ NPT_UInt32 count,
+ bool browse_metadata,
+ const char* filter,
+ const char* sort_criteria,
+ void* userdata)
+{
+ // look for the service
+ PLT_Service* service;
+ NPT_String type;
+
+ type = "urn:schemas-upnp-org:service:ContentDirectory:1";
+ if (NPT_FAILED(device->FindServiceByType(type, service))) {
+ NPT_LOG_WARNING_1("Service %s not found", (const char*)type);
+ return NPT_FAILURE;
+ }
+
+ PLT_ActionDesc* action_desc = service->FindActionDesc("Browse");
+ if (action_desc == NULL) {
+ NPT_LOG_WARNING("Action Browse not found in service");
+ return NPT_FAILURE;
+ }
+
+ PLT_ActionReference action(new PLT_Action(action_desc));
+
+ // Set the object id
+ PLT_Arguments args;
+ if (NPT_FAILED(action->SetArgumentValue("ObjectID", obj_id))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the browse_flag
+ if (NPT_FAILED(action->SetArgumentValue("BrowseFlag", browse_metadata?"BrowseMetadata":"BrowseDirectChildren"))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Filter
+ if (NPT_FAILED(action->SetArgumentValue("Filter", filter))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Starting Index
+ if (NPT_FAILED(action->SetArgumentValue("StartingIndex", NPT_String::FromInteger(start_index)))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Requested Count
+ if (NPT_FAILED(action->SetArgumentValue("RequestedCount", NPT_String::FromInteger(count)))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // set the Requested Count
+ if (NPT_FAILED(action->SetArgumentValue("SortCriteria", sort_criteria))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ // invoke the action
+ if (NPT_FAILED(m_CtrlPoint->InvokeAction(action, userdata))) {
+ return NPT_ERROR_INVALID_PARAMETERS;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnActionResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata)
+{
+ if (m_Delegate == NULL) return NPT_SUCCESS;
+
+ PLT_DeviceDataReference device;
+ {
+ NPT_AutoLock lock(m_MediaServers);
+ NPT_String uuid = action->GetActionDesc()->GetService()->GetDevice()->GetUUID();
+ if (NPT_FAILED(NPT_ContainerFind(m_MediaServers, PLT_DeviceDataFinder(uuid), device))) {
+ NPT_LOG_WARNING_1("Device (%s) not found in our list of servers", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+ }
+
+ NPT_String actionName = action->GetActionDesc()->GetName();
+
+ // Browse action response
+ if (actionName.Compare("Browse", true) == 0) {
+ return OnBrowseResponse(res, device, action, userdata);
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnBrowseResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnBrowseResponse(NPT_Result res, PLT_DeviceDataReference& device, PLT_ActionReference& action, void* userdata)
+{
+ NPT_String value;
+ PLT_BrowseInfo info;
+ NPT_String unescaped;
+
+ if (NPT_FAILED(res) || action->GetErrorCode() != 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(action->GetArgumentValue("ObjectID", info.object_id))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("UpdateID", value)) ||
+ value.GetLength() == 0 ||
+ NPT_FAILED(value.ToInteger(info.uid))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("NumberReturned", value)) ||
+ value.GetLength() == 0 ||
+ NPT_FAILED(value.ToInteger(info.nr))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("TotalMatches", value)) ||
+ value.GetLength() == 0 ||
+ NPT_FAILED(value.ToInteger(info.tm))) {
+ goto bad_action;
+ }
+ if (NPT_FAILED(action->GetArgumentValue("Result", value)) ||
+ value.GetLength() == 0) {
+ goto bad_action;
+ }
+
+ if (NPT_FAILED(PLT_Didl::FromDidl(value, info.items))) {
+ goto bad_action;
+ }
+
+ m_Delegate->OnBrowseResult(NPT_SUCCESS, device, &info, userdata);
+ return NPT_SUCCESS;
+
+bad_action:
+ m_Delegate->OnBrowseResult(NPT_FAILURE, device, NULL, userdata);
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser::OnEventNotify
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaBrowser::OnEventNotify(PLT_Service* service, NPT_List* vars)
+{
+ if (!m_Delegate) return NPT_SUCCESS;
+
+ PLT_DeviceDataReference data;
+
+ {
+ NPT_AutoLock lock(m_MediaServers);
+ NPT_String uuid = service->GetDevice()->GetUUID();
+ if (NPT_FAILED(NPT_ContainerFind(m_MediaServers, PLT_DeviceDataFinder(uuid), data))) {
+ NPT_LOG_WARNING_1("Device (%s) not found in our list!", (const char*)uuid);
+ return NPT_FAILURE;
+ }
+ }
+
+ if (m_Delegate) m_Delegate->OnMSStateVariablesChanged(service, vars);
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaBrowser.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,123 @@
+/*****************************************************************
+|
+| Platinum - AV Media Browser (Media Server Control Point)
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_BROWSER_H_
+#define _PLT_MEDIA_BROWSER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltCtrlPoint.h"
+#include "PltMediaItem.h"
+
+/*----------------------------------------------------------------------
+| PLT_BrowseInfo
++---------------------------------------------------------------------*/
+struct PLT_BrowseInfo {
+ NPT_String object_id;
+ PLT_MediaObjectListReference items;
+ NPT_UInt32 nr;
+ NPT_UInt32 tm;
+ NPT_UInt32 uid;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowserDelegate class
++---------------------------------------------------------------------*/
+class PLT_MediaBrowserDelegate
+{
+public:
+ virtual ~PLT_MediaBrowserDelegate() {}
+
+ virtual bool OnMSAdded(PLT_DeviceDataReference& /* device */) { return true; }
+ virtual void OnMSRemoved(PLT_DeviceDataReference& /* device */) {}
+ virtual void OnMSStateVariablesChanged(
+ PLT_Service* /*service*/,
+ NPT_List* /*vars*/) {}
+
+ // ContentDirectory
+ virtual void OnBrowseResult(
+ NPT_Result /*res*/,
+ PLT_DeviceDataReference& /*device*/,
+ PLT_BrowseInfo* /*info*/,
+ void* /*userdata*/) {}
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaBrowser class
++---------------------------------------------------------------------*/
+class PLT_MediaBrowser : public PLT_CtrlPointListener
+{
+public:
+ PLT_MediaBrowser(PLT_CtrlPointReference& ctrl_point,
+ PLT_MediaBrowserDelegate* delegate = NULL);
+ virtual ~PLT_MediaBrowser();
+
+ // ContentDirectory service
+ virtual NPT_Result Browse(PLT_DeviceDataReference& device,
+ const char* object_id,
+ NPT_UInt32 start_index,
+ NPT_UInt32 count,
+ bool browse_metadata = false,
+ const char* filter = "*",
+ const char* sort_criteria = "",
+ void* userdata = NULL);
+
+ // accessor methods
+ virtual const NPT_Lock& GetMediaServers() {
+ return m_MediaServers;
+ }
+ virtual void SetDelegate(PLT_MediaBrowserDelegate* delegate) {
+ m_Delegate = delegate;
+ }
+
+protected:
+ // PLT_CtrlPointListener methods
+ virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device);
+ virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device);
+ virtual NPT_Result OnActionResponse(NPT_Result res, PLT_ActionReference& action, void* userdata);
+ virtual NPT_Result OnEventNotify(PLT_Service* service, NPT_List* vars);
+
+ // ContentDirectory service responses
+ virtual NPT_Result OnBrowseResponse(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_ActionReference& action,
+ void* userdata);
+
+protected:
+ PLT_CtrlPointReference m_CtrlPoint;
+ PLT_MediaBrowserDelegate* m_Delegate;
+ NPT_Lock m_MediaServers;
+};
+
+#endif /* _PLT_MEDIA_BROWSER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaCache.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaCache.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,155 @@
+/*****************************************************************
+|
+| Platinum - AV Media Cache
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMediaCache.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.cache")
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::PLT_MediaCache
++---------------------------------------------------------------------*/
+PLT_MediaCache::PLT_MediaCache()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::~PLT_MediaCache
++---------------------------------------------------------------------*/
+PLT_MediaCache::~PLT_MediaCache()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::GenerateKey
++---------------------------------------------------------------------*/
+NPT_String
+PLT_MediaCache::GenerateKey(const char* device_uuid,
+ const char* item_id)
+{
+ NPT_String key = "upnp://";
+ key += device_uuid;
+ key += "/";
+ key += item_id;
+
+ return key;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::Clear
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaCache::Clear(const char* device_uuid,
+ const char* item_id)
+{
+ NPT_AutoLock lock(m_Mutex);
+
+ NPT_String key = GenerateKey(device_uuid, item_id);
+ if (key.GetLength() == 0) return NPT_ERROR_INVALID_PARAMETERS;
+
+ NPT_List::Iterator entries = m_Items.GetEntries().GetFirstItem();
+ NPT_List::Iterator entry;
+ while (entries) {
+ entry = entries++;
+ if ((*entry)->GetKey() == (key)) {
+ m_Items.Erase(key);
+ return NPT_SUCCESS;
+ }
+ }
+
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::Clear
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaCache::Clear(const char* device_uuid)
+{
+ NPT_AutoLock lock(m_Mutex);
+
+ if (!device_uuid) return m_Items.Clear();
+
+ NPT_String key = GenerateKey(device_uuid, "");
+ NPT_List::Iterator entries = m_Items.GetEntries().GetFirstItem();
+ NPT_List::Iterator entry;
+ while (entries) {
+ entry = entries++;
+ NPT_String entry_key = (*entry)->GetKey();
+ if (entry_key.StartsWith(key)) {
+ m_Items.Erase(entry_key);
+ }
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::Put
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaCache::Put(const char* device_uuid,
+ const char* item_id,
+ PLT_MediaObjectListReference& list)
+{
+ NPT_AutoLock lock(m_Mutex);
+
+ NPT_String key = GenerateKey(device_uuid, item_id);
+ if (key.GetLength() == 0) return NPT_ERROR_INVALID_PARAMETERS;
+
+ m_Items.Erase(key);
+ return m_Items.Put(key, list);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache::Get
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaCache::Get(const char* device_uuid,
+ const char* item_id,
+ PLT_MediaObjectListReference& list)
+{
+ NPT_AutoLock lock(m_Mutex);
+
+ NPT_String key = GenerateKey(device_uuid, item_id);
+ if (key.GetLength() == 0) return NPT_ERROR_INVALID_PARAMETERS;
+
+ PLT_MediaObjectListReference* val = NULL;
+ NPT_CHECK_FINE(m_Items.Get(key, val));
+
+ list = *val;
+ return NPT_SUCCESS;
+}
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaCache.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaCache.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,75 @@
+/*****************************************************************
+|
+| Platinum - AV Media Cache
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_CACHE_H_
+#define _PLT_MEDIA_CACHE_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaItem.h"
+#include "PltDeviceData.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------
+| typedefs
++---------------------------------------------------------------------*/
+typedef NPT_Map::Entry PLT_MediaCacheEntry;
+
+/*----------------------------------------------------------------------
+| PLT_MediaCache class
++---------------------------------------------------------------------*/
+class PLT_MediaCache
+{
+public:
+ PLT_MediaCache();
+ virtual ~PLT_MediaCache();
+
+ NPT_Result Put(const char* device_uuid, const char* item_id, PLT_MediaObjectListReference& list);
+ NPT_Result Get(const char* device_uuid, const char* item_id, PLT_MediaObjectListReference& list);
+ NPT_Result Clear(const char* device_uuid, const char* item_id);
+ NPT_Result Clear(const char* device_uuid = NULL);
+
+private:
+ NPT_String GenerateKey(const char* device_uuid, const char* item_id);
+
+private:
+ NPT_Mutex m_Mutex;
+ NPT_Map m_Items;
+};
+
+#endif /* _PLT_MEDIA_CACHE_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaItem.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,701 @@
+/*****************************************************************
+|
+| Platinum - AV Media Item
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMediaItem.h"
+#include "PltMediaServer.h"
+#include "PltMetadataHandler.h"
+#include "PltDidl.h"
+#include "PltXmlHelper.h"
+#include "PltService.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.item")
+
+extern const char* didl_namespace_dc;
+extern const char* didl_namespace_upnp;
+
+/*----------------------------------------------------------------------
+| PLT_PersonRoles::AddPerson
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PersonRoles::Add(const NPT_String& name, const NPT_String& role /* = "" */)
+{
+ PLT_PersonRole person;
+ person.name = name;
+ person.role = role;
+
+ return NPT_List::Add(person);
+}
+
+/*----------------------------------------------------------------------
+| PLT_PersonRoles::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PersonRoles::ToDidl(NPT_String& didl, const NPT_String& tag)
+{
+ NPT_String tmp;
+ for (NPT_List::Iterator it =
+ NPT_List::GetFirstItem(); it; it++) {
+ // if there's an empty artist, allow it only if there's nothing else
+ if (it->name.IsEmpty() && m_ItemCount>1 && !tmp.IsEmpty()) continue;
+
+ tmp += "role.IsEmpty()) {
+ tmp += " role=\"";
+ PLT_Didl::AppendXmlEscape(tmp, it->role);
+ tmp += "\"";
+ }
+ tmp += ">";
+ PLT_Didl::AppendXmlEscape(tmp, it->name);
+ tmp += "";
+ }
+
+ didl += tmp;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_PersonRoles::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_PersonRoles::FromDidl(const NPT_Array& nodes)
+{
+ for (NPT_Cardinal i=0; iGetText();
+ const NPT_String* role = nodes[i]->GetAttribute("role");
+ if (name) person.name = *name;
+ if (role) person.role = *role;
+ NPT_CHECK(NPT_List::Add(person));
+ }
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItemResource::PLT_MediaItemResource
++---------------------------------------------------------------------*/
+PLT_MediaItemResource::PLT_MediaItemResource()
+{
+ m_Uri = "";
+ m_ProtocolInfo = "";
+ m_Duration = (NPT_UInt32)-1;
+ m_Size = (NPT_Size)-1;
+ m_Protection = "";
+ m_Bitrate = (NPT_UInt32)-1;
+ m_BitsPerSample = (NPT_UInt32)-1;
+ m_SampleFrequency = (NPT_UInt32)-1;
+ m_NbAudioChannels = (NPT_UInt32)-1;
+ m_Resolution = "";
+ m_ColorDepth = (NPT_UInt32)-1;
+}
+
+/*----------------------------------------------------------------------
+| PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry
++---------------------------------------------------------------------*/
+typedef struct PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry {
+ const char* mime_type;
+ const char* dlna_ext;
+} PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry ;
+
+static const PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry
+PLT_HttpFileRequestHandler_DefaultDlnaMap[] = {
+ {"image/gif", "DLNA.ORG_PN=GIF_LRG"},
+ {"image/jpeg", "DLNA.ORG_PN=JPEG_LRG"},
+ {"image/jp2", "DLNA.ORG_PN=JPEG_LRG"},
+ {"image/png", "DLNA.ORG_PN=PNG_LRG"},
+ {"image/bmp", "DLNA.ORG_PN=BMP_LRG"},
+ {"image/tiff", "DLNA.ORG_PN=TIFF_LRG"},
+ {"audio/mpeg", "DLNA.ORG_PN=MP3;DLNA.ORG_OP=01;DLNA.ORG_CI=0"},
+ {"audio/mp4", "DLNA.ORG_PN=AAC_ISO_320;DLNA.ORG_OP=01;DLNA.ORG_CI=0"},
+ {"audio/x-ms-wma", "DLNA.ORG_PN=WMABASE;DLNA.ORG_OP=01;DLNA.ORG_CI=0"},
+ {"audio/x-wav", "DLNA.ORG_PN=WAV;DLNA.ORG_OP=01;DLNA.ORG_CI=0"},
+ {"video/avi", "DLNA.ORG_PN=AVI;DLNA.ORG_OP=01;DLNA.ORG_CI=0"},
+ {"video/mp4", "DLNA.ORG_PN=MPEG4_P2_SP_AAC;DLNA.ORG_CI=0"},
+ {"video/mpeg", "DLNA.ORG_PN=MPEG_PS_PAL;DLNA.ORG_OP=01;DLNA.ORG_CI=0"},
+ {"video/x-ms-wmv", "DLNA.ORG_PN=WMVMED_FULL;DLNA.ORG_OP=01;DLNA.ORG_CI=0"},
+ {"video/x-ms-asf", "DLNA.ORG_OP=01;DLNA.ORG_CI=0"}
+};
+
+static const PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry
+PLT_HttpFileRequestHandler_360DlnaMap[] = {
+ {"video/mp4", "DLNA.ORG_OP=01;DLNA.ORG_CI=0"}
+};
+
+static const PLT_HttpFileRequestHandler_DefaultDlnaExtMapEntry
+PLT_HttpFileRequestHandler_PS3DlnaMap[] = {
+ {"image/jpg", "DLNA.ORG_OP=01"},
+ {"image/png", "DLNA.ORG_OP=01"}
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaObject::GetMimeType
++---------------------------------------------------------------------*/
+const char*
+PLT_MediaObject::GetMimeType(const NPT_String& filename)
+{
+ int last_dot = filename.ReverseFind('.');
+ if (last_dot > 0) {
+ NPT_String extension = filename.GetChars()+last_dot+1;
+ extension.MakeLowercase();
+
+ for (unsigned int i=0; iFind("XBox", 0, true) >= 0 || agent->Find("Xenon", 0, true) >= 0)) {
+ for (unsigned int i=0; iFind("PLAYSTATION 3", 0, true) >= 0) {
+ for (unsigned int i=0; i";
+ PLT_Didl::AppendXmlEscape(didl, m_Title);
+ didl += "";
+
+ // creator
+ if (mask & PLT_FILTER_MASK_CREATOR && !m_Creator.IsEmpty()) {
+ didl += "";
+ PLT_Didl::AppendXmlEscape(didl, m_Creator);
+ didl += "";
+ }
+
+ // date
+ if (mask & PLT_FILTER_MASK_DATE && !m_Date.IsEmpty()) {
+ didl += "";
+ PLT_Didl::AppendXmlEscape(didl, m_Date);
+ didl += "";
+ }
+
+ // artist
+ if (mask & PLT_FILTER_MASK_ARTIST) {
+ // force an empty artist just in case
+ if (m_People.artists.GetItemCount() == 0) m_People.artists.Add("");
+ m_People.artists.ToDidl(didl, "artist");
+ }
+
+ // actor
+ if (mask & PLT_FILTER_MASK_ACTOR) {
+ m_People.actors.ToDidl(didl, "actor");
+ }
+
+ // actor
+ if (mask & PLT_FILTER_MASK_AUTHOR) {
+ m_People.authors.ToDidl(didl, "author");
+ }
+
+ // album
+ if (mask & PLT_FILTER_MASK_ALBUM && !m_Affiliation.album.IsEmpty()) {
+ didl += "";
+ PLT_Didl::AppendXmlEscape(didl, m_Affiliation.album);
+ didl += "";
+ }
+
+ // genre
+ if (mask & PLT_FILTER_MASK_GENRE) {
+ for (NPT_List::Iterator it =
+ m_Affiliation.genre.GetFirstItem(); it; ++it) {
+ didl += "";
+ PLT_Didl::AppendXmlEscape(didl, (*it));
+ didl += "";
+ }
+ }
+
+ // album art URI
+ if (mask & PLT_FILTER_MASK_ALBUMARTURI && !m_ExtraInfo.album_art_uri.IsEmpty()) {
+ didl += "";
+ PLT_Didl::AppendXmlEscape(didl, m_ExtraInfo.album_art_uri);
+ didl += "";
+ }
+
+ // description
+ if (mask & PLT_FILTER_MASK_DESCRIPTION && !m_Description.long_description.IsEmpty()) {
+ didl += "";
+ PLT_Didl::AppendXmlEscape(didl, m_Description.long_description);
+ didl += "";
+ }
+
+ // original track number
+ if (mask & PLT_FILTER_MASK_ORIGINALTRACK && m_MiscInfo.original_track_number > 0) {
+ didl += "";
+ didl += NPT_String::FromInteger(m_MiscInfo.original_track_number);
+ didl += "";
+ }
+
+ // resource
+ if (mask & PLT_FILTER_MASK_RES) {
+ for (NPT_Cardinal i=0; i 0) {
+ // protocol info is required
+ didl += "";
+ PLT_Didl::AppendXmlEscape(didl, m_Resources[i].m_Uri);
+ didl += "";
+ }
+ }
+ }
+
+ // class is required
+ didl += "";
+ PLT_Didl::AppendXmlEscape(didl, m_ObjectClass.type);
+ didl += "";
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObject::FromDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaObject::FromDidl(NPT_XmlElementNode* entry)
+{
+ NPT_String str, xml;
+ NPT_Array children;
+ NPT_Result res;
+
+ // serialize the entry Didl as a we might need to pass it to a renderer
+ res = PLT_XmlHelper::Serialize(*entry, xml);
+ NPT_CHECK_LABEL_SEVERE(res, cleanup);
+
+ m_Didl = didl_header + xml + didl_footer;
+
+ // check if item is restricted (is default true?)
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(entry, "restricted", str))) {
+ m_Restricted = PLT_Service::IsTrue(str);
+ }
+
+ res = PLT_XmlHelper::GetAttribute(entry, "id", m_ObjectID);
+ NPT_CHECK_LABEL_SEVERE(res, cleanup);
+
+ res = PLT_XmlHelper::GetAttribute(entry, "parentID", m_ParentID);
+ NPT_CHECK_LABEL_SEVERE(res, cleanup);
+
+ res = PLT_XmlHelper::GetChildText(entry, "title", m_Title, didl_namespace_dc);
+ NPT_CHECK_LABEL_SEVERE(res, cleanup);
+
+ res = PLT_XmlHelper::GetChildText(entry, "class", m_ObjectClass.type, didl_namespace_upnp);
+ NPT_CHECK_LABEL_SEVERE(res, cleanup);
+
+ // read non-required elements
+ PLT_XmlHelper::GetChildText(entry, "creator", m_Creator, didl_namespace_dc);
+ PLT_XmlHelper::GetChildText(entry, "date", m_Date, didl_namespace_dc);
+
+ PLT_XmlHelper::GetChildren(entry, children, "artist", didl_namespace_upnp);
+ m_People.artists.FromDidl(children);
+
+ PLT_XmlHelper::GetChildText(entry, "album", m_Affiliation.album, didl_namespace_upnp);
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "genre", didl_namespace_upnp);
+ for (NPT_Cardinal i=0; iGetText()) {
+ m_Affiliation.genre.Add(*children[i]->GetText());
+ }
+ }
+
+ PLT_XmlHelper::GetChildText(entry, "albumArtURI", m_ExtraInfo.album_art_uri, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "longDescription", m_Description.long_description, didl_namespace_upnp);
+ PLT_XmlHelper::GetChildText(entry, "originalTrackNumber", str, didl_namespace_upnp);
+ NPT_UInt32 value;
+ if (NPT_FAILED(str.ToInteger(value))) value = 0;
+ m_MiscInfo.original_track_number = value;
+
+ children.Clear();
+ PLT_XmlHelper::GetChildren(entry, children, "res");
+ if (children.GetItemCount() > 0) {
+ for (NPT_Cardinal i=0; iGetText() == NULL) {
+ goto cleanup;
+ }
+
+ resource.m_Uri = *children[i]->GetText();
+ if (NPT_FAILED(PLT_XmlHelper::GetAttribute(children[i], "protocolInfo", resource.m_ProtocolInfo))) {
+ goto cleanup;
+ }
+
+ PLT_XmlHelper::GetAttribute(children[i], "protection", resource.m_Protection);
+ PLT_XmlHelper::GetAttribute(children[i], "resolution", resource.m_Resolution);
+
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(children[i], "size", str))) {
+ if (NPT_FAILED(str.ToInteger(resource.m_Size))) resource.m_Size = (NPT_Size)-1;
+ }
+
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(children[i], "duration", str))) {
+ if (NPT_FAILED(PLT_Didl::ParseTimeStamp(str, resource.m_Duration))) {
+ // if error while converting, ignore and set to -1 to indicate we don't know the duration
+ resource.m_Duration = (NPT_UInt32)-1;
+ }
+ }
+ m_Resources.Add(resource);
+ }
+ }
+
+ return NPT_SUCCESS;
+
+cleanup:
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObjectList::PLT_MediaObjectList
++---------------------------------------------------------------------*/
+PLT_MediaObjectList::PLT_MediaObjectList()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaObjectList::~PLT_MediaObjectList
++---------------------------------------------------------------------*/
+PLT_MediaObjectList::~PLT_MediaObjectList()
+{
+ Apply(NPT_ObjectDeleter());
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem::PLT_MediaItem
++---------------------------------------------------------------------*/
+PLT_MediaItem::PLT_MediaItem()
+{
+ Reset();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem::~PLT_MediaItem
++---------------------------------------------------------------------*/
+PLT_MediaItem::~PLT_MediaItem()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaItem::ToDidl(NPT_UInt32 mask, NPT_String& didl)
+{
+ NPT_String tmp;
+ // Allocate enough space for a big string we're going to concatenate in
+ tmp.Reserve(2048);
+
+ tmp = "- ";
+
+ NPT_CHECK_SEVERE(PLT_MediaObject::ToDidl(mask, tmp));
+
+ /* close tag */
+ tmp += "
";
+
+ didl += tmp;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem::FromDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaItem::FromDidl(NPT_XmlElementNode* entry)
+{
+ /* reset first */
+ Reset();
+
+ if (entry->GetTag().Compare("item", true) != 0)
+ return NPT_ERROR_INTERNAL;
+
+ return PLT_MediaObject::FromDidl(entry);
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::PLT_MediaContainer
++---------------------------------------------------------------------*/
+PLT_MediaContainer::PLT_MediaContainer()
+{
+ Reset();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::~PLT_MediaContainer
++---------------------------------------------------------------------*/
+PLT_MediaContainer::~PLT_MediaContainer(void)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::Reset
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaContainer::Reset()
+{
+ m_SearchClasses.Clear();
+ m_Searchable = true;
+ m_ChildrenCount = -1;
+
+ return PLT_MediaObject::Reset();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::ToDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaContainer::ToDidl(NPT_UInt32 mask, NPT_String& didl)
+{
+ NPT_String tmp;
+ // Allocate enough space for a big string we're going to concatenate in
+ tmp.Reserve(2048);
+
+ tmp = "";
+
+ NPT_CHECK_SEVERE(PLT_MediaObject::ToDidl(mask, tmp));
+
+ /* close tag */
+ tmp += "";
+
+ didl += tmp;
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer::FromDidl
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaContainer::FromDidl(NPT_XmlElementNode* entry)
+{
+ NPT_String str;
+
+ /* reset first */
+ Reset();
+
+ // check entry type
+ if (entry->GetTag().Compare("Container", true) != 0)
+ return NPT_ERROR_INTERNAL;
+
+ // check if item is searchable (is default true?)
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(entry, "searchable", str))) {
+ m_Searchable = PLT_Service::IsTrue(str);
+ }
+
+ // look for childCount
+ if (NPT_SUCCEEDED(PLT_XmlHelper::GetAttribute(entry, "childCount", str))) {
+ NPT_UInt32 count;
+ NPT_CHECK_SEVERE(str.ToInteger(count));
+ m_ChildrenCount = count;
+ }
+
+ return PLT_MediaObject::FromDidl(entry);
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaItem.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaItem.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,262 @@
+/*****************************************************************
+|
+| Platinum - AV Media Item
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_ITEM_H_
+#define _PLT_MEDIA_ITEM_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltHttp.h"
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+class PLT_MediaServer;
+
+/*----------------------------------------------------------------------
+| typedefs
++---------------------------------------------------------------------*/
+typedef struct {
+ NPT_String type;
+ NPT_String friendly_name;
+} PLT_ObjectClass;
+
+typedef struct {
+ NPT_String type;
+ NPT_String friendly_name;
+ bool include_derived;
+} PLT_SearchClass;
+
+typedef struct {
+ NPT_String name;
+ NPT_String role;
+} PLT_PersonRole;
+
+class PLT_PersonRoles : public NPT_List
+{
+public:
+ NPT_Result Add(const NPT_String& name, const NPT_String& role = "");
+ NPT_Result ToDidl(NPT_String& didl, const NPT_String& tag);
+ NPT_Result FromDidl(const NPT_Array& nodes);
+};
+
+typedef struct {
+ NPT_String allowed_use; // (CSV)
+ NPT_String validity_start;
+ NPT_String validity_end;
+ NPT_String remaining_time;
+ NPT_String usage_info;
+ NPT_String rights_info_uri;
+ NPT_String content_info_uri;
+} PLT_Constraint;
+
+typedef struct {
+ PLT_PersonRoles artists;
+ PLT_PersonRoles actors;
+ PLT_PersonRoles authors;
+ NPT_String producer;
+ NPT_String director;
+ NPT_String publisher;
+ NPT_String contributor; // should match m_Creator (dc:creator)
+} PLT_PeopleInfo;
+
+typedef struct {
+ NPT_List genre;
+ NPT_String album;
+ NPT_String playlist; // dc:title of the playlist item the content belongs too
+} PLT_AffiliationInfo;
+
+typedef struct {
+ NPT_String description;
+ NPT_String long_description;
+ NPT_String icon_uri;
+ NPT_String region;
+ NPT_String rating;
+ NPT_String rights;
+ NPT_String date;
+ NPT_String language;
+} PLT_Description;
+
+typedef struct {
+ NPT_String album_art_uri;
+ NPT_String album_art_uri_dlna_profile;
+ NPT_String artist_discography_uri;
+ NPT_String lyrics_uri;
+ NPT_List relation; // dc:relation
+} PLT_ExtraInfo;
+
+typedef struct {
+ NPT_UInt32 dvdregioncode;
+ NPT_UInt32 original_track_number;
+ NPT_String toc;
+ NPT_String user_annotation;
+} PLT_MiscInfo;
+
+typedef struct {
+ int total;
+ int used;
+ int free;
+ int max_partition;
+ NPT_String medium;
+} PLT_StorageInfo;
+
+/*----------------------------------------------------------------------
+| PLT_MediaItemResource class
++---------------------------------------------------------------------*/
+class PLT_MediaItemResource
+{
+public:
+ PLT_MediaItemResource();
+ ~PLT_MediaItemResource() {}
+
+ NPT_String m_Uri;
+ NPT_String m_ProtocolInfo;
+ NPT_UInt32 m_Duration; /* seconds */
+ NPT_LargeSize m_Size;
+ NPT_String m_Protection;
+ NPT_UInt32 m_Bitrate; /* bytes/seconds */
+ NPT_UInt32 m_BitsPerSample;
+ NPT_UInt32 m_SampleFrequency;
+ NPT_UInt32 m_NbAudioChannels;
+ NPT_String m_Resolution;
+ NPT_UInt32 m_ColorDepth;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaObject class
++---------------------------------------------------------------------*/
+class PLT_MediaObject
+{
+public:
+ PLT_MediaObject() {}
+ virtual ~PLT_MediaObject() {}
+
+ bool IsContainer() { return m_ObjectClass.type.StartsWith("object.container"); }
+
+ static const char* GetMimeType(const NPT_String& filename);
+ static NPT_String GetProtInfo(const char* filename, const PLT_HttpRequestContext& context);
+ static const char* GetUPnPClass(const char* filename, const PLT_HttpRequestContext& context);
+ static const char* GetDlnaExtension(const char* mime_type, const PLT_HttpRequestContext& context);
+
+ virtual NPT_Result Reset();
+ virtual NPT_Result ToDidl(NPT_UInt32 mask, NPT_String& didl);
+ virtual NPT_Result FromDidl(NPT_XmlElementNode* entry);
+
+public:
+ /* common properties */
+ PLT_ObjectClass m_ObjectClass;
+ NPT_String m_ObjectID;
+ NPT_String m_ParentID;
+
+ /* metadata */
+ NPT_String m_Title;
+ NPT_String m_Creator;
+ NPT_String m_Date;
+ PLT_PeopleInfo m_People;
+ PLT_AffiliationInfo m_Affiliation;
+ PLT_Description m_Description;
+
+ /* properties */
+ bool m_Restricted;
+
+ /* extras */
+ PLT_ExtraInfo m_ExtraInfo;
+
+ /* miscellaneous info */
+ PLT_MiscInfo m_MiscInfo;
+
+ /* resources related */
+ NPT_Array m_Resources;
+
+ /* original DIDL for Control Points to pass to a renderer when invoking SetAVTransportURI */
+ NPT_String m_Didl;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaItem class
++---------------------------------------------------------------------*/
+class PLT_MediaItem : public PLT_MediaObject
+{
+public:
+ PLT_MediaItem();
+ virtual ~PLT_MediaItem();
+
+ // PLT_MediaObject methods
+ NPT_Result ToDidl(NPT_UInt32 mask, NPT_String& didl);
+ NPT_Result FromDidl(NPT_XmlElementNode* entry);
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainer class
++---------------------------------------------------------------------*/
+class PLT_MediaContainer : public PLT_MediaObject
+{
+public:
+ PLT_MediaContainer();
+ virtual ~PLT_MediaContainer();
+
+ // PLT_MediaObject methods
+ NPT_Result Reset();
+ NPT_Result ToDidl(NPT_UInt32 mask, NPT_String& didl);
+ NPT_Result FromDidl(NPT_XmlElementNode* entry);
+
+public:
+ NPT_List m_SearchClasses;
+
+ /* properties */
+ bool m_Searchable;
+
+ /* container info related */
+ NPT_Int32 m_ChildrenCount;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaObjectList class
++---------------------------------------------------------------------*/
+class PLT_MediaObjectList : public NPT_List
+{
+public:
+ PLT_MediaObjectList();
+
+protected:
+ virtual ~PLT_MediaObjectList(void);
+ friend class NPT_Reference;
+};
+
+typedef NPT_Reference PLT_MediaObjectListReference;
+typedef NPT_Reference PLT_MediaObjectReference;
+
+
+#endif /* _PLT_MEDIA_ITEM_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaPlaylist.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaPlaylist.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,83 @@
+/*****************************************************************
+|
+| Platinum - AV Media Playlist
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltMediaPlaylist.h"
+
+/*----------------------------------------------------------------------
+| PLT_MediaPlaylist::PLT_MediaPlaylist
++---------------------------------------------------------------------*/
+PLT_MediaPlaylist::PLT_MediaPlaylist()
+{
+ m_List = new PLT_MediaItemList();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaPlaylist::~PLT_MediaPlaylist
++---------------------------------------------------------------------*/
+PLT_MediaPlaylist::~PLT_MediaPlaylist(void)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaPlaylist::Clear
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaPlaylist::Clear(void)
+{
+ m_List->Apply(NPT_ObjectDeleter());
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaPlaylist::Clear
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaPlaylist::Queue(PLT_MediaItem* item)
+{
+ PLT_MediaItem* new_item = new PLT_MediaItem(*item);
+ m_List->Add(new_item);
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaPlaylist::Queue
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaPlaylist::Queue(PLT_MediaItemList* list)
+{
+ list->Apply(PLT_MediaItemQueueIterator(this));
+ return NPT_SUCCESS;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaPlaylist.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaPlaylist.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,85 @@
+/*****************************************************************
+|
+| Platinum - AV Media Playlist
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_PLAYLIST_H_
+#define _PLT_MEDIA_PLAYLIST_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltMediaItem.h"
+
+/*----------------------------------------------------------------------
+| typedefs
++---------------------------------------------------------------------*/
+typedef NPT_List PLT_MediaItemList;
+typedef NPT_Reference PLT_MediaItemListReference;
+
+/*----------------------------------------------------------------------
+| PLT_MediaPlaylist class
++---------------------------------------------------------------------*/
+class PLT_MediaPlaylist
+{
+public:
+ PLT_MediaPlaylist();
+ ~PLT_MediaPlaylist(void);
+
+ NPT_Result Clear();
+ NPT_Result Queue(PLT_MediaItem* item);
+ NPT_Result Queue(PLT_MediaItemList* list);
+ template
+ NPT_Result Apply(const X& function) {
+ return m_List->Apply(function);
+ }
+
+private:
+ PLT_MediaItemListReference m_List;
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaItemQueueIterator class
++---------------------------------------------------------------------*/
+class PLT_MediaItemQueueIterator
+{
+public:
+ PLT_MediaItemQueueIterator(PLT_MediaPlaylist* playlist) : m_Playlist(playlist) {}
+ NPT_Result operator()(PLT_MediaItem*& item) const {
+ return m_Playlist->Queue(item);
+ }
+
+private:
+ PLT_MediaPlaylist* m_Playlist;
+};
+
+#endif /* _PLT_MEDIA_PLAYLIST_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaServer.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,417 @@
+/*****************************************************************
+|
+| Platinum - AV Media Server Device
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltUPnP.h"
+#include "PltMediaServer.h"
+#include "PltMediaItem.h"
+#include "PltService.h"
+#include "PltTaskManager.h"
+#include "PltHttpServer.h"
+#include "PltDidl.h"
+#include "PltMetadataHandler.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server")
+
+/*----------------------------------------------------------------------
+| forward references
++---------------------------------------------------------------------*/
+extern NPT_UInt8 MS_ConnectionManagerSCPD[];
+extern NPT_UInt8 MS_ContentDirectorySCPD[];
+extern NPT_UInt8 MS_ContentDirectorywSearchSCPD[];
+
+const char* BrowseFlagsStr[] = {
+ "BrowseMetadata",
+ "BrowseDirectChildren"
+};
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::PLT_MediaServer
++---------------------------------------------------------------------*/
+PLT_MediaServer::PLT_MediaServer(const char* friendly_name,
+ bool show_ip /* = false */,
+ const char* uuid /* = NULL */,
+ NPT_UInt16 port /* = 0 */,
+ bool port_rebind /* = false */) :
+ PLT_DeviceHost("/DeviceDescription.xml",
+ uuid,
+ "urn:schemas-upnp-org:device:MediaServer:1",
+ friendly_name,
+ show_ip,
+ port,
+ port_rebind)
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::~PLT_MediaServer
++---------------------------------------------------------------------*/
+PLT_MediaServer::~PLT_MediaServer()
+{
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::SetupServices
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::SetupServices(PLT_DeviceData& data)
+{
+ PLT_Service* service;
+
+ {
+ service = new PLT_Service(
+ &data,
+ "urn:schemas-upnp-org:service:ContentDirectory:1",
+ "urn:upnp-org:serviceId:CDS_1-0");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ContentDirectorywSearchSCPD));
+ NPT_CHECK_FATAL(service->InitURLs("ContentDirectory", data.GetUUID()));
+ NPT_CHECK_FATAL(data.AddService(service));
+
+ service->SetStateVariable("ContainerUpdateIDs", "0");
+ service->SetStateVariableRate("ContainerUpdateIDs", NPT_TimeInterval(2, 0));
+ service->SetStateVariable("SystemUpdateID", "0");
+ service->SetStateVariableRate("SystemUpdateID", NPT_TimeInterval(2, 0));
+ service->SetStateVariable("SearchCapability", "upnp:class");
+ service->SetStateVariable("SortCapability", "");
+ }
+
+ {
+ service = new PLT_Service(
+ &data,
+ "urn:schemas-upnp-org:service:ConnectionManager:1",
+ "urn:upnp-org:serviceId:CMGR_1-0");
+ NPT_CHECK_FATAL(service->SetSCPDXML((const char*) MS_ConnectionManagerSCPD));
+ NPT_CHECK_FATAL(service->InitURLs("ConnectionManager", data.GetUUID()));
+ NPT_CHECK_FATAL(data.AddService(service));
+
+ service->SetStateVariable("CurrentConnectionIDs", "0");
+ service->SetStateVariable("SinkProtocolInfo", "");
+ service->SetStateVariable("SourceProtocolInfo", "http-get:*:*:*");
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnAction
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ /* parse the action name */
+ NPT_String name = action->GetActionDesc()->GetName();
+
+ // ContentDirectory
+ if (name.Compare("Browse", true) == 0) {
+ return OnBrowse(action, context);
+ }
+ if (name.Compare("Search", true) == 0) {
+ return OnSearch(action, context);
+ }
+ if (name.Compare("GetSystemUpdateID", true) == 0) {
+ return OnGetSystemUpdateID(action, context);
+ }
+ if (name.Compare("GetSortCapabilities", true) == 0) {
+ return OnGetSortCapabilities(action, context);
+ }
+ if (name.Compare("GetSearchCapabilities", true) == 0) {
+ return OnGetSearchCapabilities(action, context);
+ }
+
+ // ConnectionMananger
+ if (name.Compare("GetCurrentConnectionIDs", true) == 0) {
+ return OnGetCurrentConnectionIDs(action, context);
+ }
+ if (name.Compare("GetProtocolInfo", true) == 0) {
+ return OnGetProtocolInfo(action, context);
+ }
+ if (name.Compare("GetCurrentConnectionInfo", true) == 0) {
+ return OnGetCurrentConnectionInfo(action, context);
+ }
+
+ action->SetError(401,"No Such Action.");
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetCurrentConnectionIDs
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetCurrentConnectionIDs(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetProtocolInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetProtocolInfo(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetCurrentConnectionInfo
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetCurrentConnectionInfo(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ if (NPT_FAILED(action->VerifyArgumentValue("ConnectionID", "0"))) {
+ action->SetError(706,"No Such Connection.");
+ return NPT_FAILURE;
+ }
+
+ if (NPT_FAILED(action->SetArgumentValue("RcsID", "-1"))){
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("AVTransportID", "-1"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("ProtocolInfo", "http-get:*:*:*"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("PeerConnectionManager", "/"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("PeerConnectionID", "-1"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("Direction", "Output"))) {
+ return NPT_FAILURE;
+ }
+ if (NPT_FAILED(action->SetArgumentValue("Status", "Unknown"))) {
+ return NPT_FAILURE;
+ }
+
+ return NPT_SUCCESS;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetSortCapabilities
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetSortCapabilities(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetSearchCapabilities
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetSearchCapabilities(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnGetSystemUpdateID
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnGetSystemUpdateID(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ return action->SetArgumentsOutFromStateVariable();
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::GetBrowseFlag
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::GetBrowseFlag(const char* str, BrowseFlags& flag)
+{
+ if (NPT_String::Compare(str, BrowseFlagsStr[0], true) == 0) {
+ flag = BROWSEMETADATA;
+ return NPT_SUCCESS;
+ }
+ if (NPT_String::Compare(str, BrowseFlagsStr[1], true) == 0) {
+ flag = BROWSEDIRECTCHILDREN;
+ return NPT_SUCCESS;
+ }
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnBrowse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnBrowse(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_Result res;
+ NPT_String object_id;
+ NPT_String browse_flag_val;
+
+ if (NPT_FAILED(action->GetArgumentValue("ObjectId", object_id)) ||
+ NPT_FAILED(action->GetArgumentValue("BrowseFlag", browse_flag_val))) {
+ NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowse - invalid arguments.");
+ return NPT_SUCCESS;
+ }
+
+ /* we don't support sorting yet */
+// PLT_Argument* sortCritArg = action->GetArgument("SortCriteria");
+// if (sortCritArg != NULL) {
+// NPT_String sortCrit = sortCritArg->GetValue();
+// if (sortCrit.GetLength() > 0) {
+// /* error */
+// PLT_Log(PLT_LOG_LEVEL_1, "PLT_FileMediaServer::OnBrowse - SortCriteria not allowed.");
+// action->SetError(709, "MediaServer does not support sorting.");
+// return NPT_FAILURE;
+// }
+// }
+
+ /* extract flag */
+ BrowseFlags flag;
+ if (NPT_FAILED(GetBrowseFlag(browse_flag_val, flag))) {
+ /* error */
+ NPT_LOG_WARNING("PLT_FileMediaServer::OnBrowse - BrowseFlag value not allowed.");
+ action->SetError(402,"Invalid BrowseFlag arg.");
+ return NPT_SUCCESS;
+ }
+
+ NPT_LOG_FINE_2("PLT_FileMediaServer::On%s - id = %s",
+ (const char*)browse_flag_val,
+ (const char*)object_id);
+
+ /* Invoke the browse function */
+ if (flag == BROWSEMETADATA) {
+ res = OnBrowseMetadata(action, object_id, context);
+ } else {
+ res = OnBrowseDirectChildren(action, object_id, context);
+ }
+
+ if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) {
+ action->SetError(800, "Internal error");
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnSearch
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnSearch(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(context);
+
+ NPT_Result res;
+ NPT_String container_id;
+ NPT_String search_criteria;
+
+ NPT_CHECK_FATAL(action->GetArgumentValue("SearchCriteria", search_criteria));
+ NPT_CHECK_FATAL(action->GetArgumentValue("ContainerId", container_id));
+
+ NPT_LOG_FINE_1("PLT_FileMediaServer::OnSearch - id = %s", (const char*)container_id);
+
+ if(search_criteria.IsEmpty()) {
+ res = OnBrowseDirectChildren(action, container_id, context);
+ } else {
+ res = OnSearch(action, container_id, search_criteria, context);
+ }
+
+ if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) {
+ action->SetError(800, "Internal error");
+ }
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnBrowseMetadata
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(action);
+ NPT_COMPILER_UNUSED(object_id);
+ NPT_COMPILER_UNUSED(context);
+
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnBrowseDirectChildren
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(action);
+ NPT_COMPILER_UNUSED(object_id);
+ NPT_COMPILER_UNUSED(context);
+
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer::OnSearch
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_MediaServer::OnSearch(PLT_ActionReference& action,
+ const NPT_String& object_id,
+ const NPT_String& search_criteria,
+ const PLT_HttpRequestContext& context)
+{
+ NPT_COMPILER_UNUSED(action);
+ NPT_COMPILER_UNUSED(object_id);
+ NPT_COMPILER_UNUSED(search_criteria);
+ NPT_COMPILER_UNUSED(context);
+
+ return NPT_ERROR_NOT_IMPLEMENTED;
+}
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaServer.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaServer.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,116 @@
+/*****************************************************************
+|
+| Platinum - AV Media Server Device
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_MEDIA_SERVER_H_
+#define _PLT_MEDIA_SERVER_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltDeviceHost.h"
+#include "PltMediaItem.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+#define MAX_PATH_LENGTH 1024
+
+/* BrowseFlags */
+enum BrowseFlags {
+ BROWSEMETADATA,
+ BROWSEDIRECTCHILDREN
+};
+
+/*----------------------------------------------------------------------
+| forward declarations
++---------------------------------------------------------------------*/
+extern const char* BrowseFlagsStr[];
+class PLT_HttpFileServerHandler;
+
+/*----------------------------------------------------------------------
+| PLT_MediaServer class
++---------------------------------------------------------------------*/
+class PLT_MediaServer : public PLT_DeviceHost
+{
+public:
+ PLT_MediaServer(const char* friendly_name,
+ bool show_ip = false,
+ const char* uuid = NULL,
+ NPT_UInt16 port = 0,
+ bool port_rebind = false);
+ virtual ~PLT_MediaServer();
+
+ // PLT_DeviceHost methods
+ virtual NPT_Result SetupServices(PLT_DeviceData& data);
+ virtual NPT_Result OnAction(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+
+ // class methods
+ static NPT_Result GetBrowseFlag(const char* str, BrowseFlags& flag);
+
+protected:
+ // ConnectionManager
+ virtual NPT_Result OnGetCurrentConnectionIDs(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnGetProtocolInfo(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnGetCurrentConnectionInfo(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+
+ // ContentDirectory
+ virtual NPT_Result OnGetSortCapabilities(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnGetSearchCapabilities(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnGetSystemUpdateID(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnBrowse(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnSearch(PLT_ActionReference& action,
+ const PLT_HttpRequestContext& context);
+
+ // overridable methods
+ virtual NPT_Result OnBrowseMetadata(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnBrowseDirectChildren(PLT_ActionReference& action,
+ const char* object_id,
+ const PLT_HttpRequestContext& context);
+ virtual NPT_Result OnSearch(PLT_ActionReference& action,
+ const NPT_String& object_id,
+ const NPT_String& searchCriteria,
+ const PLT_HttpRequestContext& context);
+};
+
+#endif /* _PLT_MEDIA_SERVER_H_ */
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltMediaServerSCPDs.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltMediaServerSCPDs.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,899 @@
+/*****************************************************************
+|
+| Platinum - AV Media Server Device SCPDs
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptTypes.h"
+
+/*----------------------------------------------------------------------
+| globals
++---------------------------------------------------------------------*/
+NPT_UInt8 MS_ContentDirectorySCPD[4409] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A,
+ 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69,
+ 0x6E, 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x42,
+ 0x72, 0x6F, 0x77, 0x73, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4F, 0x62,
+ 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65,
+ 0x78, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6F, 0x75,
+ 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69,
+ 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E,
+ 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F,
+ 0x72, 0x74, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x72,
+ 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55,
+ 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x49, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61,
+ 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x65, 0x72,
+ 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
+ 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C,
+ 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77,
+ 0x73, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x43, 0x68, 0x69, 0x6C, 0x64, 0x72, 0x65, 0x6E, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+ 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+ 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
+ 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F,
+ 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F,
+ 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
+ 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72,
+ 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69,
+ 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75,
+ 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65,
+ 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x55, 0x70, 0x64,
+ 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+ 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F,
+ 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43,
+ 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+ 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74,
+ 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x3C,
+ 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
+};
+
+NPT_UInt8 MS_ConnectionManagerSCPD[5428] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x27, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65,
+ 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6D, 0x61, 0x6A,
+ 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72,
+ 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49,
+ 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41,
+ 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x56,
+ 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x41, 0x56, 0x54, 0x72, 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x50, 0x65, 0x65, 0x72, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61,
+ 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x50, 0x65, 0x65, 0x72, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+ 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61,
+ 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F,
+ 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x50, 0x72, 0x6F, 0x74, 0x6F,
+ 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F,
+ 0x75, 0x72, 0x63, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66,
+ 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x69, 0x6E, 0x6B, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x69, 0x6E, 0x6B, 0x50, 0x72, 0x6F, 0x74,
+ 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6E, 0x74, 0x43,
+ 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x65,
+ 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41,
+ 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+ 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x53, 0x74, 0x61, 0x74,
+ 0x75, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C,
+ 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73,
+ 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4F, 0x4B, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x43, 0x6F, 0x6E, 0x74, 0x65, 0x6E, 0x74, 0x46, 0x6F, 0x72, 0x6D, 0x61, 0x74, 0x4D, 0x69, 0x73, 0x6D,
+ 0x61, 0x74, 0x63, 0x68, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x49, 0x6E, 0x73, 0x75, 0x66, 0x66, 0x69, 0x63, 0x69,
+ 0x65, 0x6E, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x55,
+ 0x6E, 0x72, 0x65, 0x6C, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x43, 0x68, 0x61, 0x6E, 0x6E, 0x65, 0x6C, 0x3C, 0x2F, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C,
+ 0x75, 0x65, 0x3E, 0x55, 0x6E, 0x6B, 0x6E, 0x6F, 0x77, 0x6E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56,
+ 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x41, 0x56, 0x54, 0x72,
+ 0x61, 0x6E, 0x73, 0x70, 0x6F, 0x72, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x63, 0x73, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+ 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F,
+ 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x4D, 0x61, 0x6E, 0x61, 0x67, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27,
+ 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x75, 0x72, 0x63, 0x65, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49,
+ 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67,
+ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53,
+ 0x69, 0x6E, 0x6B, 0x50, 0x72, 0x6F, 0x74, 0x6F, 0x63, 0x6F, 0x6C, 0x49, 0x6E, 0x66, 0x6F, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74,
+ 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76,
+ 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x6E, 0x6F, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x49, 0x6E, 0x70, 0x75, 0x74, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75,
+ 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x4F, 0x75, 0x74, 0x70, 0x75, 0x74,
+ 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61,
+ 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x27, 0x79, 0x65, 0x73, 0x27, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x75, 0x72, 0x72,
+ 0x65, 0x6E, 0x74, 0x43, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x73, 0x65,
+ 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F,
+ 0x73, 0x63, 0x70, 0x64, 0x3E, 0x0D, 0x0A, 0x00
+};
+
+NPT_UInt8 MS_ContentDirectorywSearchSCPD[7058] =
+{
+ 0x3C, 0x3F, 0x78, 0x6D, 0x6C, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3D, 0x22, 0x31, 0x2E, 0x30, 0x22, 0x20,
+ 0x65, 0x6E, 0x63, 0x6F, 0x64, 0x69, 0x6E, 0x67, 0x3D, 0x22, 0x75, 0x74, 0x66, 0x2D, 0x38, 0x22, 0x3F, 0x3E, 0x0D, 0x0A,
+ 0x3C, 0x73, 0x63, 0x70, 0x64, 0x20, 0x78, 0x6D, 0x6C, 0x6E, 0x73, 0x3D, 0x22, 0x75, 0x72, 0x6E, 0x3A, 0x73, 0x63, 0x68,
+ 0x65, 0x6D, 0x61, 0x73, 0x2D, 0x75, 0x70, 0x6E, 0x70, 0x2D, 0x6F, 0x72, 0x67, 0x3A, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63,
+ 0x65, 0x2D, 0x31, 0x2D, 0x30, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x61, 0x6A, 0x6F, 0x72, 0x3E, 0x31, 0x3C, 0x2F, 0x6D, 0x61, 0x6A,
+ 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6D, 0x69, 0x6E, 0x6F, 0x72, 0x3E, 0x30, 0x3C, 0x2F, 0x6D, 0x69,
+ 0x6E, 0x6F, 0x72, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x70, 0x65, 0x63, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x42,
+ 0x72, 0x6F, 0x77, 0x73, 0x65, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x4F, 0x62,
+ 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64,
+ 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F,
+ 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C,
+ 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C,
+ 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65,
+ 0x78, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6F, 0x75,
+ 0x6E, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45,
+ 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69,
+ 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C,
+ 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65,
+ 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64,
+ 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E,
+ 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E,
+ 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61,
+ 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61,
+ 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F,
+ 0x72, 0x74, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x6F, 0x72,
+ 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F,
+ 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D,
+ 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55,
+ 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x49, 0x64, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65,
+ 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09,
+ 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x47, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61,
+ 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x09, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x09, 0x09, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74,
+ 0x69, 0x65, 0x73, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C,
+ 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x43, 0x6F, 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63,
+ 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x72,
+ 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E,
+ 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69,
+ 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x46, 0x69, 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F,
+ 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69, 0x6C,
+ 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65,
+ 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x74, 0x61, 0x72, 0x74, 0x69, 0x6E, 0x67, 0x49,
+ 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F,
+ 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C,
+ 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6F, 0x75, 0x6E, 0x74,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E,
+ 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61,
+ 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67,
+ 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x69, 0x6E, 0x3C, 0x2F, 0x64, 0x69,
+ 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69,
+ 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75,
+ 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C,
+ 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F,
+ 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C,
+ 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x4E, 0x75, 0x6D, 0x62, 0x65, 0x72, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6E, 0x65, 0x64, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74,
+ 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74,
+ 0x65, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x3C, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E,
+ 0x54, 0x6F, 0x74, 0x61, 0x6C, 0x4D, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50,
+ 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D,
+ 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x61, 0x72,
+ 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x55, 0x70, 0x64, 0x61, 0x74,
+ 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69,
+ 0x6F, 0x6E, 0x3E, 0x6F, 0x75, 0x74, 0x3C, 0x2F, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65, 0x64, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54,
+ 0x59, 0x50, 0x45, 0x5F, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x72, 0x65, 0x6C, 0x61, 0x74, 0x65,
+ 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x72, 0x67, 0x75, 0x6D,
+ 0x65, 0x6E, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3C, 0x2F,
+ 0x61, 0x72, 0x67, 0x75, 0x6D, 0x65, 0x6E, 0x74, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x3C, 0x2F, 0x61, 0x63, 0x74, 0x69, 0x6F, 0x6E, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x61, 0x63, 0x74,
+ 0x69, 0x6F, 0x6E, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53,
+ 0x74, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D,
+ 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52,
+ 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x46, 0x6C, 0x61, 0x67, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65,
+ 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x4D, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x3C, 0x2F, 0x61, 0x6C, 0x6C,
+ 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x09, 0x3C, 0x61, 0x6C,
+ 0x6C, 0x6F, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x42, 0x72, 0x6F, 0x77, 0x73, 0x65, 0x44, 0x69, 0x72,
+ 0x65, 0x63, 0x74, 0x43, 0x68, 0x69, 0x6C, 0x64, 0x72, 0x65, 0x6E, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65, 0x64,
+ 0x56, 0x61, 0x6C, 0x75, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x2F, 0x61, 0x6C, 0x6C, 0x6F, 0x77, 0x65,
+ 0x64, 0x56, 0x61, 0x6C, 0x75, 0x65, 0x4C, 0x69, 0x73, 0x74, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74,
+ 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73,
+ 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x43, 0x6F,
+ 0x6E, 0x74, 0x61, 0x69, 0x6E, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x73, 0x3C, 0x2F, 0x6E, 0x61,
+ 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73,
+ 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09,
+ 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64,
+ 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6D, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+ 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x43, 0x6F, 0x75, 0x6E, 0x74, 0x3C, 0x2F,
+ 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65,
+ 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+ 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x72, 0x69,
+ 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72,
+ 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59,
+ 0x50, 0x45, 0x5F, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x72, 0x69, 0x74, 0x65, 0x72, 0x69, 0x61, 0x3C, 0x2F, 0x6E,
+ 0x61, 0x6D, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73,
+ 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x20, 0x20, 0x20, 0x20,
+ 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73,
+ 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09,
+ 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x53, 0x6F, 0x72, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69,
+ 0x65, 0x73, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61,
+ 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x49, 0x6E, 0x64, 0x65, 0x78, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62,
+ 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C,
+ 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A,
+ 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F,
+ 0x4F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64,
+ 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65,
+ 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56,
+ 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22,
+ 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47,
+ 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x44, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65,
+ 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x75, 0x69, 0x34,
+ 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74,
+ 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61,
+ 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74,
+ 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F,
+ 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x52, 0x65, 0x73, 0x75, 0x6C, 0x74, 0x3C, 0x2F, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74,
+ 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20, 0x73, 0x65, 0x6E, 0x64, 0x45,
+ 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x6E, 0x61, 0x6D,
+ 0x65, 0x3E, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6C, 0x69, 0x74, 0x69, 0x65, 0x73,
+ 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79,
+ 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E,
+ 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65,
+ 0x3E, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6C, 0x65, 0x20,
+ 0x73, 0x65, 0x6E, 0x64, 0x45, 0x76, 0x65, 0x6E, 0x74, 0x73, 0x3D, 0x22, 0x6E, 0x6F, 0x22, 0x3E, 0x0D, 0x0A, 0x09, 0x09,
+ 0x09, 0x3C, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x41, 0x5F, 0x41, 0x52, 0x47, 0x5F, 0x54, 0x59, 0x50, 0x45, 0x5F, 0x46, 0x69,
+ 0x6C, 0x74, 0x65, 0x72, 0x3C, 0x2F, 0x6E, 0x61, 0x6D, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x09, 0x3C, 0x64, 0x61,
+ 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x3E, 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, 0x3C, 0x2F, 0x64, 0x61, 0x74, 0x61, 0x54,
+ 0x79, 0x70, 0x65, 0x3E, 0x20, 0x0D, 0x0A, 0x09, 0x09, 0x3C, 0x2F, 0x73, 0x74, 0x61, 0x74, 0x65, 0x56, 0x61, 0x72, 0x69,
+ 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x09, 0x3C, 0x2F, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61,
+ 0x74, 0x65, 0x54, 0x61, 0x62, 0x6C, 0x65, 0x3E, 0x0D, 0x0A, 0x3C, 0x2F, 0x73, 0x63, 0x70, 0x64, 0x3E, 0x00
+};
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.cpp Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,316 @@
+/*****************************************************************
+|
+| Platinum - Synchronous Media Browser
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "PltSyncMediaBrowser.h"
+
+NPT_SET_LOCAL_LOGGER("platinum.media.server.syncbrowser")
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::PLT_SyncMediaBrowser
++---------------------------------------------------------------------*/
+PLT_SyncMediaBrowser::PLT_SyncMediaBrowser(PLT_CtrlPointReference& ctrlPoint,
+ bool use_cache /* = false */,
+ PLT_MediaContainerChangesListener* listener /* = NULL */) :
+ PLT_MediaBrowser(ctrlPoint),
+ m_ContainerListener(listener),
+ m_UseCache(use_cache)
+{
+ SetDelegate(this);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::~PLT_SyncMediaBrowser
++---------------------------------------------------------------------*/
+PLT_SyncMediaBrowser::~PLT_SyncMediaBrowser()
+{
+}
+
+/* Blocks forever waiting for a response from a request
+ * It is expected the request to succeed or to timeout and return an error eventually
+ */
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::WaitForResponse
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::WaitForResponse(NPT_SharedVariable& shared_var)
+{
+ return shared_var.WaitUntilEquals(1, 30000);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnDeviceAdded
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::OnDeviceAdded(PLT_DeviceDataReference& device)
+{
+ NPT_String uuid = device->GetUUID();
+
+ // test if it's a media server
+ PLT_Service* service;
+ if (NPT_SUCCEEDED(device->FindServiceByType("urn:schemas-upnp-org:service:ContentDirectory:1", service))) {
+ NPT_AutoLock lock(m_MediaServers);
+ m_MediaServers.Put(uuid, device);
+ }
+
+ return PLT_MediaBrowser::OnDeviceAdded(device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnDeviceRemoved
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::OnDeviceRemoved(PLT_DeviceDataReference& device)
+{
+ NPT_String uuid = device->GetUUID();
+
+ // Remove from our list of servers first if found
+ {
+ NPT_AutoLock lock(m_MediaServers);
+ m_MediaServers.Erase(uuid);
+ }
+
+ // clear cache for that device
+ if (m_UseCache) m_Cache.Clear(device.AsPointer()->GetUUID());
+
+ return PLT_MediaBrowser::OnDeviceRemoved(device);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::Find
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::Find(const char* ip, PLT_DeviceDataReference& device)
+{
+ NPT_AutoLock lock(m_MediaServers);
+ const NPT_List::Iterator it =
+ m_MediaServers.GetEntries().Find(PLT_DeviceMapFinderByIp(ip));
+ if (it) {
+ device = (*it)->GetValue();
+ return NPT_SUCCESS;
+ }
+ return NPT_FAILURE;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnBrowseResult
++---------------------------------------------------------------------*/
+void
+PLT_SyncMediaBrowser::OnBrowseResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata)
+{
+ NPT_COMPILER_UNUSED(device);
+
+ if (!userdata) return;
+
+ PLT_BrowseDataReference* data = (PLT_BrowseDataReference*) userdata;
+ (*data)->res = res;
+ if (NPT_SUCCEEDED(res) && info) {
+ (*data)->info = *info;
+ }
+ (*data)->shared_var.SetValue(1);
+ delete data;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::OnMSStateVariablesChanged
++---------------------------------------------------------------------*/
+void
+PLT_SyncMediaBrowser::OnMSStateVariablesChanged(PLT_Service* service,
+ NPT_List* vars)
+{
+ NPT_AutoLock lock(m_MediaServers);
+
+ PLT_DeviceDataReference device;
+ const NPT_List::Iterator it =
+ m_MediaServers.GetEntries().Find(PLT_DeviceMapFinderByUUID(service->GetDevice()->GetUUID()));
+ if (!it) return; // device with this service has gone away
+
+ device = (*it)->GetValue();
+ PLT_StateVariable* var = PLT_StateVariable::Find(*vars, "ContainerUpdateIDs");
+ if (var) {
+ // variable found, parse value
+ NPT_String value = var->GetValue();
+ NPT_String item_id, update_id;
+ int index;
+
+ while (value.GetLength()) {
+ // look for container id
+ index = value.Find(',');
+ if (index < 0) break;
+ item_id = value.Left(index);
+ value = value.SubString(index+1);
+
+ // look for update id
+ if (value.GetLength()) {
+ index = value.Find(',');
+ update_id = (index<0)?value:value.Left(index);
+ value = (index<0)?"":value.SubString(index+1);
+
+ // clear cache for that device
+ if (m_UseCache) m_Cache.Clear(device->GetUUID(), item_id);
+
+ // notify listener
+ if (m_ContainerListener) m_ContainerListener->OnContainerChanged(device, item_id, update_id);
+ }
+ }
+ }
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::BrowseSync
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::BrowseSync(PLT_BrowseDataReference& browse_data,
+ PLT_DeviceDataReference& device,
+ const char* object_id,
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata,
+ const char* filter,
+ const char* sort)
+{
+ NPT_Result res;
+
+ browse_data->shared_var.SetValue(0);
+
+ // send off the browse packet. Note that this will
+ // not block. There is a call to WaitForResponse in order
+ // to block until the response comes back.
+ res = PLT_MediaBrowser::Browse(device,
+ (const char*)object_id,
+ index,
+ count,
+ browse_metadata,
+ filter,
+ sort,
+ new PLT_BrowseDataReference(browse_data));
+ NPT_CHECK_SEVERE(res);
+
+ return WaitForResponse(browse_data->shared_var);
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::BrowseSync
++---------------------------------------------------------------------*/
+NPT_Result
+PLT_SyncMediaBrowser::BrowseSync(PLT_DeviceDataReference& device,
+ const char* object_id,
+ PLT_MediaObjectListReference& list)
+{
+ NPT_Result res = NPT_FAILURE;
+ NPT_Int32 index = 0;
+
+ // reset output params
+ list = NULL;
+
+ // look into cache first
+ if (m_UseCache && NPT_SUCCEEDED(m_Cache.Get(device->GetUUID(), object_id, list))) return NPT_SUCCESS;
+
+ do {
+ PLT_BrowseDataReference browse_data(new PLT_BrowseData());
+
+ // send off the browse packet. Note that this will
+ // not block. There is a call to WaitForResponse in order
+ // to block until the response comes back.
+ res = BrowseSync(
+ browse_data,
+ device,
+ (const char*)object_id,
+ index,
+ 1024,
+ false,
+ "*",
+ "");
+ NPT_CHECK_LABEL_WARNING(res, done);
+
+ if (NPT_FAILED(browse_data->res)) {
+ res = browse_data->res;
+ NPT_CHECK_LABEL_WARNING(res, done);
+ }
+
+ if (browse_data->info.items->GetItemCount() == 0)
+ break;
+
+ if (list.IsNull()) {
+ list = browse_data->info.items;
+ } else {
+ list->Add(*browse_data->info.items);
+ // clear the list items so that the data inside is not
+ // cleaned up by PLT_MediaItemList dtor since we copied
+ // each pointer into the new list.
+ browse_data->info.items->Clear();
+ }
+
+ // stop now if our list contains exactly what the server said it had
+ if (browse_data->info.tm && browse_data->info.tm == list->GetItemCount())
+ break;
+
+ // ask for the next chunk of entries
+ index = list->GetItemCount();
+ } while(1);
+
+done:
+ // cache the result
+ if (m_UseCache && NPT_SUCCEEDED(res) && !list.IsNull() && list->GetItemCount()) {
+ m_Cache.Put(device->GetUUID(), object_id, list);
+ }
+
+ // clear entire cache data for device if failed, the device could be gone
+ if (NPT_FAILED(res) && m_UseCache) m_Cache.Clear(device->GetUUID());
+
+ return res;
+}
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser::IsCached
++---------------------------------------------------------------------*/
+bool
+PLT_SyncMediaBrowser::IsCached(const char* uuid, const char* object_id)
+{
+ NPT_AutoLock lock(m_MediaServers);
+ const NPT_List::Iterator it =
+ m_MediaServers.GetEntries().Find(PLT_DeviceMapFinderByUUID(uuid));
+ if (!it) {
+ m_Cache.Clear(uuid);
+ return false; // device with this service has gone away
+ }
+
+ PLT_MediaObjectListReference list;
+ return NPT_SUCCEEDED(m_Cache.Get(uuid, object_id, list))?true:false;
+}
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/Source/Devices/MediaServer/PltSyncMediaBrowser.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,165 @@
+/*****************************************************************
+|
+| Platinum - Synchronous Media Browser
+|
+| Copyright (c) 2004-2008, Plutinosoft, LLC.
+| All rights reserved.
+| http://www.plutinosoft.com
+|
+| This program is free software; you can redistribute it and/or
+| modify it under the terms of the GNU General Public License
+| as published by the Free Software Foundation; either version 2
+| of the License, or (at your option) any later version.
+|
+| OEMs, ISVs, VARs and other distributors that combine and
+| distribute commercially licensed software with Platinum software
+| and do not wish to distribute the source code for the commercially
+| licensed software under version 2, or (at your option) any later
+| version, of the GNU General Public License (the "GPL") must enter
+| into a commercial license agreement with Plutinosoft, LLC.
+|
+| This program is distributed in the hope that it will be useful,
+| but WITHOUT ANY WARRANTY; without even the implied warranty of
+| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+| GNU General Public License for more details.
+|
+| You should have received a copy of the GNU General Public License
+| along with this program; see the file LICENSE.txt. If not, write to
+| the Free Software Foundation, Inc.,
+| 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+| http://www.gnu.org/licenses/gpl-2.0.html
+|
+****************************************************************/
+
+#ifndef _PLT_SYNC_MEDIA_BROWSER_
+#define _PLT_SYNC_MEDIA_BROWSER_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "Neptune.h"
+#include "PltCtrlPoint.h"
+#include "PltMediaBrowser.h"
+#include "PltMediaCache.h"
+
+/*----------------------------------------------------------------------
+| types
++---------------------------------------------------------------------*/
+typedef NPT_Map PLT_DeviceMap;
+typedef NPT_Map::Entry PLT_DeviceMapEntry;
+
+typedef struct PLT_BrowseData {
+ NPT_SharedVariable shared_var;
+ NPT_Result res;
+ PLT_BrowseInfo info;
+} PLT_BrowseData;
+
+typedef NPT_Reference PLT_BrowseDataReference;
+
+/*----------------------------------------------------------------------
+| PLT_MediaContainerListener
++---------------------------------------------------------------------*/
+class PLT_MediaContainerChangesListener
+{
+public:
+ virtual ~PLT_MediaContainerChangesListener() {}
+ virtual void OnContainerChanged(PLT_DeviceDataReference& device,
+ const char* item_id,
+ const char* update_id) = 0;
+};
+
+/*----------------------------------------------------------------------
+| PLT_SyncMediaBrowser
++---------------------------------------------------------------------*/
+class PLT_SyncMediaBrowser : public PLT_MediaBrowser,
+ public PLT_MediaBrowserDelegate
+{
+public:
+ PLT_SyncMediaBrowser(PLT_CtrlPointReference& ctrlPoint,
+ bool use_cache = false,
+ PLT_MediaContainerChangesListener* listener = NULL);
+ virtual ~PLT_SyncMediaBrowser();
+
+ // PLT_MediaBrowser methods
+ virtual NPT_Result OnDeviceAdded(PLT_DeviceDataReference& device);
+ virtual NPT_Result OnDeviceRemoved(PLT_DeviceDataReference& device);
+
+ // PLT_MediaBrowserDelegate methods
+ virtual void OnMSStateVariablesChanged(PLT_Service* service,
+ NPT_List* vars);
+ virtual void OnBrowseResult(NPT_Result res,
+ PLT_DeviceDataReference& device,
+ PLT_BrowseInfo* info,
+ void* userdata);
+
+ // methods
+ void SetContainerListener(PLT_MediaContainerChangesListener* listener) {
+ m_ContainerListener = listener;
+ }
+ NPT_Result BrowseSync(PLT_DeviceDataReference& device,
+ const char* id,
+ PLT_MediaObjectListReference& list);
+
+ const NPT_Lock& GetMediaServersMap() const { return m_MediaServers; }
+ bool IsCached(const char* uuid, const char* object_id);
+
+protected:
+ NPT_Result BrowseSync(PLT_BrowseDataReference& browse_data,
+ PLT_DeviceDataReference& device,
+ const char* object_id,
+ NPT_Int32 index,
+ NPT_Int32 count,
+ bool browse_metadata = false,
+ const char* filter = "*",
+ const char* sort = "");
+private:
+ NPT_Result Find(const char* ip, PLT_DeviceDataReference& device);
+ NPT_Result WaitForResponse(NPT_SharedVariable& shared_var);
+
+private:
+ NPT_Lock m_MediaServers;
+ PLT_MediaContainerChangesListener* m_ContainerListener;
+ bool m_UseCache;
+ PLT_MediaCache m_Cache;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceMapFinderByIp
++---------------------------------------------------------------------*/
+class PLT_DeviceMapFinderByIp
+{
+public:
+ // methods
+ PLT_DeviceMapFinderByIp(const char* ip) : m_IP(ip) {}
+
+ bool operator()(const PLT_DeviceMapEntry* const& entry) const {
+ PLT_DeviceDataReference device = entry->GetValue();
+ return (device->GetURLBase().GetHost() == m_IP);
+ }
+
+private:
+ // members
+ NPT_String m_IP;
+};
+
+/*----------------------------------------------------------------------
+| PLT_DeviceFinderByUUID
++---------------------------------------------------------------------*/
+class PLT_DeviceMapFinderByUUID
+{
+public:
+ // methods
+ PLT_DeviceMapFinderByUUID(const char* uuid) : m_UUID(uuid) {}
+
+ bool operator()(const PLT_DeviceMapEntry* const& entry) const {
+ PLT_DeviceDataReference device = entry->GetValue();
+ return device->GetUUID() == m_UUID;
+ }
+
+private:
+ // members
+ NPT_String m_UUID;
+};
+
+#endif /* _PLT_SYNC_MEDIA_BROWSER_ */
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/ThirdParty/Neptune/Build/Targets/x86-microsoft-win32-vs2008/Neptune.sln
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/ThirdParty/Neptune/Build/Targets/x86-microsoft-win32-vs2008/Neptune.sln Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,199 @@
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual C++ Express 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Neptune", "Neptune\Neptune.vcproj", "{12AFF2E5-6D95-4809-9728-9551677C078A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XmlTest1", "XmlTest1\XmlTest1.vcproj", "{21C242CD-B371-4970-94BE-7ED2522872BA}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetPump", "NetPump\NetPump.vcproj", "{0B04D92B-B644-4AED-90C6-A24303C78658}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StringsTest1", "StringsTest1\StringsTest1.vcproj", "{569179D6-7767-4840-9708-D1ADAFB012DB}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MessagesTest1", "MessagesTest1\MessagesTest1.vcproj", "{40A4B71C-5481-4A70-8216-E7AE6E431313}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MessagesTest2", "MessagesTest2\MessagesTest2.vcproj", "{B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetConfig", "NetConfig\NetConfig.vcproj", "{0E80CEA0-5817-4B9C-B2D8-733D955A7673}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RingBufferTest1", "RingBufferTest1\RingBufferTest1.vcproj", "{59C1FCBE-7987-41F2-A0EB-E0114D5B2972}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetEcho", "NetEcho\NetEcho.vcproj", "{7228CB90-1ACE-43A3-A013-D437BF0E50F3}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetPing", "NetPing\NetPing.vcproj", "{9C1CAC88-8D92-4743-8330-CE8E7836D3BF}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UdpTest1", "UdpTest1\UdpTest1.vcproj", "{C025608F-9193-4040-B2F8-941746648CE2}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ArraysTest1", "ArraysTest1\ArraysTest1.vcproj", "{0978344F-DBD7-4B3E-809C-5E58FB1FFD43}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BufferedStreamsTest1", "BufferedStreamsTest1\BufferedStreamsTest1.vcproj", "{F85C32FD-20B2-4066-B1B0-CE43A7BAA988}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HttpClientTest1", "HttpClientTest1\HttpClientTest1.vcproj", "{589435E9-3451-45B0-83BD-E5FD0D875CBB}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ListsTest1", "ListsTest1\ListsTest1.vcproj", "{AB6911DF-1EB4-4D37-B4A5-AD577761C188}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MiscTest1", "MiscTest1\MiscTest1.vcproj", "{85255DB0-110B-460E-8AC9-406516F790BB}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HttpServerTest1", "HttpServerTest1\HttpServerTest1.vcproj", "{77FD5430-1AB3-414A-BE15-E63D38F1A5FC}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UrlTest1", "UrlTest1\UrlTest1.vcproj", "{DBC6965C-D575-4DBC-9A0A-E6D9D9674282}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MapsTest1", "MapsTest1\MapsTest1.vcproj", "{257C9F75-2708-4136-BFA9-621ACD0B9BD1}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ThreadsTest1", "ThreadsTest1\ThreadsTest1.vcproj", "{D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LoggingTest1", "LoggingTest1\LoggingTest1.vcproj", "{6A729FAF-D757-4699-8BB4-CF48B2F4BC20}"
+ ProjectSection(ProjectDependencies) = postProject
+ {12AFF2E5-6D95-4809-9728-9551677C078A} = {12AFF2E5-6D95-4809-9728-9551677C078A}
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Debug|Win32.Build.0 = Debug|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Release|Win32.ActiveCfg = Release|Win32
+ {12AFF2E5-6D95-4809-9728-9551677C078A}.Release|Win32.Build.0 = Release|Win32
+ {21C242CD-B371-4970-94BE-7ED2522872BA}.Debug|Win32.ActiveCfg = Debug|Win32
+ {21C242CD-B371-4970-94BE-7ED2522872BA}.Debug|Win32.Build.0 = Debug|Win32
+ {21C242CD-B371-4970-94BE-7ED2522872BA}.Release|Win32.ActiveCfg = Release|Win32
+ {21C242CD-B371-4970-94BE-7ED2522872BA}.Release|Win32.Build.0 = Release|Win32
+ {0B04D92B-B644-4AED-90C6-A24303C78658}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0B04D92B-B644-4AED-90C6-A24303C78658}.Debug|Win32.Build.0 = Debug|Win32
+ {0B04D92B-B644-4AED-90C6-A24303C78658}.Release|Win32.ActiveCfg = Release|Win32
+ {0B04D92B-B644-4AED-90C6-A24303C78658}.Release|Win32.Build.0 = Release|Win32
+ {569179D6-7767-4840-9708-D1ADAFB012DB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {569179D6-7767-4840-9708-D1ADAFB012DB}.Debug|Win32.Build.0 = Debug|Win32
+ {569179D6-7767-4840-9708-D1ADAFB012DB}.Release|Win32.ActiveCfg = Release|Win32
+ {569179D6-7767-4840-9708-D1ADAFB012DB}.Release|Win32.Build.0 = Release|Win32
+ {40A4B71C-5481-4A70-8216-E7AE6E431313}.Debug|Win32.ActiveCfg = Debug|Win32
+ {40A4B71C-5481-4A70-8216-E7AE6E431313}.Debug|Win32.Build.0 = Debug|Win32
+ {40A4B71C-5481-4A70-8216-E7AE6E431313}.Release|Win32.ActiveCfg = Release|Win32
+ {40A4B71C-5481-4A70-8216-E7AE6E431313}.Release|Win32.Build.0 = Release|Win32
+ {B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}.Debug|Win32.Build.0 = Debug|Win32
+ {B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}.Release|Win32.ActiveCfg = Release|Win32
+ {B6D74CB4-CAB6-40E4-A5DB-BC54A8038FBD}.Release|Win32.Build.0 = Release|Win32
+ {0E80CEA0-5817-4B9C-B2D8-733D955A7673}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0E80CEA0-5817-4B9C-B2D8-733D955A7673}.Debug|Win32.Build.0 = Debug|Win32
+ {0E80CEA0-5817-4B9C-B2D8-733D955A7673}.Release|Win32.ActiveCfg = Release|Win32
+ {0E80CEA0-5817-4B9C-B2D8-733D955A7673}.Release|Win32.Build.0 = Release|Win32
+ {59C1FCBE-7987-41F2-A0EB-E0114D5B2972}.Debug|Win32.ActiveCfg = Debug|Win32
+ {59C1FCBE-7987-41F2-A0EB-E0114D5B2972}.Debug|Win32.Build.0 = Debug|Win32
+ {59C1FCBE-7987-41F2-A0EB-E0114D5B2972}.Release|Win32.ActiveCfg = Release|Win32
+ {59C1FCBE-7987-41F2-A0EB-E0114D5B2972}.Release|Win32.Build.0 = Release|Win32
+ {7228CB90-1ACE-43A3-A013-D437BF0E50F3}.Debug|Win32.ActiveCfg = Debug|Win32
+ {7228CB90-1ACE-43A3-A013-D437BF0E50F3}.Debug|Win32.Build.0 = Debug|Win32
+ {7228CB90-1ACE-43A3-A013-D437BF0E50F3}.Release|Win32.ActiveCfg = Release|Win32
+ {7228CB90-1ACE-43A3-A013-D437BF0E50F3}.Release|Win32.Build.0 = Release|Win32
+ {9C1CAC88-8D92-4743-8330-CE8E7836D3BF}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9C1CAC88-8D92-4743-8330-CE8E7836D3BF}.Debug|Win32.Build.0 = Debug|Win32
+ {9C1CAC88-8D92-4743-8330-CE8E7836D3BF}.Release|Win32.ActiveCfg = Release|Win32
+ {9C1CAC88-8D92-4743-8330-CE8E7836D3BF}.Release|Win32.Build.0 = Release|Win32
+ {C025608F-9193-4040-B2F8-941746648CE2}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C025608F-9193-4040-B2F8-941746648CE2}.Debug|Win32.Build.0 = Debug|Win32
+ {C025608F-9193-4040-B2F8-941746648CE2}.Release|Win32.ActiveCfg = Release|Win32
+ {C025608F-9193-4040-B2F8-941746648CE2}.Release|Win32.Build.0 = Release|Win32
+ {0978344F-DBD7-4B3E-809C-5E58FB1FFD43}.Debug|Win32.ActiveCfg = Debug|Win32
+ {0978344F-DBD7-4B3E-809C-5E58FB1FFD43}.Debug|Win32.Build.0 = Debug|Win32
+ {0978344F-DBD7-4B3E-809C-5E58FB1FFD43}.Release|Win32.ActiveCfg = Release|Win32
+ {0978344F-DBD7-4B3E-809C-5E58FB1FFD43}.Release|Win32.Build.0 = Release|Win32
+ {F85C32FD-20B2-4066-B1B0-CE43A7BAA988}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F85C32FD-20B2-4066-B1B0-CE43A7BAA988}.Debug|Win32.Build.0 = Debug|Win32
+ {F85C32FD-20B2-4066-B1B0-CE43A7BAA988}.Release|Win32.ActiveCfg = Release|Win32
+ {F85C32FD-20B2-4066-B1B0-CE43A7BAA988}.Release|Win32.Build.0 = Release|Win32
+ {589435E9-3451-45B0-83BD-E5FD0D875CBB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {589435E9-3451-45B0-83BD-E5FD0D875CBB}.Debug|Win32.Build.0 = Debug|Win32
+ {589435E9-3451-45B0-83BD-E5FD0D875CBB}.Release|Win32.ActiveCfg = Release|Win32
+ {589435E9-3451-45B0-83BD-E5FD0D875CBB}.Release|Win32.Build.0 = Release|Win32
+ {AB6911DF-1EB4-4D37-B4A5-AD577761C188}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AB6911DF-1EB4-4D37-B4A5-AD577761C188}.Debug|Win32.Build.0 = Debug|Win32
+ {AB6911DF-1EB4-4D37-B4A5-AD577761C188}.Release|Win32.ActiveCfg = Release|Win32
+ {AB6911DF-1EB4-4D37-B4A5-AD577761C188}.Release|Win32.Build.0 = Release|Win32
+ {85255DB0-110B-460E-8AC9-406516F790BB}.Debug|Win32.ActiveCfg = Debug|Win32
+ {85255DB0-110B-460E-8AC9-406516F790BB}.Debug|Win32.Build.0 = Debug|Win32
+ {85255DB0-110B-460E-8AC9-406516F790BB}.Release|Win32.ActiveCfg = Release|Win32
+ {85255DB0-110B-460E-8AC9-406516F790BB}.Release|Win32.Build.0 = Release|Win32
+ {77FD5430-1AB3-414A-BE15-E63D38F1A5FC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {77FD5430-1AB3-414A-BE15-E63D38F1A5FC}.Debug|Win32.Build.0 = Debug|Win32
+ {77FD5430-1AB3-414A-BE15-E63D38F1A5FC}.Release|Win32.ActiveCfg = Release|Win32
+ {77FD5430-1AB3-414A-BE15-E63D38F1A5FC}.Release|Win32.Build.0 = Release|Win32
+ {DBC6965C-D575-4DBC-9A0A-E6D9D9674282}.Debug|Win32.ActiveCfg = Debug|Win32
+ {DBC6965C-D575-4DBC-9A0A-E6D9D9674282}.Debug|Win32.Build.0 = Debug|Win32
+ {DBC6965C-D575-4DBC-9A0A-E6D9D9674282}.Release|Win32.ActiveCfg = Release|Win32
+ {DBC6965C-D575-4DBC-9A0A-E6D9D9674282}.Release|Win32.Build.0 = Release|Win32
+ {257C9F75-2708-4136-BFA9-621ACD0B9BD1}.Debug|Win32.ActiveCfg = Debug|Win32
+ {257C9F75-2708-4136-BFA9-621ACD0B9BD1}.Debug|Win32.Build.0 = Debug|Win32
+ {257C9F75-2708-4136-BFA9-621ACD0B9BD1}.Release|Win32.ActiveCfg = Release|Win32
+ {257C9F75-2708-4136-BFA9-621ACD0B9BD1}.Release|Win32.Build.0 = Release|Win32
+ {D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}.Debug|Win32.ActiveCfg = Debug|Win32
+ {D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}.Debug|Win32.Build.0 = Debug|Win32
+ {D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}.Release|Win32.ActiveCfg = Release|Win32
+ {D1355CEF-E9CF-4FDF-A48F-69ACBE5622DC}.Release|Win32.Build.0 = Release|Win32
+ {6A729FAF-D757-4699-8BB4-CF48B2F4BC20}.Debug|Win32.ActiveCfg = Debug|Win32
+ {6A729FAF-D757-4699-8BB4-CF48B2F4BC20}.Debug|Win32.Build.0 = Debug|Win32
+ {6A729FAF-D757-4699-8BB4-CF48B2F4BC20}.Release|Win32.ActiveCfg = Release|Win32
+ {6A729FAF-D757-4699-8BB4-CF48B2F4BC20}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/ThirdParty/Neptune/Build/Targets/x86-microsoft-win32-vs2008/Neptune/Neptune.vcproj
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/ThirdParty/Neptune/Build/Targets/x86-microsoft-win32-vs2008/Neptune/Neptune.vcproj Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,508 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/ThirdParty/Neptune/README.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/ThirdParty/Neptune/README.txt Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,29 @@
+Neptune C++ Runtime System
+--------------------------
+
+This software is provided under the following license:
+
+* Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions are met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+* * Neither the name of the nor the
+* names of its contributors may be used to endorse or promote products
+* derived from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+* DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/ThirdParty/Neptune/Source/Core/Neptune.cpp
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/ThirdParty/Neptune/Source/Core/Neptune.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/ThirdParty/Neptune/Source/Core/Neptune.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,83 @@
+/*****************************************************************
+|
+| Neptune - Toplevel Include
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+ ****************************************************************/
+
+#ifndef _NEPTUNE_H_
+#define _NEPTUNE_H_
+
+/*----------------------------------------------------------------------
+| flags
++---------------------------------------------------------------------*/
+#define NPT_EXTERNAL_USE /* do not expose internal definitions */
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#include "NptCommon.h"
+#include "NptResults.h"
+#include "NptTypes.h"
+#include "NptConstants.h"
+#include "NptReferences.h"
+#include "NptStreams.h"
+#include "NptBufferedStreams.h"
+#include "NptFile.h"
+#include "NptNetwork.h"
+#include "NptSockets.h"
+#include "NptTime.h"
+#include "NptThreads.h"
+#include "NptSystem.h"
+#include "NptMessaging.h"
+#include "NptQueue.h"
+#include "NptSimpleMessageQueue.h"
+#include "NptSelectableMessageQueue.h"
+#include "NptXml.h"
+#include "NptStrings.h"
+#include "NptArray.h"
+#include "NptList.h"
+#include "NptMap.h"
+#include "NptStack.h"
+#include "NptUri.h"
+#include "NptHttp.h"
+#include "NptDataBuffer.h"
+#include "NptUtils.h"
+#include "NptRingBuffer.h"
+#include "NptBase64.h"
+#include "NptConsole.h"
+#include "NptLogging.h"
+#include "NptSerialPort.h"
+#include "NptVersion.h"
+#include "NptDynamicLibraries.h"
+
+// optional modules
+#include "NptZip.h"
+#include "NptTls.h"
+
+#endif // _NEPTUNE_H_
diff -r 000000000000 -r 3425707ddbf6 deps/Platinum/ThirdParty/Neptune/Source/Core/NptArray.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deps/Platinum/ThirdParty/Neptune/Source/Core/NptArray.h Mon Jul 06 08:06:28 2009 -0700
@@ -0,0 +1,522 @@
+/*****************************************************************
+|
+| Neptune - Arrays
+|
+| Copyright (c) 2002-2008, Axiomatic Systems, LLC.
+| All rights reserved.
+|
+| Redistribution and use in source and binary forms, with or without
+| modification, are permitted provided that the following conditions are met:
+| * Redistributions of source code must retain the above copyright
+| notice, this list of conditions and the following disclaimer.
+| * Redistributions in binary form must reproduce the above copyright
+| notice, this list of conditions and the following disclaimer in the
+| documentation and/or other materials provided with the distribution.
+| * Neither the name of Axiomatic Systems nor the
+| names of its contributors may be used to endorse or promote products
+| derived from this software without specific prior written permission.
+|
+| THIS SOFTWARE IS PROVIDED BY AXIOMATIC SYSTEMS ''AS IS'' AND ANY
+| EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+| DISCLAIMED. IN NO EVENT SHALL AXIOMATIC SYSTEMS BE LIABLE FOR ANY
+| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+|
+****************************************************************/
+
+#ifndef _NPT_ARRAY_H_
+#define _NPT_ARRAY_H_
+
+/*----------------------------------------------------------------------
+| includes
++---------------------------------------------------------------------*/
+#include "NptConfig.h"
+#if defined(NPT_CONFIG_HAVE_NEW_H)
+#include
+#endif
+#include "NptTypes.h"
+#include "NptResults.h"
+
+/*----------------------------------------------------------------------
+| constants
++---------------------------------------------------------------------*/
+const int NPT_ARRAY_INITIAL_MAX_SIZE = 128; // bytes
+
+/*----------------------------------------------------------------------
+| NPT_Array
++---------------------------------------------------------------------*/
+template
+class NPT_Array
+{
+public:
+ // types
+ typedef T Element;
+ typedef T* Iterator;
+
+ // methods
+ NPT_Array(): m_Capacity(0), m_ItemCount(0), m_Items(0) {}
+ explicit NPT_Array(NPT_Cardinal count);
+ NPT_Array(NPT_Cardinal count, const T& item);
+ NPT_Array(const T* items, NPT_Cardinal item_count);
+ ~NPT_Array();
+ NPT_Array(const NPT_Array& copy);
+ NPT_Array& operator=(const NPT_Array& copy);
+ bool operator==(const NPT_Array& other) const;
+ bool operator!=(const NPT_Array